第二章 DQL语言的学习一(基础、条件、排序查询)
准备工作
第一、在做查询时,需要打开指定的库,
第二、着重号,表示这是一个字段,
第三、执行的时候选中打算执行的命令。
2.1 基础查询
语法:选择、过滤、查看
select 查询列表 from 表名
特点:
(1)查询列表可以是:表中的字段、常量值、表达式、函数
(2)查询的结果是一个虚拟的表格
# 进阶1:基础查询
use myemployees;
#1.查询表中的单个字段
select last_name from employees;
#2.查询表中的多个字段
select last_name,email,salary from employees;
#3.查询表中的所有字段
#方式一
select
`employee_id`, `first_name`, `last_name`,
`email`, `phone_number`, `job_id`,
`salary`, `commission_pct`, `manager_id`,
`department_id`, `hiredate`
from
employees;
#方式二
select * from employees;
#4.查询常量值
select 100;
select 'john';
#5.查询表达式
select 100*98;
select 100%98;
#6.查询函数
select version();
7.为字段起别名
(1)便于理解
(2)如果要查询的字段有重名的情况,使用别名可以区分开来
#方式一
select 100%98 as 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
#方式二
select last_name 姓,first_name 名 from employees;
#案例:查询salary,显示结果为 out put
/* 如果别名中有特殊符号,例如空格等,加双引号 */
select salary as "out put" from employees;
#8.去重 distinct
#案例:查询员工表中涉及到的所有的部门编号
select distinct department_id from employees;
9.+号的作用
Java中+号的作用:
(1)运算符,两个操作数都为数值型
(2)连接符,只要有一个操作数为字符串
mysql中的+号:只有一个功能————运算符 select 100+90;
select ‘123’+90;其中一方为字符型,试图将字符型数值转换成数值型,如果转换成功,则继续做加法运算。
select ‘john’+90; 如果转换失败,则将字符型数值转换为0
select null+32;只要其中一方为null,则结果肯定为null
#案例:查询员工名和员工姓连接成一个字段并显示为 姓名
select last_name+first_name as 姓名 from employees; #运行错误
# concat函数:拼接字符
select concat ('a','b','c') as 结果;
select concat (last_name,first_name) as 姓名 from employees;
课后习题
#1.下面的语句是否可以执行成功
SELEcT last_name ,job_id,salary AS sa1
FROM employees;
#2.下面的语句是否可以执行成功
SELECT * FROM employees;
#3.找出下面语句中的错误 使用了中文的双引号,','用了中文的
SELECT employee_id,last_name,
salary *12 "ANNUAL SALARY"
FROM employees;
#4.显示表departments的结构,并查询其中的全部数据
desc departments;
select * from departments;
#5.显示出表employees中的全部job id(不能重复)
select distinct job_id from employees;
#6.显示出表employees的全部列,各个列之间用逗号连接,列头显示成OUT_PUT
#ifnull函数:判断某字段或表达式是否为null,如果为null,返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) as 奖金率,commission_pct from employees;
select concat(`first_name`,',',`last_name`,',',`email`,',',`phone_number`,',',
`job_id`,',',`salary`,',',ifnull(commission_pct,0)) as out_put
from employees;
2.2 条件查询
语法:
select 查询列表 from 表名 where 筛选条件;
执行顺序:先执行from表名,然后执行筛选条件,最后执行查询
分类:
1. 按条件表达式筛选(条件运算符:>、<、=、<>或!=不等于、>=、<=)
2. 按逻辑表达式筛选(逻辑运算符,用于连接条件表达式:与‘and &&’、或‘or ||’、非‘not !’)
3. 模糊查询(like、between and、in、is null)
#1.按条件表达式筛选
#案例1:查询工资>12000的员工信息
SELECT * FROM employees WHERE salary>12000;
#案例2:查询部门编号不等于90号的员工名和部门编号
SELECT `last_name`,`department_id` FROM employees WHERE department_id<>90;
#2.按逻辑表达式筛选
#案例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;
3.模糊查询
like、between and、in、is null
(1)like,一般和通配符搭配使用
通配符:
- &:任意多个字符,包含0个字符
- _:任意单个字符,1个字符
#案例1:查询员工名中包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';
#案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
SELECT `last_name`,`salary` FROM employees WHERE last_name LIKE '__n_l%';
#案例3:查询员工名中第二个字符为_的员工名(通过转义的方式)
SELECT `last_name` FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';
(2)between and
① 使用between and可以提高语句的简洁度
② 包含临界值
③ 两个临界值不能调换顺序
#案例1:查询员工编号在100~120之间的员工信息
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
#----------------------------------
SELECT * FROM employees WHERE employee_id >= 100 AND employee_id <= 120;
(3)in
- 含义:用于判断某字段的值是否属于in列表中的某一项
- 特点: ①使用in可以提供语句简洁度
②in列表的值类型必须统一或兼容
③里面不能使用通配符
#案例1:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个的员工名和工种编号
SELECT `last_name`,`job_id` FROM employees WHERE job_id IN ('IT_PROT','AD_VP','AD_PRES');
#--------------------------------------
SELECT `last_name`,`job_id` FROM employees WHERE job_id ='IT_PROT' OR job_id ='AD_VP'OR job_id='AD_PRES';
(4)is null
- =或<>不能用于判断null值
- is null或is not null可以判断null值
is null 和 <=> 对比
is null:仅仅可以判断null值,可读性较高(建议使用)
<=>:既可以判断null值,还可以判断普通的数值,可读性较低
#案例1:查询没有奖金的员工名和奖金率
SELECT `last_name`,`commission_pct` FROM employees WHERE commission_pct IS NULL;
#案例1:查询有奖金的员工名和奖金率
SELECT `last_name`,`commission_pct` FROM employees WHERE commission_pct IS NOT NULL;
#安全等于 <=> 判断是否等于
#案例1:查询没有奖金的员工名和奖金率
SELECT `last_name`,`commission_pct` FROM employees WHERE commission_pct <=> NULL;
#案例1:查询工资为12000的员工信息
SELECT * FROM employees WHERE salary <=> 12000;
课后习题:
#1.查询员工号为176的员工的姓名、部门号和年薪
SELECT last_name,department_id,
salary *12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
WHERE employee_id=176;
#2.查询没有奖金,且工资小于18000的员工的工资和姓名
SELECT last_name,salary FROM employees WHERE commission_pct IS NULL AND salary<18000;
#3.查询employees表中,job_id不为'IT'或者工资为12000的员工信息
SELECT * FROM employees WHERE job_id <> 'IT' OR salary=12000;
#4.查看部门department表的结构
DESC departments;
#5.查询部门department表中涉及到了哪些位置编号
SELECT DISTINCT location_id FROM departments;
/*6.select * from employees; 和
select * from employees where commission_pct like '%%' and last_name like '%%';
select * from employees where commission_pct like '%%' or last_name like '%%';
结果是否一样?并说明原因
不一样,如果判断的字段有null值,结果就不一样
第三行与第一行结果一样
*/
2.3 排序查询
-
语法:
SELECT 查询列表 FROM 表 [WHERE 筛选条件] ORDER BY 排序列表 ASC|DESC;
-
特点:
- ASC代表升序,DESC代表降序
- 不写默认升序
- ORDER BY子句中可以支持单个字段、多个字段、表达式、函数、别名
- ORDER BY子句一般放在查询语句的最后。执行顺序:FROM、WHERE、SELECT、ORDER BY
#案例1:查询员工信息,要求工资从高到低排序
SELECT * FROM employees ORDER BY salary DESC;
SELECT * FROM employees ORDER BY salary ASC;
#案例2:查询部门编号>=90的员工信息,要求按入职时间先后排序(添加筛选条件)
SELECT * FROM employees WHERE department_id>=90 ORDER BY hiredate ASC;
#案例3:按年薪的高低显示员工的信息和年薪,按表达式排序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
#案例4:按年薪的高低显示员工的信息和年薪,按别名排序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC;
#案例5:按姓名的长度显示员工的姓名和工资,按函数排序
SELECT LENGTH(last_name) 字节长度,last_name,salary
FROM employees
ORDER BY 字节长度 DESC;
#案例6:查询员工信息,要求先按工资升序排序,再按员工编号降序排序,按多个字段排序
SELECT *
FROM employees
ORDER BY salary ASC,employee_id DESC;
课后习题:
#1.查询员工的姓名、部门编号和年薪,按年薪降序,按姓名升序排列
SELECT last_name, department_id, salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC,last_name ASC;
#2.选择工资不在8000-17000的员工的姓名和工资,按工资降序排列
SELECT last_name,salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000
ORDER BY salary DESC;
#3.查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT * ,LENGTH(email)
FROM employees
WHERE email LIKE '%e%'
ORDER BY LENGTH(email) DESC,department_id ASC;