作者:就叫易易好了
日期:2020/10/24 程序员节
注:以下案例均基于myemployees数据库,获取方式可以看我MySQL学习笔记(一)
语法:
select
查询列表
from
表名
where
筛选条件;
执行顺序:
先执行的是表名,因为要先看数据库里面是否有这个表,再根据条件来筛选,再查询该列表,也就是说书写顺序与查询顺序不一样。
分类:
按条件表达式筛选
条件运算符:
< > = ! = <> >= <=
按逻辑表达式筛选
逻辑运算符:
&& || !
and or not
&&和and:两个条件都为true,结果为true,反之则为false
||或or:只要有一个条件为true,结果为true,反之则为false
!或not:如果;连接的条件本身为fasle,结果为true,反之为false
#案例1:查询工资>12000的员工
SELECT
*
FROM
employees
WHERE
salary>12000;
(此语句用到的条件运算符为">")
#案例2:查询部门编号不等于90号的员工名和部门编号
SELECT
last_name,
department_id
FROM
employees
WHERE
department_id!=90;
(此指令用到的条件运算符为"!=",在MySQL中,不等号最好用"<>"代替)
#案例1:查询工资在10000到20000之间的员工名,工资以及奖金
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
salary>=10000
AND
salary<=20000
#案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE
department_id<=90 OR department_id>=110
OR
salary>15000
也可以将WHERE语句写成
WHERE
NOT(department_id>=90 AND department_id<=110)
需要用到的语句:
like
between and
in
is null|is not null
特点:一般与通配符搭配使用
通配符:
“%”表示任意多个字符,包含0个字符(以该字符开头的关键词)
“_”表示任意单个字符
#案例1:查询员工名中包含字符a的员工信息
SELECT
*
FROM
employees
WHERE
last_name
LIKE
'%a%';
#案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
SELECT
last_name,
salary
FROM
employees
WHERE
last_name
LIKE
'__e_a%';
#案例3:查询员工名中第二个字符为_的员工名
SELECT
last_name
FROM
employees
WHERE
last_name
LIKE
'_/_%';
(此时/为转义字符,将第二个下划线从通配符转移成普通字符)
这里也可以自定义转移符,用ESCAPE函数
LIKE
'_#_%' ESCAPE '#';
使用between and可以提高语句简洁度
包含and前后的临界值
两个临界值的顺序不能颠倒
#案例:查询员工编号在100到120之间的员工信息
SELECT
*
FROM
employees
WHERE
employee_id BETWEEN 100 AND 120
用于判断某字段的值是否属于in列表中的某一项
使用in比使用or更提高了语句简洁性
in列表的类型必须统一或兼容
#案例:查询员工的工种编号是IT_PROG、AD_VP、AD_PRES
中的一个员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN('IT_PROG','AD_VP','AD_PRES');
注意:in语句不支持通配符,比如上面的那个语句,如果为了省事将’AD_VP’,‘AD_PRES’写成’AD_%’,该语句是识别不了的。
=或者<>不能用于判断null值
#案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct is NULL;
#案例2:查询有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct is NOT NULL;
SELECT * FROM employees
该语句查询出来的结果顺序与数据库里面的一模一样,但在实际应用中,多数要对查询的数据进行排序,所以此时我们要引入一个排序的条件。
SELECT * FROM employees
order by 排序列表 asc/desc
asc为升序,desc为降序,如果不写,默认是升序
order by子句中可以支持单个字段,多个字段,表达式,函数,别名
order by语句一般放在查询语句的最后边
#案例1:查询员工信息,要求工资从高到低排序
SELECT
*
FROM
employees
ORDER BY
salary DESC;
#案例2:查询部门编号>=90的员工信息,按入职时间的先后排序
SELECT
*
FROM
employees
WHERE
department_id>=90
ORDER BY
hiredate ASC;
#案例3:按年薪的高低显示员工的信息和年薪
法一:
SELECT
*,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees
ORDER BY
salary*12*(1+IFNULL(commission_pct,0)) DESC;
(此案例用到的方法是按表达式排序)
#案例4:按年薪的高低显示员工的信息和年薪
法二:
SELECT
*,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees
ORDER BY
年薪 DESC;
(此案例用到的方法是按别名排序)
#案例5:根据员工姓名的长度来显示员工姓名和工资
SELECT
LENGTH(last_name) as 字节长度,
last_name,
salary
FROM
employees
ORDER BY
LENGTH(last_name) DESC;
(按函数排序)
#案例6:查询员工信息,要求先按工资排序,再按员工编号排序
SELECT
*
FROM
employees
ORDER BY
salary ASC,employee_id DESC;
(按多个字段排序)