前言
MySQL在面试和工作中非常重要,故在此整理学习MySQL时的知识点,作为一个学习笔记。
文中内容出自尚硅谷,链接:尚硅谷MySQL数据库教程天花板,mysql安装到mysql高级。
非常感谢尚硅谷的视频教程!
目录
2. count(*),count(1),count(column)区别
一、SQL语句
1.基本sql语句
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件;
SELECT 字段1,字段2 "字段2的别名"
FROM 表名
WHERE 过滤条件;
3.去重
SELECT DISTINCT 字段1
FROM 表名;
4.空值参与运算
books表:
bookID | bookname | discount | price |
1 | go | 1 | 50 |
2 | mysql | null | 60 |
3 | linux | 0.8 | 70 |
- 查询书本打折后的价格
#IFNULL(字段, 1) 如果字段不为空,则使用字段原有值;如果字段为空,则用1替换
SELECT bookname, price * IFNULL(discount,1) "cost"
FROM books;
5.显示表结构
DESC 表名;
二、运算符
1.比较运算符
比较运算符用来对表达式左边的操作数和游标的操作数进行比较,比较结果为真返回1,比较结果为假返回0,其他情况返回NULL。
比较运算符经常被用来作为select查询语句的条件来使用,返回符合条件的结果记录。
SELECT 0 = 'a' # 整数与字符串比较,mysql会将字符串转化为数字进行比较
FROM dual;
SELECT 'a' = 'b' # 字符串之间比较,其比较的是每个字符串中字符的ASCII编码是否相等
FROM dual;
2.安全等于运算符
安全等于运算符(<=>)与等于运算符作用相似,唯一的区别就是安全等于可以用来对NULL进行判断。使用安全等于运算符时,两边的操作数都为NULL时,返回的结果为1;当一个操作数为NULL时,其返回值为0。
SELECT NULL = NULL, NULL <=> NULL, 1 = NULL, 1 <=> NULL;
3.非符号类型运算符
运算符 | 作用 |
is null | 判断值、字符串或者表达式是否为空 |
is not null | 判断值、字符串或者表达式是否不为空 |
least | 在多个值中返回最小值 |
greatest | 在多个值中返回最大值 |
between...and... | 判断一个值是否在两个值之间,包含边界值 |
isnull | 判断值、字符串或者表达式是否为空 |
in | 判断值是否为列表中任意的一个值 |
not in | 判断一个值是否不是一个列表中的任意一个值 |
like | 判断一个值是否符合模糊匹配规则 |
- 查询books表discount不为空的数据
SELECT bookName
FROM books
WHERE discount IS NOT NULL;
- 查询 book表中discount为空的数据
SELECT bookName
FROM books
WHERE discount IS NULL;
- 查询books表中价格在50-70之间的书名
SELECT bookName, price
FROM books
WHERE price
BETWEEN 50 AND 70;
- 查询books表中书价为50,60的书本信息
SELECT bookName, price
FROM books
WHERE price IN (50,60);
- 查询books表中包含字符 'i' 的书名
SELECT bookName
FROM books
WHERE bookName
LIKE '%i%';
- 查询books表中第三个字符是 'n' 的书名
SELECT bookName
FROM books
WHERE bookName
# _ 代表一个不确定的字符
LIKE '__n%';
三、排序、分页
使用limit的好处:约束返回结果的数量可以减少数据表的网络传输量,也可以提升查询效率。如果知道返回结果只有一条,就可以使用limit 1,告诉select语句只需要返回一条记录即可。好处是select不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。
limit后第一个参数表示开始的下标,第二个参数表示个数
注意:limit必须放在整个select语句的最后。
- 排序分页的sql语句
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件
ORDER BT 字段 ASC/DESC
LIMIT (pageNum - 1) * pageSize, pageSize;
- 查询书名按照价格降序排序
SELECT bookName, price
FROM books
ORDER BY price DESC;
- 每页显示10条记录,显示第二页
SELECT bookName, price
FROM books
LIMIT 10,10;
四、多表查询
- emp员工表
emp_id |
first_name |
last_name |
phone |
job_id |
salary |
commission_pct |
manager_id |
dept_id |
- dept部门表
dept_id |
dept_name |
manager_id |
location_id |
- location位置表
location_id |
street_address |
postal_code |
city |
state_province |
country_id |
1.笛卡尔积
1.1 什么是笛卡尔积
多表查询的结果数为多个表中数据条目数的乘积,笛卡尔积会把第一张表的每一个值与第二张表的每一个值进行匹配。
1.2 什么情况下会出现笛卡尔积的错误
- 省略多个表的连接条件
- 连接条件无效
- 所有表中的所有行互相连接
为避免笛卡尔积,可以在where加入有效的连接条件
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2; #连接条件
2.内连接、外连接
内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行。
SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;
外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左表或右表中不满足条件的行,这种连接也称为左外连接或右外连接。没有匹配的行时,结果表中对应的列为空。MySQL不支持sql92的外连接写法。
左外连接连接条件左表的表为主表,右边的表为从表;右外连接则相反。
外连接的分类:左外连接、右外连接、满外连接
- 左外连接
SELECT e.last_name, e.dept_id, d.dept_name
FROM emp e
LEFT OUTER JOIN dept d
ON (e.dept_id = d.dept_id);
- 右外连接
SELECT e.last_name, e.dept_id, d.dept_name
FROM emp e
RIGHT OUTER JOIN dept d
ON (e.dept_id = d.dept_id);
3. union
union和union all的区别:union会执行去重操作;union all不会执行去重操作。
4. SQL JOINS
- 内连接 A∩B
SELECT emp_id,last_name,dept_name
FROM emp a JOIN dept b
ON a.`dept_id` = b.`dept_id`;
- 左外连接
SELECT emp_id,last_name,dept_name
FROM emp a LEFT JOIN dept b
ON a.`dept_id` = b.`dept_id`;
- 右外连接
SELECT emp_id, last_name, dept_name
FROM emp a RIGHT JOIN dept b
ON a.`dept_id` = b.`dept_id`;
- A - A∩B
SELECT emp_id,last_name,dept_name
FROM emp a LEFT JOIN dept b
ON a.`dept_id` = b.`dept_id`
WHERE b.`dept_id` IS NULL;
- B - A∩B
SELECT emp_id,last_name,dept_name
FROM emp a RIGHT JOIN dept b
ON a.`dept_id` = b.`dept_id`
WHERE a.`dept_id` IS NULL;
- 满外连接
SELECT emp_id,last_name,dept_name
FROM emp a LEFT JOIN dept b
ON a.`dept_id` = b.`dept_id`
WHERE b.`dept_id` IS NULL
UNION ALL #没有去重操作,效率高
SELECT emp_id,last_name,dept_name
FROM emp a RIGHT JOIN dept b
ON a.`dept_id` = b.`dept_id`;
- (A - A∩B)∪(B - A∩B)
SELECT emp_id,last_name,dept_name
FROM emp a LEFT JOIN dept b
ON a.`dept_id` = b.`dept_id`
WHERE b.`dept_id` IS NULL
UNION ALL
SELECT emp_id,last_name,dept_name
FROM emp a RIGHT JOIN dept b
ON a.`dept_id` = b.`dept_id`
WHERE a.`dept_id` IS NULL