查询多张表是如果出现同名的列,需要将表名标注到列名前面
非同名的列,表名可以不加,推荐加上
可为表添加别名
一般取首字母,特殊下取所代表的含义
表的别名只在本次查询中生效
如果表与表进行关联查询时:不添加关联条件,查询的总记录数是a*b=笛卡尔积
多表查询的时候必须要加条件
等值
非等值
-- 将user表与class表通过 uid 进行等值关联查询 select user.name, user.uid,class.grade,class.uid from user, class where user.uid=class.uid; -- 添加别名 select u.name,u.uid,c.grade,c.uid from user u, class c where u.uid=c.uid;
-- 判断成绩优秀等级 SELECT * FROM classes c, leveled l WHERE c.grade BETWEEN l.low AND l.high;
表的关联条件和业务查询条件混为一起,新版本语法进行优化:
自动选择列名相同并且类型相同的列
-- 92语法 select u.uname,d.dname from uuser u, cclass c where u.uid=c.uid and c.grade > 70 -- 99语法 select u.name,d.dname from uuser u natural join cclass c where c.grade > 70;
可以指定等值连接的列
-- 指定uid为等值列,进行表的连接 select u.name,c.name from uuser u join cclass c using(uid) where c.grade > 70;
指定两张表关联的条件,可以是非等值的操作,也可以是等值连接
-- 使用on() 进行非等值连接 select * from uuser u join llevel l on(u.uid BETWEEN l.low and l.high);
两张表进行关联查询时,由于数据的原因,导致其中一张表中的数据无法完全查询出来
外连接可以让没查询出来的数据也显示出来
左外连接:显示左边表所有的数据
右外连接:显示右边表所有的数据
-- 统计每个班级的人数 -- 左连接 select * from uuser u left join cclass c using(uid); -- 右连接 select * from cclass c right join uuser u using(uid);
1. 将多条查询语句的结果拼接在一起
2. 将去掉重复的查询结果
3. UNION ALL 可以显示重复的查询结果
-- 全连接 select u.name, c.name from uuser u left join cclass c using(uid); union select u.name, c.name from uuser u right join cclass c using(uid);
查询的两个字段同时处于一张表上,只能将一张表当作含有不同意义的两张表处理
给相同的表取不同的简称
-- 学生,老师都在一张表中 -- 查询每个学生的与其老师的名字及ID select u.uid,u.name,uu.uid,uu.name from user u join user uu on(u.teach = uu.uid);
把一个SQL语句的查询结果,作为另一个SQL语句的查询条件
子链接往往查询结果只为一列,(多列时使用伪表)
ALL:低于查询中的所有数据
SOME/ANY:低于查询中的部分数据
IN:处于查询中的数据
所需要的查询条件 需要别的SQL语句提供
需要多个查询条件,就要将所有的查询结果当作伪表进行管理
需要把一些含有特殊符号的列名设置别名,然后给伪表设置一个别名