文章目录
- 一、SQL规则与规范
- 二、基本的SELECT语句
- SELECT...FROM...;
- 列的别名 AS ""
- 去除重复行 DISTINCT
- 空值参与运算 结果一定也为NULL
- 着重号 ``
- 常量
- 描述表结构 DESCRIBE
- 过滤数据 WHERE
- 三、运算符
- 算术运算符
- 比较运算符
- 非符号类型运算符
- 逻辑运算符
- 运算符优先级
- 四、排序
- 单列排序
- 双列排序
- 五、分页
- 综合练习
- 基本的SELECT语句
- 运算符
- 排序与分页
一、SQL规则与规范
SQL分类:
-
DDL(Data Definition Languages、数据定义语言)
CREATE \ ALTER \ DROP \ RENAME \ TRUNCATE -
DML(Data Manipulation Language、数据操作语言)
INSERT \ DELETE \ UPDATE \ SELECT -
DCL(Data Control Language、数据控制语言)
COMMIT \ ROLLBACK \ SAVEPOINT \ GRANT \ REVOKE
二、基本的SELECT语句
- 字符串型和日期时间类型的数据可以使用单引号(’ ')表示
- 列的别名,尽量使用双引号(" "),而且不建议省略as
SELECT…FROM…;
SELECT 标识选择哪些列
FROM 标识哪张表;
列的别名 AS “”
SELECT
first_name 名字,
salary AS 薪资,
phone_number "手机号"
FROM
employees;
- 直接跟在变量名后面
- AS 后面
- 加上双引号跟在后面(别名中间需要空格分割时 用这个方式)
去除重复行 DISTINCT
DISTINCT
关键字去重 单独写
SELECT
DISTINCT department_id AS 部门
FROM
employees;
空值参与运算 结果一定也为NULL
Null 空值 不等于0
解决方案: 加上 IFNULL()
为NULL的数值归为0
SELECT
employee_id "员工ID",
salary "月工资",
salary *(
1+IFNULL ( commission_pct, 0 )
) "年工资",
commission_pct
FROM
employees;
添加 IFNULL()
前
修改后:
着重号 ``
需要使用关键字命名的表 用着重号标识 否则会报错
SELECT * FROM `order`;
常量
SELECT '道格',007,996,salary
FROM employees; -- FROM 这个表可以不用写 --
描述表结构 DESCRIBE
DESCRIBE employees;
或
DESC employees;
过滤数据 WHERE
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件
- 使用WHERE 子句,将不满足条件的行过滤掉
- WHERE子句紧随 FROM子句
SELECT employee_id,first_name,department_id
FROM employees
WHERE department_id = 90;
三、运算符
算术运算符
- 一个数乘以整数1和除以整数1后仍得原数;
- 一个数乘以浮点数1和除以浮点数1后变成浮点数,数值与原数相等;
- 一个数除以整数后,不管是否能除尽,结果都为一个浮点数;
- 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后4位;
- 乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同。
- 在数学运算中,0不能用作除数,在MySQL中,一个数除以0为NULL。
查找所有id为偶数的员工
SELECT *
FROM employees
WHERE employee_id % 2 = 0;
比较运算符
比较的结果为真则返回1,
比较的结果为假则返回0,
其他情况则返回NULL。
- 等于运算符
-
等号运算符(=)判断等号两边的值、字符串或表达式是否相等,如果相等则返回1,不相等则返回0。
-
在使用等号运算符时,遵循如下规则:
- 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
- 如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
- 如果等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
- 如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
-
对比:SQL中赋值符号使用 :=
- 安全等于运算符
安全等于运算符(<=>)与等于运算符(=)的作用是相似的,唯一的区别
是‘<=>’可以用来对NULL进行判断。在两个操作数均为NULL时,其返回值为1,而不为NULL;当一个操作数为NULL时,其返回值为0,而不为NULL。
- 不等于运算符
不等于运算符(<>
和!=
)用于判断两边的数字、字符串或者表达式的值是否不相等,如果不相等则返回1,相等则返回0。不等于运算符不能判断NULL值。如果两边的值有任意一个为NULL,或两边都为NULL,则结果为NULL。
非符号类型运算符
- 为Null判断:
#查询commission_pct等于NULL 的四种写法
SELECT employee_id,commission_pct FROM employees WHERE commission_pct IS NULL;
SELECT employee_id,commission_pct FROM employees WHERE commission_pct <=> NULL;
SELECT employee_id,commission_pct FROM employees WHERE ISNULL(commission_pct);
- 最小值运算符 LEAST
SELECT LEAST(1,0,2),LEAST('A','B','C'),LEAST(1,NULL,0);
- 当参数是整数或者浮点数时,LEAST将返回其中最小的值;
- 当参数为字符串时,返回字母表中顺序最靠前的字符;
- 当比较值列表中有NULL时,不能判断大小,返回值为NULL。
- 最大值运算符 GREATEST
SELECT GREATEST(1,0,2),GREATEST('A','B','C'),GREATEST(1,NULL,0);
- BETWEEN AND 运算符
求出范围内的全部数值
求出薪资4000 ~ 8000 之间的员工
SELECT employee_id,salary
FROM employees
WHERE salary BETWEEN 4000 AND 8000;
5. IN 运算符
查找在IN列出的数值 有的 全部打印
查找managerID 是否存在IN()列出的数值中 在的全部显示
SELECT employee_id,first_name,salary,manager_id
FROM employees
WHERE manager_id IN (201,101,102);
6. NOT IN 运算符
与上面相反!不在的数值全部打印。
7. LIKE 运算符
匹配字符串,通常用于模糊匹配。
如果给定的值或者匹配条件为NULL,则返回结果为NULL。
“%”:匹配0个或多个字符。
“_”:只能匹配一个字符。
SELECT employee_id,first_name
FROM employees
WHERE first_name LIKE 'J%';
SELECT employee_id,first_name
FROM employees
WHERE first_name LIKE '%et%';
SELECT employee_id,first_name
FROM employees
WHERE first_name LIKE '_ete_';
8. 转义字符 \ 或者 ESCAPE
SELECT job_id
FROM jobs
WHERE job_id LIKE 'HR\_%';
不用\
选择$
作为转义字符 要用关键字ESCAPE
标识 还可以用其他的 比如&
等等
SELECT job_id
FROM jobs
WHERE job_id LIKE 'IT$_%' ESCAPE '$';
逻辑运算符
逻辑运算符的返回结果为1、0或者NULL
- AND 或 &&
并且
SELECT employee_id, salary,job_id
FROM employees
WHERE salary >= 10000
AND job_id LIKE '%MAN%';
2. OR 或 ||
或者
-- 查询基本薪资不在9000-12000之间的员工编号和基本薪资 --
# 四种写法
SELECT employee_id,salary
FROM employees
WHERE NOT (salary BETWEEN 9000 AND 12000);
SELECT employee_id,salary
FROM employees
WHERE salary NOT BETWEEN 9000 AND 12000;
SELECT employee_id,salary
FROM employees
WHERE !(salary BETWEEN 9000 AND 12000);
SELECT employee_id,salary
FROM employees
WHERE salary < 9000 OR salary > 12000;
注意:
OR可以和AND一起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先对AND两边的操作数进行操作,再与OR中的操作数结合。
SELECT employee_id, salary,job_id
FROM employees
WHERE salary >= 10000
OR job_id LIKE '%MAN%';
运算符优先级
数字编号越大,优先级越高,优先级高的运算符先进行计算。
可以看到,赋值运算符的优先级最低,使用“()”括起来的表达式的优先级最高。
四、排序
- 使用 ORDER BY 子句排序
- ASC(ascend): 升序(从小到大
- DESC(descend):降序(从大到小
- ORDER BY 子句在SELECT语句的结尾。
单列排序
SELECT employee_id,first_name,salary
FROM employees
ORDER BY salary DESC; -- 降序(从大到小) --
SELECT employee_id,first_name,salary
FROM employees
ORDER BY salary ASC;-- 默认就是升序 (从小到大)--
双列排序
SELECT employee_id,first_name,department_id,salary
FROM employees
ORDER BY department_id,salary DESC;
在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。
如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
五、分页
使用 LIMIT 实现分页
格式:
LIMIT [位置偏移量,] 行数
第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);
第二个参数“行数”指示返回的记录条数。
举例:
--前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
或者
SELECT * FROM 表名 LIMIT 10;
--第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;
--第21至30条记录:
SELECT * FROM 表名 LIMIT 20,10;
LIMIT [参数一:从哪开始遍历 (不写默认从0) ] , [参数二:需要几条数据];
SELECT *
FROM employees
LIMIT 5,10; -- 从第6条数据开始 打印10条数据 --
需求:每页显示 pageSize 条记录,此时显示第 pageNo 页:
公式:LIMIT (pageNo-1) * pageSize,pageSize
;
另外的写法(MySQL 8.0中可以使用)
SELECT *
FROM employees
LIMIT 3 OFFSET 4; -- 从第五个数据开始(因为从0开始) 打印后面的3条数据 --
SELECT *
FROM employees
LIMIT 4,3; -- 与上面代码执行结果相同 --
注意:LIMIT 子句必须放在整个SELECT语句的最后!
好处:
约束返回结果的数量可以
减少数据表的网络传输量
,也可以提升查询效率
。
如果我们知道返回结果只有 1 条,就可以使用LIMIT 1
,告诉 SELECT 语句只需要返回一条记录即可。
这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。
声明顺序:WHERE … ORDER BY …LIMIT
综合练习
基本的SELECT语句
# 1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY
SELECT employee_id,last_name,salary*12*(1+IFNULL(commission_pct,0)) "ANNUAL SALARY",commission_pct
FROM employees;
# 2.查询employees表中去除重复的job_id以后的数据
SELECT DISTINCT job_id
FROM employees;
# 3.查询工资大于12000的员工姓名和工资
SELECT first_name,last_name,salary
FROM employees
WHERE salary > 12000;
# 4.查询员工号为176的员工的姓名和部门号
SELECT employee_id, first_name,last_name,department_id
FROM employees
WHERE employee_id = 176;
# 5.显示表 departments 的结构,并查询其中的全部数据
DESC departments;
SELECT *
FROM departments;
运算符
# 1.选择工资不在5000到12000的员工的姓名和工资
SELECT first_name,salary
FROM employees
WHERE salary < 5000 OR salary > 12000;
SELECT first_name,salary
FROM employees
WHERE NOT (salary BETWEEN 5000 AND 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 = 20 OR department_id = 50;
SELECT first_name,department_id
FROM employees
WHERE department_id IN (20,50);
# 3.选择公司中没有管理者的员工姓名及job_id
SELECT first_name,job_id,manager_id
FROM employees
WHERE ISNULL(manager_id);
SELECT first_name,job_id,manager_id
FROM employees
WHERE manager_id IS NULL;
# 4.选择公司中有奖金的员工姓名,工资和奖金级别
SELECT first_name,salary,commission_pct
FROM employees
WHERE NOT ISNULL(commission_pct);
SELECT first_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
# 5.选择员工姓名的第三个字母是a的员工姓名
SELECT first_name,last_name
FROM employees
WHERE first_name LIKE '__a%';
SELECT last_name
FROM employees
WHERE last_name LIKE '__a%';
# 6.选择姓名中有字母a和k的员工姓名
SELECT last_name
FROM employees
WHERE last_name LIKE '%A%' AND last_name LIKE '%K%';
SELECT last_name
FROM employees
WHERE last_name LIKE '%A%K%' OR last_name LIKE '%K%A%';
# 7.显示出表 employees 表中 first_name 以 'e'结尾的员工信息
SELECT *
FROM employees
WHERE first_name LIKE '%E';
# 8.显示出表 employees 部门编号在 80-100 之间的姓名、工种
SELECT first_name,job_id,department_id
FROM employees
WHERE department_id BETWEEN 80 AND 100;
# 9.显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、工资、管理者id
SELECT first_name,salary,manager_id
FROM employees
WHERE manager_id IN (100,101,110);
排序与分页
#1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示
SELECT first_name,department_id,salary * 12 AS ANNUAL_SAL
FROM employees
ORDER BY salary DESC,first_name ASC;
#2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据
SELECT first_name,salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000
ORDER BY salary DESC
LIMIT 20,20;
#3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT employee_id,first_name,email,department_id
FROM employees
WHERE email LIKE '%E%'
ORDER BY LENGTH(email) DESC,department_id ASC;
#练习:表里有107条数据,我们只想要显示第 32、33 条数据怎么办呢?
SELECT employee_id,last_name
FROM employees
LIMIT 31,2;
#练习:查询员工表中工资最高的员工信息
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC
#limit 0,1
LIMIT 1;