进阶1:基础查询
目录
/*
语法:
select 查询列表
from 表名;
特点:
1、查询列表可以是表中字段、常量值、表达式、函数
2、查询结果是一个虚拟的表格
*/
USE myemployees;
1.查询单个字段
SELECT last_name FROM employees;
2.查询多个字段
SELECT
last_name,
salary,
email
FROM
employees ;
3.查询所有字段
SELECT
`first_name`,
`last_name`,
`email`,
`phone_number`,
`job_id`,
`salary`,
`commission_pct`,
`manager_id`,
`department_id`,
`hiredate`
FROM
employees ; #顺序与表可不一致,鼠标双击左栏里的表,最后按F12
SELECT * FROM employees; #顺序与表完全一致
4.查询常量值
SELECT 100;
SELECT "john";
5.查询表达式
SELECT 100%98;
6.查询函数
SELECT VERSION();
7.起别名
/*
便于理解
区分重名的情况
*/
SELECT 100%98 AS 结果;
SELECT last_name AS 姓;
SELECT last_name 姓; #as可省略
SELECT salary AS "out put" FROM employees;
8.去重
#案例:查询员工表涉及到的部门编号
SELECT DISTINCT department_id FROM employees;
#不可以像下面这样,得到的结果不规则
select distinct a,b from c;
9.+的作用
/*
java中的+ 运算符 连接符
MySQL中的+ 仅运算符
字符+数字: 试图将字符型数值转换为数值型
成功 继续加
失败 字符型数值转换为0
一方为null,结果必为null
*/
#案例:查询员工和姓名连城一个字段,并显示为姓名
SELECT last_name+first_name AS 姓名 FROM employees;#错误的方法
#concat函数,拼接字符
SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;#正确的方法
#ifnull函数,判断字段或表达是否为null,是则返回指定值,否则返回原本的值
SELECT ifnull(commission_pct,0) FROM employees;
进阶2:条件查询
/*
语法:
select 查询列表
from 表名
where 筛选条件;
分类:
1、按条件表达式筛选
条件运算符:> < = <> >= <= != <=>
2、按逻辑表达式筛选
逻辑运算符:&& || !
and or not
3、模糊查询:
like
between and | not between and
in
is null | is not 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:工资1w到2w之间的员工名、工资以及奖金
SELECT `last_name`,`salary`,`commission_pct`FROM employees WHERE salary>10000&&salary<20000;
#案例2:查询部门编号不是90~110之间,或工资高于1.5w的员工信息
SELECT * FROM employees WHERE department_id<90 OR `department_id`>110 OR salary >= 15000;
3、模糊查询
/*
like 可判断字符型或数值型
与通配符搭配:%任意多个字符,包括0个
_任意单个字符
between and
提高简洁度,包含临界值,临界值顺序固定
in
提高简洁度,判断是否属于IN列表中的某一项,IN列表内值类型兼容,不支持通配符
is null 或 is not null
判断null值,<> 或 = 不能用于判断null值,可读性高,建议使用
<=> 既可以判断null,也可判断普通数值,可读性较低
*/
like
#案例1:查询员工名包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE "%a%";
#案例2:查询员工名第三个字符为n,第五个为l的员工信息
SELECT * FROM employees WHERE last_name LIKE "__n_l%";
#案例3:查询员工名中第二个字符为_的员工名,加转义字符\
SELECT last_name FROM employees WHERE last_name LIKE "_\_%";
between and
#案例:查询员工编号100~120的员工信息
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
in
#案例:查询员工工种编号是 IT_PROG、AD_VP、AD_PRES的一个的员工名和工种编号
SELECT last_name, job_id FROM employees WHERE job_id IN('IT_PROG','AD_VP','AD_PRES');
is null
#案例:查询没有/有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
安全等于 <=>
#可判断null和普通类型的值
#案例:查询工资为12000的员工信息
SELECT last_name,salary FROM employees WHERE salary <=> 12000;
经典面试题
试问:select * from employees;和
select * from employees where last_name like “%%”;
结果是否一样?
答:字段值有null则不一样!
进阶3:排序查询
/*
语法:
select 查询列表
from 表名
(where 筛选条件)
order by 排序列表 (asc|desc);
特点:
asc升序 desc降序 不写则默认升序
order by 子句支持多字段,表达式,函数,别名
order by 子句一般放在最后面,limit子句除外
*/
#案例1:查询员工信息,工资从高到低
SELECT * FROM employees ORDER BY salary DESC;
#案例2:查询部门编号>=90的员工信息,入职时间先后排序,【筛选后排序】
SELECT * FROM employees WHERE department_id >= 90 ORDER BY `hiredate`;
#案例3:按年薪高低显示员工信息和年薪,【按表达式排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0));
#案例4:【按别名排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪;
#案例5:按姓名长度排序显示员工姓名和工资,【按函数排序】
SELECT LENGTH(last_name) 字节长度,last_name,salary
FROM employees
ORDER BY LENGTH(last_name);
#案例6:员工信息,先按工资,再按编号,【按多个字段排序】
SELECT * FROM employees
ORDER BY salary DESC,`employee_id`;