一.子查询
在SQL语句中嵌套select语句,称为嵌套查询,又称子查询
# 语法select * from 表1 where 字段1=(select 字段1 from 表2);
子查询是一个嵌套在select、insert、update 或delete 语句或其他子查询中查询
注意:将子查询和比较运算符联合使用,必须保证子查询返回的值不能对于一个
(1).标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询被称为标量子查询
常用的操作符:=、<>、>、>=、<、<=
-- 查询 ‘语文’科目的所有学生信息-- 拆分步骤# 1. 查询语文科目的编号
select id from subject where name='语文';# 2. 根据语文科目的编号,查询所有的学生信息
select * from student where subject_id=(select id from subject where name='语文');
(2) 列子查询
子查询返回的结果是一列(可以是多行,这种子查询称为列子查询)。
常用的操作符:in、not in
-- 查询‘三年级二班’的所有学生的考试成绩-- 分解步骤# 1.查询班级为三年级二班的编号
select grade_id from grade where grade_name='三年级二班';# 2.查找班级为三年级二班所有学生的学号
select student_no from student where grade_id=(select grade_id from grade where grade_name='三年级二班');# 3.查询‘三年级二班’的所有学生的考试成绩
select * from result where student_no in(select student_no from student where grade_id=(select grade_id from grade where grade_name='三年级二班'));
(3). 行子查询
行子查询返回的结果是一行(可以是多列),这种子查询称为行子查询
-- 查询和张三同一天生日的女生的信息-- 拆分步骤# 1. 查询张三的生日
select birthday from student where student_name='张三';# 2.查询和张三同一天生日的女生的信息
select * from student where month(birthday)=month(select birthday from student where student_name='张三') and student_name<>'张三' and sex='女';
二. 多表查询
多表查询是指多张表中查询数据
-- 多表查询语法select * from 表1,表2;
直接这样会出现笛卡尔积
笛卡尔积是指数学中,两个集合 A集合和B集合的所有组合情况。(在多表查询是,需要消除无效的笛卡尔积)
-- 多表查询 消除笛卡尔积select * from 表1,表2 where 表1.字段1=表2.字段1;
-- 查询张三班级的信息select s.student_no,s.student_name.g.grade_name from student s,grade g
where s.grade_id=g.grade_id and s.student_name='张三';
三.联合查询--union和union all
union 用于合并两个或多个select 语句的结果集,并消去表中任何重复行。
union 内部的select语句必须拥有相同数量的列,列也必须拥有相似的数据类型
同时,每条select语句中的列的顺序必须相同,使用all随union 一起使用时(即 union all),不消除重复行
-- 消除重复行
select student_name,phone from student union
select student_name,phone from phones
四. 内连接
内连接查询的是两张表交集的部分
-- 内连接语法select 字段列表 from 表1 【inner】 join 表2 on 连接条件...;-- 查询学生信息及所在班级信息
select s.student_name,g.grade_name,r.student_result from student s inner join grade g on s.grade_id=g.grade_id inner join result r on s.student_no=r.student_no where g.grade_name='数据库一班';
五. 外连接
(1)左外连接
相当于查询表1(左表)的所有数据包含表1和表2交集部分的数据
-- 左外连接语法
select 字段列表 from 表1 left [outer] join 表2 on 条件...;-- 查询所有学生的考试成绩select * from student s left join result r on s.student_no=r.student_no;
(2)右外连接
右外连接的原理与左外连接相同,右表逐条去匹配记录;否则null填充
-- 右外连接语法
select 字段列表 from 表1 right [outer] join 表2 on 条件...;-- 查询所有学生的考试成绩
select * from result r right join student s on s.student_no=r.student_no;
六. 自连接
自连接:通过起别名的方式把一张表当成多个表使用
注意:1.自连接可以是内连接也可以是外连接
2.自己与一张与自己完全一样的从表建立关系进行连接查询
-- 自连接查询语法:
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;-- 查找比张三年龄大的学生select s2.* from student s1,student s2 where s1.student_name='张三' and s1.birthday>s2.birthday;
七. 自然连接
自然连接通过MySQL 自己的判断完成连接过程,不需要指定连接条件。
MySQL会使用表内的,相同的字段,作为连接条件
自然连接分为内外之分
内:natural join
外: 左外natural left join、 右外natural right join
-- 查看学生姓名和考试成绩select s.student_name,r.student_result from student s naturl join result r;