MySql之内连接,外连接,左连接,右连接以及子查询举例详解

一.数据准备

资源绑定中有sql执行语句,直接复制粘贴,用navicat执行创建表并插入数据

(有需要的可自行下载,如有问题可在评论区留言)

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第1张图片

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第2张图片

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第3张图片

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第4张图片

students,scores,courses三张表的联系如下图所示

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第5张图片

二.内连接

把两张表相同的地方查询出来

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第6张图片

(1)语法

  • select * from 表1 inner join 表2 on 表1.字段 = 表2.字段
  • 内连接最重要的是,找对两张表要关联的字段

students表

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第7张图片

scores表

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第8张图片

students表和scores内连接查询结果

SELECT * from students INNER JOIN scores ON students.studentNo=scores.studentNo

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第9张图片

(2)内连接查询,显示指定的字段

例:students表与socres内连接,只显示name 课程号 成绩

SELECT name, courseNo, score from students INNER JOIN scores on students.studentNo = scores.studentNo

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第10张图片

(3)带有where条件的内连接

语法  select * from 表1 inner join 表2 on 表1.字段 = 表2.字段 where 条件

查询王昭君的信息,要求只显示姓名、课程号、成绩

SELECT name,courseNo,score FROM students INNER JOIN scores on students.studentNo=scores.studentNo 
WHERE NAME='王昭君'

(4)带有and的where条件

查询姓名为’王昭君’,并且成绩小于 90 的信息,要求只显示姓名、成绩

SELECT name,score FROM students INNER JOIN scores on students.studentNo=scores.studentNo 
WHERE NAME='王昭君' AND score<90

(5)多表内连接

查询学生信息和成绩以及成绩对应的课程名称

SELECT * from students INNER JOIN scores on students.studentNo=scores.studentNo
INNER JOIN courses on scores.courseNo=courses.courseNo

(6)写sql的技巧:

  • 搭框架

    • 基本的select语句框架搭建起来,如果有多表,把相应的多表也联合进来

  • 看条件

    • 决定where后面的具体条件

  • 显示的字段

    • select后面到底要显示什么字段

举例:查询所有学生的’linux’课程成绩,要求只显示姓名、成绩、课程名

-- 第一步:搭框架
-- SELECT * from students INNER JOIN scores 
-- on students.studentNo = scores.studentNo
-- INNER JOIN courses on scores.courseNo = courses.courseNo;
-- 第二步:看条件
-- SELECT * from students INNER JOIN scores 
-- on students.studentNo = scores.studentNo
-- INNER JOIN courses on scores.courseNo = courses.courseNo
-- where courseName = 'linux';
-- 第三步:返回字段名
SELECT name, score, courseName from students INNER JOIN scores 
on students.studentNo = scores.studentNo
INNER JOIN courses on scores.courseNo = courses.courseNo
where courseName = 'linux';

(7)带有order by的内连接

-- 例 8:查询成绩最高的男生信息,要求显示姓名、课程名、成绩
SELECT name, score, courseName from students INNER JOIN scores 
on students.studentNo = scores.studentNo
INNER JOIN courses on scores.courseNo = courses.courseNo
where sex = '男'
order by score desc LIMIT 1;

三.左连接

 包括了内连接,同时还查询左表特有的内容

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第11张图片

(1)语法

  • select * from 表1 left join 表2 on 表1.字段 = 表2.字段

--查询所有学生的信息以及成绩,包括没有成绩的学生
SELECT * from students left JOIN scores ON
students.studentNo = scores.studentNo;

四.右连接

包括了内连接,同时还查询右表特有的内容

MySql之内连接,外连接,左连接,右连接以及子查询举例详解_第12张图片

(1)语法

  • select * from 表1 right join 表2 on 表1.字段 = 表2.字段
--查询所有课程的信息,包括没有成绩的课程
SELECT * from scores RIGHT JOIN courses ON
scores.courseNo = courses.courseNo;

五.子查询

  • 子查询是嵌套到主查询里面的

  • 子查询做为主查询的数据源或者条件

  • 子查询是独立可以单独运行的查询语句

  • 主查询不能独立运行,依赖子查询的结果

--查询大于平均年龄的学生记录
-- 用子查询实现
select * from students where age > (SELECT avg(age) from students);

标量子查询------子查询返回结果只有一行,一列

select * from students where age > (SELECT avg(age) from students);

(该子查询的结果只有一行一列)

列子查询------子查询返回一列多行

--用子查询,查询所有女生的信息和成绩
--用内连接实现
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;

表级子查询------子查询返回结果为多行,多列

你可能感兴趣的:(mysql,mysql,数据库)