mysql之知识点与细节(二)

2014-11-24 14:13:53 · 作者: · 浏览: 1
8. union 把两次或多次查询结果合并起来
两次查询的列数一致 ,对应列的类型一致
列名不一致时,取第一个sql的列名
如果不同的语句中取出的行的值相同,那么相同的行将会合并(去重复),如果不去重用union all来指定
如果子句中有order by,limit 子句必须加(),
select * from ta union all select * from tb;
取第四栏目商品,价格降序排列,还想取第五栏目商品,价格也按降序排列
(select goods_id,cat_id,goods_name,shop_price from goods where cat_id=4 order by shop_price desc) union (select goods_id,cat_id,goods_name,shop_price from goods where cat_id=5 order by shop_price desc); www.2cto.com
推荐放到所有子句之后,即:对最终合并的结果来排序
( select goods_id,cat_id,goods_name,shop_price from goods where cat_id=4 order by shop_price desc) union (select goods_id,cat_id,goods_name,shop_price from goods where cat_id=5 order by shop_price desc);
9. 连接查询
左连接:
select column1,column2,columnN from ta left join tb on ta列=tb列[此处表连接成一张大表,完全当成普通的表看]
where group,having....照常写
右连接:
select column1,column2,columnN from ta right join tb on ta列=tb列[此处表连接成一张大表,完全当成普通的表看] www.2cto.com
where group,having....照常写
内连接:
select column1,column2,columnN from ta inner join tb on ta列=tb列[此处表连接成一张大表,完全当成普通的表看]
where group,having....照常写
左连接以左表为准,去右表找匹配数据,没有匹配的列用null补齐,有多个的均列出
如有下两表:


select boy.*,girl.* from boy left join girl on boy.flower=girl.flower;
结果:


左右连接可以相互转化,推荐用左连接, 数据库移植方便 www.2cto.com
内连接:查询左右表都有的数据(左右连接的交集) 选取都有配对的组合

左或右连接查询实际上是指定以哪个表的数据为准,而默认(不指定左右连接)是以两个表中都存在的列数据为准,也就是inner join
mysql不支持外连接 outer join 即左右连接的并集
当多个表中都有的字段要指明哪个表中的字段
三个表连接查询 brand,goods,category
select g.goods_id,cat_name,g.brand_id,brand_name,goods_name from goods g left join brand b on b.brand_id=g.brand_id left join category c on g.cat_id=c.cat_id;
作者 ljfbest