### 2.9、基本SELECT语句的课后练习
```mysql
#题目1:查询员工12个月工资的总和,并起别名为ANNUAL SALARY,写法如下:
SELECT employee_id ,last_name,
salary * 12 AS "ANNUAL SALARY"
FROM employees;
#题目2:查询employees表中去除重复的job_id以后的数据,写法如下:
SELECT DISTINCT job_id
FROM employees;
#题目三:查询工资大于12000的员工姓名和部门号,写法如下:
SELECT employee_id ,last_name
FROM employees
WHERE salary>12000;
#题目四:查询员工号为176的员工姓名和部门号
SELECT last_name,employee_id
FROM employees
WHERE employee_id = 176;
#第五题:显示表departments 的结构,并查询其中的全部数据
DESC departments;
SELECT * FROM departments;
```
## 3、运算符
### 3.1、算数运算符
* 就是简单的加减乘除,这块就不演示了
### 3.2、比较运算符
* 比较运算符用来对表达式左边操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况返回NULL;比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符合条件的结果记录;
* = <=> <> != < <= > >= ;分别是等于,安全等于,不等于,小于,小于等与,大于,大于等于,举例如下:
```mysql
SELECT 1 = 2,1!=2,1='1',1='a',0='a'
FROM DUAL; #字符串存在隐式转换,如果隐式转换不成功则看做是0
SELECT 'a' ='a','ab' ='ab','a' = 'b'
FROM DUAL; #两边都是字符串的话,则按照ANST的比较规则来比较
```
* <=> (意为安全等于,就是为NULL而生的)
* 为什么这么说呢,因为其他的运算符只要有NULL参与进来结果都是为NULL
* 但有了这个符号,我们就可以利用这个符号去判断有NULL的情况
* 实际场景中表中肯定会有NULL的数据,我们也需要这个符号去查询有关于NULL的数据
* 比如呢?比如我想查询表中commisssion_pct为NULL的数据,那么,写法如下:
```mysql
SELECT *
FROM employees
WHERE commission_pct <=> null; #加上此运算符就可以查出employees表中数据commission——pct字段为NULL的数据了
```
* IS NULL \ IS NOT NULL \ ISNULL
* 以上对三个关键字进行解读,IS NULL 就是查询为空的数据,作用与<=>作用一致
```mysql
SELECT *
FROM employees
WHERE commission_pct IS NULL; # 作用也是查询表的commission_pct字段中为NULL的数据
```
* IS NOT NULL 则跟他相反,即查询不为空的数据;
```mysql
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL; #作用就是查询employees表中数据commission_pct字段不为NULL的数据
```
* ISNULL则与<=> 、 IS NULL的作用相同,都是表示为空的,但是与之不同的地方是,ISNULL更像是一个方法
```mysql
SELECT *
FROM employees
WHERE ISNULL(commission_pct); #作用与IS NULL和<=>的作用一致,但ISNULL更像是一种函数(方法)
```
* 防止绕晕!!!!!当需求是要求查询为空的时候,就使用IS NULL ,反之,需要查询不为空的时候,就使用IS NOT NULL;
* LEAST() \ GREATEST 即最大和最小值,写法为:
* GREATEST则和它相反
```mysql
SELECT LEAST(first_name,last_name),LEAST(LENGTH(first_name),LENGTH(last_name))
FROM employees; #意为比较两边字符串哪边更短,后面函数的时候会具体讲到
```
* BETWEEN (条件一) AND (条件二) (查询条件一和条件二范围内的数据,注意这块是包含边界的数据)
* 实际应用场景:查询工资在6000到八千之间的员工信息;写法如下:
```mysql
SELECT employee_id,last_name,salary
FROM employees
WHERE salary BETWEEN 6000 AND 8000; #BETWEEN意为查询工资6000到八千的区间信息
```
* 当然,使用逻辑运算符来表示也是可以的,逻辑运算符的写法如下:
```mysql
SELECT empkoyee_id,last_name,salary
FROM employees
WHERE salary >=6000 && salary<=8000; #这块的作用跟BETWEEN的作用是一样的
```
* 但还有一种场景,就是当把6000和八千互换位置时,数据表是查不到任何数据的
![image-20220912234557401](https://xujicheng.oss-cn-guangzhou.aliyuncs.com/picture/typoraimage-20220912234557401.png)
* 所以由此得出结论,6000的位置是上界标,8000的位置是下界标,可以理解为上限或者下限,所以交换了他们的位置变查询不到
* 还有一种实际场景:查询工资不在6000到8000的员工信息,写法如下:
```mysql
SELECT last_name,employee_id,salary
FROM employees
WHERE salary NOT BETWEEN salary 8000; #即在BETWEEN前加上关键字NOT就可以实现该需求
SELECT last_name,employee_id,salary
FROM employees
WHERE salary < 6000 OR salary > 8000; #当然使用or关键字也能实现同样的效果
```
* IN / NOT IN (与BETWEEN不同的是,BETWEEN表示的是一种范围,而IN和NOT IN 表示的是一种零散的数值
* 实际场景:查询部门为10、20、30的员工信息,根据题目需求,得出这块要用到 IN ,写法如下:
```mysql
SELECT department_id,last_name,salary
FROM employees
WHERE department_id IN (10,20,30) #其中需要查询的数据需放入括号中否则就会报错
SELECT last_name,salary,department_id
FROM employees
WHERE department_id = 10 OR department_id = 20 OR department_id =30; #两种写法的作用一致,但不可直接用OR拼接
```
* 实际场景:查询工资不是6000,7000,8000的员工信息,写法如下:
```mysql
SELECT last_name,department_id,salary
FROM employees
WHERE salary NOT IN (6000,7000,8000); #NOT IN 即不在,和IN的作用是相反的
```
* LIKE ,模糊查询,当你只记得表中某一字段或者某一字母的时候,就可以使用模糊查询
* 实际场景:查询last_name中包含'a'的员工信息;写法如下
```mysql
SELECT last_name, salary,department_id
FROM employees
WHERE last_name LIKE '%a%'; #其中%代表不确定个数的字符,即字符a前有0个或多个字符,a后面也有0个或多个字符
```
* 以上是单个字符查询,现在还有一种需求是要查询包含字符 'a' 且包含字符 'e'的数据,写法如下:
```mysql
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%' AND last_name LIKE '%e%'; #这样写查出来的数据就包含字符'a'且包含字符'e'
```
* 还有一种场景即查询员工表中第二个字符是 'a'的数据,写法如下:
```mysql
SELECT last_name
FROM employees
WHERE last_name LIKE '_a%'; # _ :的作用是表示一个不确定的字符,用此符号可表示指定位置,有点不清楚,再举例
```
* 查询员工表数据中第三个字符是 'a' 的数据,写法如下:
```mysql
SELECT last_name
FROM employees
WHERE last_name LIKE '__a%' #加上一个下划线表示第二个字符,查询第三个字符就多加上一个下划线,表示第三个字符带a的数据
```
* 查询员工表中第二个字符是 _ 且第三个字符是 'a' 的员工信息,这个时候我们就需要用到转义字符,写法如下:
```mysql
SELECT last_name
FROM employees
WHERE last_name LIKE '_\_a%'; #此处使用转义字符即可转义,因为需求中是明确第二个字符为下划线,所以需要转义后才能使用
```
* REGEXP \ RLIKE : 正则表达式,正则表达式就不再是模糊查询,而是精确到某一位置 '^' 则表示头,'$'则表示尾,举例如下:
```mysql
SELECT last_name
FROM employees
WHERE last_name RLIKE '^a'; #以a字符开头,注:要带上关键字RLIKE
SELECT last_name
FROM employees
WHERE last_name RLIKE 'a$' #以a字符结尾的数据
SELECT last_name
FROM employees
WHERE last_name RLIKE 'a' #即包含字符a的数据
```
### 3.3、逻辑运算符
* NOT或 !、AND或&& 、OR或||
* 上面有举例场景,我这块就把语句重新打一遍即可
```mysql
SELECT last_name,department_id
FROM employees
WHERE department_id = 10 OR department_id =20; #OR关键字可替换为||
SELECT last_name,department_id,salary
FROM employees
WHERE department_id = 60 AND salary > 8000; #AND关键字可替换为&&
SELECT last_name,salary
FROM employees
WHERE salary NOT IN(1000); #NOT关键字可替换为!
```
### 3.4、运算符的课后练习
```mysql
#题目1:选择工资不在5000到12000的员工姓名和工资
SELECT last_name,salary
FROM employees
WHERE salary NOT BETWEEN 5000 AND 8000;
#题目二:选择在20或50号部门的员工姓名和部门号
SELECT last_name,department_id
FROM employees
WHERE department_id IN (20,50);
#题目三:选择公司中没有管理者的员工姓名和job_id
SELECT last_name,job_id,department_id
FROM employees
WHERE department_id IS NULL;
#题目四:选择公司中有奖金的员工姓名,工资和奖金级别
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
#题目五:选择员工姓名中第三个字母是a的员工姓名
SELECT last_name
FROM employees
WHERE last_name LIKE '__a%';
#题目六:选择姓名中带有字母a和k的员工姓名
SELECT last_name
FROM employees
WHERE last_name RLIKE 'a' AND last_name RLIKE 'k';
#题目七:显示出表employees表中first_name 以'e'字符结尾的员工信息
SELECT first_name
FROM employees
WHERE first_name RLIKE 'e$';
#题目八:显示出表employees部门编号在80-100之间的姓名,工种
SELECT last_name,job_id,department_id
FROM employees
WHERE department_id BETWEEN 80 AND 100;
#题目九:显示出表employees的manager_id是100,101,110的员工姓名、工资、管理者id
SELECT last_name,salary,employee_id,manager_id
FROM employees
WHERE manager_id IN (100,101,110);
```