MySQL
数据库的学习
序言:这些笔记是我跟着尚硅谷讲师所做的,全文都是个人亲手码出,同时表也是用的是讲师所用到的表(当然自己去建也是可以的)。所以下面的SQL
语句只做语法学习参考。
排序操作和分页操作
排序操作(ORDER BY)
排序操作升序(ASC
)和降序(DESC
)操作。一般情况下,MySQL
中用ORDER BY
来进行语句的说明操作(默认情况下是升序操作)。可以通过字面意思去理解:ORDER
(排序的意思) BY
(通过什么。。。)
这里直接上代码演示
-- 按照薪资的升序(由小到大)进行排序操作
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary;
-- 按照薪资的升序(由小到大)进行排序操作
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary ASC;
-- 按照薪资的降序(由大到小)进行排序操作
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC;
这里我们序言提出一个疑问了?
我们可以使用列的别名进行筛选和排序吗?
-- 此语句可以执行
SELECT employee_id,last_name,salary,salary*12 annual_sal
FROM employees
ORDER BY annual_sal;
-- 此语句无法执行
SELECT employee_id,last_name,salary,salary*12 annual_sal
FROM employees
WHERE annual_sal > 57600.00;
-- 再可以参考一下下面的语句(可以执行)
SELECT employee_id,last_name,salary,salary*12 annual_sal
FROM employees
WHERE department_id IN(50,60,70)
ORDER BY annual_sal;
通过上面的代码我们可以看出,列的别名可以在排序条件中使用,但是不能在筛选条件中使用。因为我们的SQL
语句执行顺序有关,只有执行完了 SELECT
之后(才有相应的列的别名),ORDER BY
才能获取这个列的别名。而 WHERE
是在 SELECT
之前就已经执行,获取不到列的别名。你可以先简单地记住WHERE
是需要紧跟在From
后面的。
二级排序
也是比较简单的一个内容,无非就是在之前的排序中再加一个排序
-- 根据department_id进行降序操作,然后对相同的department_id的人的薪资进行工资的升序排序
SELECT department_id,last_name,salary
FROM employees
ORDER BY department_id DESC,salary ASC;
分页操作(LIMIT)
分页操作的关键字是LIMIT
,一般的格式为:LIMIT (PageNum PageSize)
即PageNum
就是从哪条数据开始,PageSize
显示的是每页多少条数据。其中PageNum = (PageNum - 1 ) * PageSize
-- 0代表的是从第几条数据开始,20代表的是一页显示多少条数据
-- 每页显示20条数据,此时显示第一页
SELECT employee_id,last_name
FROM employees
LIMIT 0,20;
-- 每页显示20条数据,此时显示第二页
SELECT employee_id,last_name
FROM employees
LIMIT 20,20;
-- 每页显示20条数据,此时显示第三页
SELECT employee_id,last_name
FROM employees
LIMIT 40,20;
WHERE…ORDER BY…LIMIT声明顺序
下面一段代码可以看出:
SELECT employee_id,last_name,salary
FROM employees
WHERE salary > 6000
ORDER BY salary DESC
LIMIT 10,10;
了解一下MySQL8.0
新特性
SELECT employee_id,last_name
FROM employees
LIMIT 20 OFFSET 0; -- 每页的偏移量和条目数调转过来
七种join
的方式(内连接 外连接)
在学习join
方式之前,我们首先要区分好内连接和外连接的核心概念。我们这里先看下面这张图 这张图需要记住(这里最好自己建立几张合适的表)
内连接:官方一点的说法就是合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行。
内连接语法格式 :INNER JOIN
SELECT *
FROM 表1
INNER JOIN 表2
ON 表1.字段 = 表2.字段
外连接:官方一点的说法就是合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行 还查询到了左表 或 右表中不匹配的行
只要开发中看到需要查询两个表中所有的信息出来就用到外连接。
外连接一般分为:左外连接(LEFT OUTER JOIIN
)右外连接(RIGHT OUTER JOIN
)满外连接(MySQL
不支持该FULL
语法),其中OUTER
可以省略。
左连接:返回包括左表中的所有记录和右表中连接字段相等的记录 (对应的是上图的 左上图)
右连接:返回包括右表中的所有记录和左表中连接字段相等的记录 (对应的是上图的 右上图)
-- 外连接
SELECT *
FROM 表1
OUTER JOIN 表2
ON 表1.字段 = 表2.字段
-- 左连接
SELECT *
FROM 表1
LEFT JOIN 表2
ON 表1.字段 = 表2.字段
-- 右连接
SELECT *
FROM 表1
RIGHT JOIN 表2
ON 表1.字段 = 表2.字段
这里补充一个 UNION
和UNION ALL
的知识点
这两个关键字就是对两个表的结果进行连接。
UNION:会执行去重操作
UNION ALL:不会执行去重操作(建议使用,因为不需要进行去重操作,会提升数据查询效率)
满外连接虽然Mysql
不支持Full
语法,但是我们可以借助上图的左上图和右中图进行UNION ALL
或者是 UNION
进行合并。
SELECT *
FROM 表1
LEFT JOIN 表2
ON 表1.字段 = 表2.字段
UNION ALL
SELECT *
FROM 表1
RIGHT JOIN 表2
ON 表1.字段 = 表2.字段