!说明:最近5天看了尚硅谷康师傅(强推JVM)的MySQL基础篇,分享一下笔记,mark,mark!
一、SQL的分类
1、DDL
- 即数据定义语言
CREATE / ALTER / DROP / RENAME / TRUNCATE
- 定义不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构
2、DML
- 即数据操作语言
INSERT / DELETE / UPDATE / SELECT
- 用于添加、删除、更新和查询数据库记录,并检查数据库完整性
3、DCL
- 即数据控制语言
COMMIT / ROLLBACK / SAVEPOINT / GRANT / REVOKE
- 用于定义数据库、表、字段、用户的访问权限和安全级别
二、SQL语言的规则和规范
1、基本规则
- 每条查询语句以
;
结束,或者在命令行中使用\g
或\G
结束 - 字符串、日期时间类型的数据需使用
''
表示
2、SQL大小写规范
- 在Window下是大小写不敏感的
- 在Linux上是大小写敏感的
- 数据库名、表名、表的别名、变量名是严格区分大小写的
- 关键字、函数名、列名(字段名)、列的别名(字段的别名)是大小写不区分的
3、注释
- 单行注释:
#
或者-- --
- 多行注释:
/**/
三、基本的SELECT语句
1、SELECT…FROM 表名
2、列的别名
- 1 直接
空格
后续跟别名newname
SELECT oldname newname FROM ...
- 2 原名和别名之间使用
AS
,表示alias
SELECT oldname AS newname FROM ...
- 列的别名使用一对
""
引起来,不要使用单引号
SELECT oldname "newname" FROM ...
3、列的去重
- 使用
DISTINCT
SELECT DISTINCT… FROM…
- DISTINCT的去重是针对其后面跟着的多个列有效的,如后面有两列,则会去这两列都相同的部分,仅一列相同的会保留
4、空值null
- 空值null不等同于0,’’
- 只是在输入信息时还未确定好
- 空值参与运算:结果也一定为null,处理方法,使用IFNULL
5、着重号
- 在创建表、数据库、视图等需要与关键字等区分
- 但是如果确实与其相矛盾了,使用着重号````,能够使得各种操作正常执行
SELECT... FROM...
表名``
6、查询常量
- 查询表中没有的列,会在最终的查询结构中每一行都加上该列的内容,如果是字符串形式,则需要使用
''
7、显示表结构
- DESCRIBE 表名
- 显示表中字段的详细信息
![image.png](https://img-blog.csdnimg.cn/img_convert/c369ab889e9e01bde5db73b801d3dd2c.png#clientId=ua1e75efc-2fd0-4&from=paste&height=164&id=uc9917496&margin=[object Object]&name=image.png&originHeight=328&originWidth=562&originalType=binary&ratio=1&size=63586&status=done&style=none&taskId=u26292d23-d7bf-4a10-a1f7-9506f5f4ec7&width=281)
8、过滤数据
- 使用
WHERE
,需要声明在FROM的后面
四、运算符
1、算数运算符
2、比较运算符
- 比较的结果为真则返回1,为假则返回0,其他情况返回null
- 只要有null参与比较,结果就是null
<=>
,安全等于符号,当左右均为null时,返回的结果为null
1)非符号类型运算符(关键字)
IS NULL
:为空运算符IS NOT NULL
:不为空运算符LEAST
:最小值运算符GREATEST
:最大值运算符BETWEEN... AND...
:查询两个条件范围内的数据,包括两个边界(或者使用&&),注意先写条件的下界后写条件上界,否则不会返回任何查询结果NOT BETWEEN... AND...
:不在该范围内的IN / NOT IN
,对于多个条件值的时候使用
# 查询工资是1000或2000或3000的
SELECT
salary
FROM
employees
WHERE
salary IN (1000 , 2000, 3000)
- LIKE:模糊查询
%
:代表不确定个数的字符,0个,1个…_
:代表一个不确定的字符\
:转义字符,可以使得后跟的符号不会发挥代表的效果,直接显示- 使一个特定字符作为转义字符,
WHERE ... LIKE '....$.....' ESCAPE '$'
,此时可以使得$作为转义字符
2)正则表达式
- ‘
^
’匹配后跟字符开头的字符串 - ‘
$
’匹配后跟字符结尾的字符串 - ‘
.
’匹配任何一个字符 - ‘
[..., ..., ... ...]
’匹配方括号中的任何字符,为了命名字符的范围,使用一个‘-’ - ‘
*
’匹配零个或多个在它前面的字符
3、逻辑运算符
NOT
或!
AND
或&&
OR
或||
XOR
- OR和AND可以同时使用,但是AND的优先级高于OR
4、位运算符
。。。略过
5、运算符习题
# 1 选择工资不在5000到12000的员工的姓名和工资
select first_name, salary
from employees
where salary not between 5000 and 12000;
# 2 选择在20或者50号步迷们工作的员工姓名和部门号
select first_name, department_id
from employees
where department_id in (20, 50);
# 3 选择公司中没有管理者的员工姓名和job_id
select first_name, job_id
from employees
where manager_id is null;
# 4 选择公司中有奖金的员工姓名,工资和奖金级别
select first_name, salary, commission_pct
from employees
where commission_pct is not null;
# 5 选择员工姓名的第三个字母是a的员工姓名and
select first_name
from employees
where first_name like '__a%';
# 6 选择姓名中有字母a和k的员工姓名
select first_name
from employees
where first_name like '%a%k%' or first_name like '%k%a%';
# 7 显示出first_name以e结尾的员工信息
select *
from employees
where first_name like '%e';
# 8 显示出部门编号在80-100之间的员工的姓名、工种
select first_name, job_id
from employees
where department_id between 80 and 100;
# 9 显示出manager_id是100、101、110的员工姓名、工资、管理者id
select first_name, salary, manager_id
from employees
where manager_id in (100, 101, 110);
五、排序与分页
1、排序规则
- 如果没有使用排序,默认情况下返回的数据是按照添加数据的顺序显示的(即表中的顺序)
1)ORDER BY
- 使用对数据进行操作排序
- 若ORDER BY后面未指定排序的规则,则默认为升序
- 我们可以使用列的别名进行排序,但是列的别名不能在WHERE中使用
- ORDER BY的使用需要放在WHERE的后面
2)排序规则
- ASC:升序
- DESC:降序
3)二级排序
- 例子:显示员工信息,按照department_id降序,再按照salary升序
- 多级排序规则类似
# 二级排序
SELECT
employee_id, department_id, salary
FROM
employees
ORDER BY department_id DESC , salary ASC; # 这个ASC可不写
六、分页
- 查询返回的记录太多,查看起来不方便 --> 分页查询
- 查询表里的指定范围的数据
1)LIMIT
LIMIT (pageNo - 1) * pageSize,pageSize
- 每页显示pageSize条记录,此时显示第pageNo页
- LIMIT 0, pageSize相当于LIMIT pageSize(不推荐)
- LIMIT的声明在ORDER BY后
# 分页
# 需求1 每页显示20条数据,此时显示第1页
SELECT
*
FROM
employees
LIMIT 0 , 20;
# 需求2 每页显示20条数据,此时显示第2页
SELECT
*
FROM
employees
LIMIT 20 , 20;
2)LIMIT新特性
- 8.0中可加入OFFSET
LIMIT pageSize OFFSET (pageNo - 1) * pageSize
,注意和原本的是相反的- !注意:LIMIT适用于MySQL、PostgreSQL、MariaDB和SQLite,但是不适用于SQL Server、Oracle等
3)排序与分页习题
# 1 查询员工的姓名、部门号和年薪,按年薪降序,再姓名升序
SELECT
first_name, department_id, salary * 12 annual_sal
FROM
employees
ORDER BY annual_sal DESC , first_name;
# 2 选择工资不在8000到17000的员工的姓名和工资,按工资降序,显示21-24的位置的数据
SELECT
first_name, salary
FROM
employees
WHERE
salary BETWEEN 8000 AND 17000
ORDER BY salary DESC
LIMIT 20 , 20;
# 3 查询邮箱中包含e的员工信息,并按照邮箱中的字节数降序,再按部门号升序
SELECT
*
FROM
employees
WHERE
email LIKE '%e%'
ORDER BY LENGTH(email) DESC , department_id;