1 连接查询
在查询数据时,需要多张表的数据一起显示,这就用到连接查询
1.1 内联查询
可以连接多个表进行查询,按照指定条件将从左表查询出的数据和右表查询出的数据一一对比,相同则保留,即取交集。
关键字:inner join
和on
,on后边编写条件。
SELECT user.username, organization.orgname
FROM user
inner join organization
on user.organization = organization.orgid;
学生表:user
学校表:organization
内联查询结果
1.2 外联查询
以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行对比: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留;不能匹配,该表的字段都置空NULL。
1.2.1 左查询
以左表为主,取出里面的所有记录, 然后每条与右表进行对比: 不管能不能匹配上条件,右表最终都会保留: 能匹配,正确保留;不能匹配,该表的字段都置空NULL。
关键字:left join
和on
SELECT user.username, organization.orgname
FROM user
left join organization
on user.organization = organization.orgid;
左联查询结果
1.2.2 右查询
以右表为主,取出里面的所有记录, 然后每条与左表进行对比: 不管能不能匹配上条件,左表最终都会保留: 能匹配,正确保留;不能匹配,该表的字段都置空NULL。
关键字:right join
和on
SELECT user.username, organization.orgname
FROM user
right join organization
on user.organization = organization.orgid;
右联查询结果
2 联合查询
联合查询结果是将多个select语句的查询结果合并到一起
关键字:
union distinct
去重
union all
不去重,全部显示
union
去重的简写
注意:两张表字段需要相同,并且order by
关键字不允许出现两次,如果想多次使用order by
它只有在子句的子句中出现在有效。
SELECT user.username FROM user
union all
SELECT user.username FROM user
联合查询结果
可以看出user表被打印了两次
3 子查询
子查询也叫嵌套查询,子查询可以使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重使用!
3.1 使用in关键字的子查询
使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较
如果某行的特定列的值存在,则在select语句的查询结果中就包含这一行。
查询用户组为2的所有用户:
SELECT userid, username, usergroup, lastlogin
FROM user
WHERE usergroup in
(SELECT user.usergroup
FROM user
WHERE user.usergroup = 2);
查询结果
3.2 使用比较运算符的子查询
如果可以确定子查询返回的结果只包含一个单值,那么可以直接使用比较运算符连接子查询。
经常使用的比较运算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。
用户细节表:userdetail
查询年龄小于userid为2的用户的年龄的用户:
SELECT * FROM userdetail
WHERE age <
(SELECT age
FROM userdetail
WHERE userid = 2);
查询结果
3.3 使用exists关键字的子查询
exists子查询是用来判断某些条件是否满足的(跨表),exists是接在where之后的,并且它的返回的结果只有0和1。
SELECT user.username, userdetail.age, userdetail.sex
FROM user
inner join userdetail
on user.userid = userdetail.userid
where EXISTS
(SELECT * FROM userdetail where age > 22);
当userdetail表中有年龄大于22的数据时,打印内联的全表
查询结果:
3.4 使用any关键字的子查询
any关键字表示满足其中的任意一个条件。使用any关键字时,只要满足内层查询语句结果的的任意一个数据,就可以通过该条件来执行外层查询语句。
SELECT user.username, userdetail.age, userdetail.sex
FROM user
inner join userdetail
on user.userid = userdetail.userid
where userdetail.age > any
(SELECT userdetail.age FROM userdetail where age < 19);
内层查询:查询所有年龄小于19的数据。
外层查询:如果外层查询大于任意一个内层查询结果则将其输出。
查询结果:
3.5 使用all关键字的子查询
all和any是相反的,all关键字表示必须满足所有结果。使用all关键字,要满足内层查询语句数据的所有结果才可以通过该条件来执行外层查询语句。
我们把上一个sql语句中的any换成all看看会有什么结果
SELECT user.username, userdetail.age, userdetail.sex
FROM user
inner join userdetail
on user.userid = userdetail.userid
where userdetail.age > all
(SELECT userdetail.age FROM userdetail where age < 19);
查询结果:
可以发现最小年龄是19岁,和上一个查询结果相比少了个18岁的结果。
- 本文章撰写参考自这里