对这篇文章的延申
Mysql-全外连接-Union和Union ALL的辨析及练习-CSDN博客
其他SQL系列文章:
MySQL《一》-数据库基础_宋红康主要课程-CSDN博客
MySQL《二》-基本查询语句(Select)-CSDN博客
Mysql - 定点型(DECIMAL)的使用详解及练习-CSDN博客
MySQL-关于逻辑架构与存储引擎看这一篇就够了-CSDN博客
MySQL - 创建表的三种方法详解及练习_mysql 建表练习-CSDN博客
MySQL- in(集合) 和 not in(...) 的使用和练习_mysql in组合-CSDN博客
MySql-substring函数和substring_index函数的使用及练习_substring_index语句-CSDN博客MySQL - 表达式With as 语句的使用及练习_mysql with as update-CSDN博客
MySQL-日期时间函数详解及练习-CSDN博客
Mysql- 流程函数-(If, CASE WHEN)的使用及练习_mysql case when-CSDN博客
目录
一、🥪笛卡尔积
1. 笛卡尔积定义
2. 表连接的约束条件
二、多表连接查询
1. 🥪内连接(INNER JOIN)
2. 外连接(OUTER JOIN)
2.1. 🥪左连接(LEFT JOIN)
2.2. 🥪右外连接(RIGHT JOIN)
2.3. 🥪全外连接(UNION,UNION ALL)
3. 🥪自连接
4. 练习题1-行转列
5. 牛客练习题:
一、🥪笛卡尔积
1. 笛卡尔积定义
定义:将两(或多)个表的所有行进行组合,连接后的行数为两(或多)个表的乘积数.
实际开发中应该避免全笛卡尔积 ----在 where 加入有效的
连接条件
【等值连接】
在MySQL中如下情况会出现笛卡尔积,主要是因为缺少关联条件或者关联条件不准确
注:外连接必须写关联条件,否则报语法错误
#笛卡尔积#查询员工姓名和所在部门名称
SELECT ename,dname FROM t_employee,t_department;
SELECT ename,dname FROM t_employee INNER JOIN t_department;
SELECT ename,dname FROM t_employee CROSS JOIN t_department;
SELECT ename,dname FROM t_employee JOIN t_department;
2. 表连接的约束条件
表连接的约束条件可以有三种方式:WHERE, ON, USING
-
WHERE:适用于所有关联查询
-
ON:只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好。
-
USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等
#关联条件#把关联条件写在where后面
SELECT ename,
dname
FROM t_employee,
t_department
WHERE t_employee.dept_id = t_department.did;
#把关联条件写在on后面,只能和JOIN一起使用
SELECT ename,
dname
FROM t_employee
INNER JOIN t_department
ON t_employee.dept_id=t_department.did;
#把关联字段写在using()中,只能和JOIN一起使用
#而且两个表中的关联字段必须名称相同,而且只能表示=
#查询员工姓名与基本工资
SELECT ename,
basic_salary
FROM t_employee
INNER JOIN t_salary
USING(eid);
#n张表关联,需要n-1个关联条件
#查询员工姓名,基本工资,部门名称
SELECT ename,
basic_salary,
dname
FROM t_employee,
t_department,
t_salary
WHERE t_employee.dept_id = t_department.did
AND t_employee.eid=t_salary.eid;
二、多表连接查询
1. 🥪内连接(INNER JOIN)
有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行
格式:
隐式:SELECT [cols_list] from 表1,表2 where [condition]
显式:SELECT [cols_list] from 表1 INNER JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT [cols_list] from 表1 CROSS JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT [cols_list] from 表1 JOIN 表2 ON [关联条件] where [其他筛选条件]
MySql-substring函数和substring_index函数的使用及练习_substring_index语句-CSDN博客
#内连接#查询员工姓名和所在部门名称
--隐式:SELECT [cols_list] from 表1,表2 where [condition]
SELECT ename,
dname
FROM t_employee,
t_department
WHERE t_employee.dept_id = t_department.did;
-----------------------------
--显式:SELECT [cols_list] from 表1 INNER JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT ename,
dname
FROM t_employee
INNER JOIN t_department
ON t_employee.dept_id=t_department.did;
-----------------------------
--SELECT [cols_list] from 表1 CROSS JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT ename,
dname
FROM t_employee
CROSS JOIN t_department
ON t_employee.dept_id = t_department.did;
-----------------------------
--SELECT [cols_list] from 表1 JOIN 表2 ON [关联条件] where [其他筛选条件]
SELECT ename,
dname
FROM t_employee
JOIN t_department
ON t_employee.dept_id=t_department.did;
2. 外连接(OUTER JOIN)
外连接分为:
左外连接(LEFT OUTER JOIN),简称左连接(LEFT JOIN)
右外连接(RIGHT OUTER JOIN),简称右连接(RIGHT JOIN)
全外连接(FULL OUTER JOIN),简称全连接(FULL JOIN)。
2.1. 🥪左连接(LEFT JOIN)
-- 返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
#左连接
#查询所有部门信息以及该部门员工信息
SELECT did,
dname,
eid,
ename
FROM t_department
LEFT OUTER JOIN
t_employee
ON t_department.did = t_employee.dept_id;
2.2. 🥪右外连接(RIGHT JOIN)
-- 恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
#查询所有部门信息以及该部门员工信息
SELECT did,
dname,
eid,
ename
FROM t_employee
RIGHT OUTER JOIN t_department
ON t_department.did = t_employee.dept_id;
2.3. 🥪全外连接(UNION,UNION ALL)
mysql不支持FULL JOIN,但是可以用 (select 语句1) union (select 语句2)代替
1) SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
2) SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
3) SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
4) Union和Union ALL区别
区别一:取结果的交集
-
union:对两个结果集进行并集操作,不包括重复行,相当于distinct, 同时进行默认规则的排序
-
Union all: 对两个结果集进行并集操作,包括重复行,即所有的结果全部显示,不管是不是重复。
区别2:获取结果后的操作
-
Union:会对获取的结果进行排序操作
-
Union all: 不会对获取的结果进行排序操作
Union all只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用union all的执行效率要比union高。
3. 🥪自连接
当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询
#自连接
#查询员工姓名以及领导姓名,仅显示有领导的员工
SELECT emp.ename,
mgr.ename
FROM t_employee AS emp,
t_employee AS mgr
WHERE emp.mid = mgr.eid;
4. 练习题1-行转列
5. 牛客练习题:
牛客SQL25
SQL 602 好友申请
SQL1280 学生们参加各科测试的次数