1.连接查询
可以通过连接运算符(连接条件)可以实现多个表查询
1>内连接:把两张表相同的地方查询出来
2>左连接:包括了内连接,同时还查询左表特有的内容
3>右连接:包括了内连接,同时还查询右表特有的内容
2.内连接
语法:
select * from 表1 inner join 表2 on 表1.字段 = 表2.字段;
内连接最重要的是,找对两张表要关联的字段
隐式内连接语法:
select * from 表1,表2 where 两个表的连接条件;
内连接查询,显示指定的字段
例1:students表与socres内连接,只显示name 课程号 成绩
select name, courseNo, score from students inner join scores on students.studentNo = scores.studentNo;
表的别名在查询中的使用
select name 姓名, courseNo 课程编号 , score 成绩 from students st inner join scores sc on st.studentNo = sc.studentNo;
带有where的内连接
语法:
select * from 表1 inner join 表2 on 表1.字段 = 表2.字段 where 条件;
例 2:查询姓名为’王昭君’,并且成绩小于 90 的信息,要求只显示姓名、成绩
select name, score from students s1 inner join scores s2 on s1.studentNo = s2.studentNo
where s1.name = '王昭君' and s2.score < 90;
例 3:查询学生信息和成绩以及成绩对应的课程名称
select * from students inner join scores on students.studentNo = scores.studentNo
inner join courses on scores.courseNo = courses.courseNo;
写SQL三步法:
- 搭框架
- 基本的select语句框架搭建起来,如果有多表,把相应的多表也联合进来
- 看条件
- 决定where后面的具体条件
- 显示的字段
- select后面到底要显示什么字段
3.左连接
语法:
select * from 表1 left join 表2 on 表1.字段 = 表2.字段;
例 1:查询所有学生的信息以及成绩,包括没有成绩的学生
select * from students left join scores on students.studentNo = scores.studentNo;
4.右连接
语法:
select * from 表1 right join 表2 on 表1.字段 = 表2.字段;
例 1:查询所有课程的信息,包括没有成绩的课程
select * from scores right join courses on scores.courseNo = courses.courseNo;
5.多表联合查询,同名字段的处理方式
如果一条select要用到多个表,表中有同名字段,就需要 表名.字段名 加以区分。
select students.studentNo from students inner join scores on students.studentNo = scores.studentNo;
6.自关联
自关联,是同一张表做连接查询
自关联下,一定找到同一张表可关联的不同字段
例 1:查询广东省的所有城市
SELECT * from areas a1 INNER JOIN areas a2 on a1.id = a2.pid where a1.name = '广东省';
7.子查询
子查询是嵌套到主查询里面的
子查询做为主查询的数据源或者条件
子查询是独立可以单独运行的查询语句
主查询不能独立独立运行,依赖子查询的结果
例 1:查询大于平均年龄的学生记录
select avg(age) from students;
select * from students where age > 30.1667;
-- 用子查询实现
select * from students where age > (SELECT avg(age) from students);
标量子查询------子查询返回结果只有一行,一列
例 2:查询 30 岁的学生的成绩
-- 查询30岁学生的studentNO
select studentNo from students where age = 30;
select * from scores where studentNo in ('001', '003', '011');
-- 用子查询实现
select * from scores where studentNo in(select studentNo from students where age = 30);
列子查询------子查询返回一列多行
例 3:用子查询,查询所有女生的信息和成绩
-- 用内连接实现
select * from students inner join scores on students.studentNo = scores.studentNo where sex = '女';
-- 用子查询实现
select * from (select * from students where sex = '女') stu inner join scores sc on stu.studentNo = sc.studentNo;
表级子查询------子查询返回结果为多行,多列