多表连接查询
数据表的连接查询比较常用的有内连接和外连接查询两种。
- 内连接
通过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;
注意:两种方式都能实现内连接,建议使用第二种:小表连接大表。查询效率高。
- 外连接
外连接分为两种:左连接和有右连接
左连查询和右连查询的区别是:以执行语句中的哪个表为主表,所谓主表即以主表为准,主表中有的数据才显示,主表中没有的数据即使附表中有也不显示在结果中!
左连接
select c_name,ct_name from commodity left join commoditytype on c_type=ct_id and ct_name='玩具';
右连接
select c_name,ct_name from commodity right join commoditytype on c_type=ct_id and ct_name='玩具';
内外、左右连接查询的区别:
- 子查询
(1)单行单列
子连接:查询name为玩具的值
select c_name from commodity where c_type =(
select ct_id from commoditytype where ct_name='玩具');
(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='文具');
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)不宜过多添加索引,注意:每添加一条索引都会占用磁盘空间。