1、myemployees.sql
库的介绍
选中主机名称,右键执行SQL脚本,选择myemployees.sql
数据库,点击执行,然后刷新就能看到该数据库了。
employees(员工表)、departments(部门表)、locations(位置表)、jobs(工种表)信息介绍:
2、数据查询语言(DQL)学习
- 基础查询
- 条件查询
- 排序查询
- 单行函数
- 分组函数
- 分组查询
- 连接查询
- 子查询
- 分页查询
- union联合查询
2.1 基础查询
#进阶1:基础查询
/*
语法:
SELECT 查询列表 from 表名;
特点:
1、通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
2、查询列表:表中的字段、常量值、表达式、函数
*/
USE myemployees;
#1、查询表中的单个字段
SELECT last_name FROM employees;
#2、查询表中的多个字段
SELECT last_name,salary,email FROM employees;
#3、查询表中的所有字段
#(双击一下想查询的就行,不用自己输入,然后选中F12格式化格式,更好看)
#着重号(`)可以去掉,不去掉也行
SELECT
`first_name`,
`last_name`,
`email`,
`phone_number`,
`job_id`,
`salary`,
`commission_pct`,
`manager_id`,
`department_id`,
`hiredate`
FROM
employees ;
#3、方法2(不足:查询的顺序和原始库中的一模一样)
SELECT * FROM employees;
#4、查询常量值
SELECT 100;
SELECT ‘john’;
#5、查询表达式
SELECT 100*98;
#6、查询函数
SELECT VERSION();
# 7、起别名
/*
1、便于理解
2、如果要查询的字段有重名的情况,使用别名可以区分开
*/
#方法1:使用as
SELECT 100*98 AS 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
#方法2:去掉as即可
SELECT last_name 姓,first_name 名 FROM employees;
#案例:查询salary,显示结果为out put
SELECT salary AS OUT put FROM employees; # 报错
SELECT salary AS "OUT put" FROM employees;
#8、去重
# 案例:查询员工表中涉及到的所有的部门编号
SELECT department_id FROM employees;
SELECT DISTINCT department_id FROM employees;
#9、+号的作用
/*
mysql中的加号只有一个功能:运算符(两个操作数都为数值型)
select 100+90; 两个操作数都为数值型,则做加法
select '123'+90; 其中一方是字符型,将试图将字符型数值转换成数值型(这个可以转换成成功)
select 'john'+90; 如果转换失败,就将字符型转换成0
select null+90; 只要其中一方为null,则结果肯定为null
*/
#案例:查询员工名和姓连接成一个字段,并显示成 姓名
SELECT
last_name + first_name AS 姓名
FROM
employees ;
# mysql里面做拼接使用concat,不使用+号
SELECT CONCAT('a','b','c') AS 拼接;
SELECT
CONCAT(last_name, first_name) AS 姓名
FROM
employees ;
#10、显示表departments的表结构,并查询其中的全部数据
DESC departments;
SELECT * FROM departments;
#11、显示表employees中的部分列,各个列之间用逗号连接,列头显示成out_put
SELECT
CONCAT(
`first_name`,
',',
`last_name`,
',',
`email`
) AS out_put
FROM
employees ;
#11.2 如果列中有数据是null,则利用concat返回的是null,所以需要判断一下
#用到ifnull函数,如果为null返回指定的值,否则返回原来的值
SELECT
IFNULL(`commission_pct`, 0) AS 奖金率,
commission_pct
FROM
employees ;
SELECT
CONCAT(
`first_name`,
',',
`last_name`,
',',
`email`,
',',
IFNULL(`commission_pct`,0)
) AS out_put
FROM
employees ;
2.2 条件查询
#进阶2:条件查询
/*
语法:
select
查询列表
from
表名
where
筛选条件;
分类:
一、按条件表达式筛选
条件运算符:> < = !=(mysql独有的不等于<>,因此不建议使用!=) >= <=
二、按逻辑表达式筛选
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true
三、模糊查询
like
between and
in
is null
*/
#一、按条件表达式筛选
#案例1:查询工资>120000的员工信息
SELECT
*
FROM
employees
WHERE
salary>12000;
#案例2:查询部门编号不等于90号的员工名和部门编号
SELECT
last_name,
department_id
FROM
employees
WHERE
department_id<>90;
#二、按逻辑表达式筛选
#案例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
salary>=15000 OR NOT(department_id>=90 AND department_id<=110);
#三、模糊查询
/*
like:
一般与通配符搭配使用
%(任意多个字符,包含0个)%
_任意单个字符
*/
#案例1:查询员工名中包含字符au的员工信息
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '%au%'
#案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
SELECT
last_name,
salary
FROM
employees
WHERE
last_name LIKE '__n_l%';
#案例3:查询员工名中第2个字符为_的员工名和工资,自定义转义字符
SELECT
last_name,
salary
FROM
employees
WHERE
last_name LIKE '_$_%' ESCAPE '$';
#案例4:查询有奖金率的员工like会把null去掉的
SELECT
`commission_pct`
FROM
employees
WHERE
`commission_pct` LIKE '%%';
#2.between and
/*
提高语句的简洁度;
包含临界值;
两个临界值不能调换顺序
*/
#案例1:查询员工编号在100-120之间的员工信息
SELECT
*
FROM
employees
WHERE
#employee_id >= 120 and employee_i <= 100 ;
employee_id BETWEEN 100 AND 120 ;
#3、in
/*
含义:判断某字段的值是否属于in列表中的某一项
特点:
使用in更简洁
in列表的值类型必须统一或者兼容
*/
#案例1:查询员工的工种编号IT_PROG\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' ;
job_id IN('IT_PROG','AD_VP','AD_PRES');
#4、is null
/*
> < = <>不能判断null值,可以判断数值等其他类型的
is null 或者 is not null 仅仅可以判断null,不可以判断其他(is 1200)是不行的。
<=>:安全等于,既可以判断数值,也可以判断null(可读性差,不建议使用)
*/
#案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
commission_pct <=>NULL;
#案例2:查询工资为12000的员工名和工资
SELECT
last_name,
salary
FROM
employees
WHERE
#salary IS 12000; 报错
salary =12000;
salary <=>12000;
#测试
# 1\查询员工工号为176的姓名,部门号,年薪
SELECT
last_name,
department_id,
employee_id,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees
WHERE
employee_id=176
注意:
ifnull:判断是否为null,如果是null,返回指定的值,否则返回原来的值;
isnull:判断是否为null,如果是返回1,否则返回0;
2.3 排序查询
# 进阶3:排序查询
/*
语法:
select 查询列表
from 表
【where 筛选条件】
order by 排序列表 【asc升序|desc降序】默认是升序
特点:
order by可以支持单个字段、多个字段、表达式、函数、别名
order by一般放在查询语句的最后面,limit子句除外
*/
# 案例1:查询员工信息,要求工资从高到低排序
SELECT last_name,salary FROM employees ORDER BY salary DESC;
# 案例2:查询部门编号>=90的员工信息,按入职时间先后排序
SELECT
last_name,
department_id,
hiredate
FROM
employees
WHERE department_id>=90
ORDER BY hiredate ASC;
# 案例3:按照年薪的高低显示员工的信息和年薪(将by后面的表达式换成“年薪”也可以)
SELECT
last_name,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
# 案例4:按照姓名的长度显示员工的姓名和工资(按函数排序)
SELECT
LENGTH(last_name) AS 字节长度,
last_name,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees
ORDER BY 字节长度 DESC;
# 案例5:先按工资升序排序,再按照员工编号降序排序
SELECT
employee_id,
last_name,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees
ORDER BY 年薪 ASC,employee_id DESC;