多表连接查询

数据表的连接查询比较常用的有内连接和外连接查询两种。

  • 内连接
    通过inner join … on 关键字实现的
第一种:select * from commodity inner join commoditytype on c_type=ct_id;
第二种:select * from commoditytype inner join commodity on ct_id=c_type;

by多表关联 group mysql mysql多表关联技巧_数据库


by多表关联 group mysql mysql多表关联技巧_MySQL_02


注意:两种方式都能实现内连接,建议使用第二种:小表连接大表。查询效率高。

  • 外连接
    外连接分为两种:左连接和有右连接
    左连查询和右连查询的区别是:以执行语句中的哪个表为主表,所谓主表即以主表为准,主表中有的数据才显示,主表中没有的数据即使附表中有也不显示在结果中!
    左连接
select c_name,ct_name from commodity left join commoditytype on c_type=ct_id and ct_name='玩具';

by多表关联 group mysql mysql多表关联技巧_数据库_03


右连接

select c_name,ct_name from commodity right join commoditytype on c_type=ct_id and ct_name='玩具';

by多表关联 group mysql mysql多表关联技巧_MySQL_04


内外、左右连接查询的区别:

by多表关联 group mysql mysql多表关联技巧_多表连接查询_05

  • 子查询
    (1)单行单列

子连接:查询name为玩具的值

select c_name from commodity where c_type =(
select ct_id from commoditytype where ct_name='玩具');

by多表关联 group mysql mysql多表关联技巧_事务处理_06


(2)单行多列

这个基本不用到。

select * from table_a where (sal,name) = (
select sal,name from table_b where name = 'TomCat'
);//查询结果在返回字段结果内的

(3)单列多行
查询出文具或玩具商品

select c_name from commodity where c_type in (
select ct_id from commoditytype where ct_name='玩具' or ct_name='文具');

by多表关联 group mysql mysql多表关联技巧_事务处理_07

select * from table_a where sal NOT IN (select sal from 
table_b;); //查询结果不在返回字段结果内的
select * from table_a where sal >=ANY (select sal from 
table_b;); //查询结果在返回字段结果内任意满足(如果是数字的话只要大于等于最小的那个即可)
select * from table_a where sal >=ALL (select sal from 
table_b;); //查询结果在返回字段结果内全部满足(如果是数字的话必须大于等于最大的那个数字)

MySQL的数据处理

  • 数据的ACDI原则
    (1)原子性(atomic)
    (2)一致性(consist)
    (3)隔离性(isolated)
    (4)持久性(durable)
  • 事物的实现方法
set autocommit =0;//关闭MYSQL的自动提交
start transaction;//开始一个事物,标记事物的起始点
delete from `order`;//注意删除表时,应先删除子表;再删除父表。
delete from customer;
commit|rollback;//提交一个事物给数据库|将事物回滚,所有commit中的操作将被取消
set autocommit=1;//还原MySQL数据库的自动提交

数据库索引

记住两点:
(1)提高查询速度
(2)索引不是越多越好

  • 主键索引(primary key)
  • 唯一索引(unique)
  • 常规索引(index)
  • 全文索引(fulltext)
    问题:
    什么时候需要添加索引?
    (1)在where,order by 子句中经常使用的字段。
    (2)字段的值是多个(例如性别字段则不适合)。
    (3)字段内容不是经常变化的,注意:经常变化的字段,添加索引反而降低性能。
    (4)不宜过多添加索引,注意:每添加一条索引都会占用磁盘空间。