【1】连接查询
内连接:
[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.
基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;on表示连接条件: 条件字段就是代表相同的业务含义
当两个表中存在相同意义的字段的时候,就可以通过该字段来连接查询这两个表,当该字段的值相同时就可以查出该记录。
内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果。
外连接查询
以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL。
左连接
left join: 左外连接(左连接), 以左表为主表基本语法: from 左表 left join 右表 on 左表.字段 = 右表.字段;
左表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,右表的字段都置NULL。
右连接
right join: 右外连接(右连接), 以右表为主表基本语法: from 左表 right join 右表 on 左表.字段 = 右表.字段;
右表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,左表的字段都置NULL。
【2】联合查询
联合查询联合查询结果是将多个select语句的查询结果合并到一块因为在某种情况下需要将几个select语句查询的结果合并起来显示。比如现在需要查询两个公司的所有员工的信息,这就需要从甲公司查询所有员工信息,再从乙公司查询所有的员工信息,然后将两次的查询结果进行合并。可以使用union和union all关键字进行操作
语法格式如下:
select 语句1
union[union 选项]
select 语句2
union|[union 选项]
select 语句n
12345
其中union选项有两个选项可选all:表示无论重复都输出distinct: 去重(整个重复)(默认的)
select *from addr
union all
select *from addr;
联合查询的意义:
查询同一张表,但是需求不同
如查询学生信息, 男生身高升序, 女生身高降序
多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.
联合查询order by的使用在联合查询中: order by不能直接使用(不能出现两次),需要对查询语句使用括号才行;
【3】子查询
通常我们在查询的SQL中嵌套查询,称为子查询。子查询通常会使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重选择
带in关键字的子查询
使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较如果某行的特定列的值存在,则在select语句的查询结果中就包含这一行。
带比较运算符的子查询
如果可以确认子查询返回的结果只包含一个单值,那么可以直接使用比较运算符连接子查询。经常使用的比较运算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。
带exists的子查询
exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后exists返回的结果只有0和1.
例:如果存在成绩大于90的人则列出整个表的记录
select *
from student
where exists
(select *from student where score>90);
带any关键字的子查询
any关键字表示满足其中的任意一个条件,使用any关键字时,只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句。
select *
from student
where addrid<any
(select addrid
from addr);
带all关键字的子查询
all和any刚好是相反的,all关键字表示满足所有结果,使用all关键字,要满足内层查询语句的所有结果,才可以通过该条件来执行外层查询语句。
select *
from student
where addrid>all
(select addrid
from addr);