Mysql基础学习(一)-DQL
本文章用到的sql
链接: https://pan.baidu.com/s/1U6ntr8fTdOO0SYRxJWQqVA 提取码: 9yji 复制这段内容后打开百度网盘手机App,操作更方便哦
mysql的语法规范
- 不区分大小写,但建议关键字大写,表名、列名小写
- 每条命令最好用分号结尾
- 每条命令根据需要,可以进行缩进或者换行
- 注释
- 单行注释:# 注释文字
- 单行注释:-- 注释文字
- 多行注释:/* 注释文字 */
DQL语言的学习
基础查询
语法
select 查询列表 from 表名;
特点
- 查询列表可以是:表中的字段、常量值、表达式、函数
- 查询的结果是一个虚拟的表格
查询表中的单个字段
SELECT last_name FROM employees;
查询表中的多个字段
SELECT last_name,salary,email FROM employees;
查询表中的所有字段
SELECT * FROM employees;
查询常量值
SELECT 100
SELECT 'john';
查询表达式
SELECT 100%98;
查询函数
SELECT VERSION();
起别名
SELECT 100%98 AS 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
SELECT last_name 姓,first_name 名 FROM employees;
去重
SELECT DISTINCT department_id FROM employees;
+号的作用
案例:查询员工名和姓连接成一个字段,并显示为姓名
SELECT last_name+first_name 姓名 FROM employees;(错)
+号仅有一个功能:运算符
-
SELECT 100+90; 两个操作数都为数值型,则做加法运算
-
SELECT ‘123’+90; 其中一方为字符型,视图将字符型数值转换成数值型,如果转换成功,则继续做加法运算
-
SELECT ‘john’+90; 如果转换失败,则将字符值转换成0;
-
SELECT null + 10; 只要其中一方为null,则结果肯定为null
正确写法
SELECT CONCAT(last_name,first_name) 姓名 FROM employees;
条件查询
语法
SELECT 查询列表 FROM 表名 WHERE 筛选条件;
分类
- 按条件表达式筛选
- 条件运算符:< > = != <> >= <=
- 按逻辑表达式筛选
- 逻辑运算符:&& || ! AND OR NOT
- 模糊查询
- like
- between and
- in
- is null
按条件表达式筛选
查询工资>12000的员工信息
SELECT
*
FROM
employees
WHERE
salary > 12000
查询部门编号不等于90号的员工名和部门编号
SELECT
last_name,
department_id
FROM
employees
WHERE
department_id <> 90
按逻辑表达式筛选
查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
salary BETWEEN 10000 AND 20000
查询部门编号不是在90到110之间,或者工资高于15000的员工
SELECT
*
FROM
employees
WHERE
department_id NOT BETWEEN 90 AND 110 OR salary > 15000
模糊查询
查询员工名中包含字符a的员工信息
SELECT
*
FROM
employees
WHERE
last_name like '%a%'
- like 一般和通配符搭配使用
- % 任意多个字符,包含0个字符
- _任意单个字符,
查询员工名中第二个字符为o,第五个字符为h的员工名和工资
SELECT
last_name,
salary
FROM
employees
WHERE
last_name like '_o__h%';
查询员员工名中第二个字符为_的员工名
SELECT
last_name,
salary
FROM
employees
WHERE
last_name like '_\_%';
-----------------------------------------------
SELECT
last_name,
salary
FROM
employees
WHERE
last_name like '_$_%' ESCAPE '$';#定义转义字符为'$';
查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个的员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN('IT_PROG','AD_VP','AD_PRES')
查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL
安全等于 <=>
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct <=> NULL
查询员工号为176的员工的姓名和部门号和年薪
SELECT
last_name,
department_id,
salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM
employees
WHERE
employee_id = 176
经典面试题
SELECT * FROM employees;
和
SELECT * FROM employees where commission_pct like '%%' and last_name like '%%';
结果是否一样?并说明原因
不一样,通配符不会匹配null
排序查询
语法
SELECT 查询列表
from 表
[WHERE 筛选条件]
ORDER BY 排序列表 [asc|desc]
查询员工信息,要求工资从高到低排序
SELECT
*
FROM
employees
ORDER BY
salary DESC;
查询部门编号>=90的员工信息,按入职时间的先后顺序进行排序
SELECT
*
FROM
employees
WHERE
department_id >= 90
ORDER BY
hiredate
按表达式排序,按年薪的高低显示员工的信息和年薪
SELECT
*,
salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM
employees
ORDER BY
salary*12*(1+IFNULL(commission_pct,0))
或者
SELECT
*,
salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM
employees
ORDER BY
年薪
按函数排序,按姓名的长度显示员工的姓名和工资
SELECT
last_name,
salary
FROM
employees
ORDER BY
LENGTH(last_name)
按多个字段排序,查询员工信息,要求先按工资排序,再按员工编号排序
SELECT
*
FROM
employees
ORDER BY
salary ASC,
employee_id DESC
案例测试
查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序
SELECT
last_name,
department_id,
salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM
employees
ORDER BY
年薪 DESC,
last_name ASC;
选择工资不在8000到17000的员工的姓名和工资,按工资降序
SELECT
last_name,
salary
FROM
employees
WHERE
salary NOT BETWEEN 8000 AND 17000
ORDER BY
salary DESC
查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT
*
FROM
employees
WHERE
email LIKE '%e%'
ORDER BY
LENGTH(email) DESC,
department_id ASC