7.1数据库表的基本结构
关系结构数据库是以表格(Table)进行数据存储,表格由“行和“列”组成。
执查询语句返回的结果集是一张虚拟表。
7.1.1基本查询: SELECT 列名 FROM 表名
1、查询部分列(姓名,学号) SELECT name,num FROM students
2、查询全部列(所有属性) SELECT * FROM students
注意:工作环境下,优先使用列名查询。* 的方式需转换成全列名,效率低,可读性差。
7.2对列中数据进行运算
+ - * /
例1、SELECT ID,NAME,salary*12 FROM t_employees;
SELECT ID AS'编号’,NAME AS'姓氏’,salary*12 AS' 年薪’ FROM t_employees;
SELECT DISTINCT manager id FROM t_employees; DISTINCT 去除重复,查询管理者人数
7.3排序查询
语法:SELECT 列名 FROM 表名 ORDER BY 排序列[排序规则]
ASC升序 DESC降序
按工资从小到大排序: SELECT ID,salary FROM t_employees ORDER BY salary ASC;
多条件排序: SELECT ID,salary FROM t_employees ORDER BY salary DESC,ID DESC;(工资降序,ID升序) 先按照第一个ORDER BY执行,然后再执行第二个
7.4 条件查询
语法:SELECT 列名 FROM 表名 WHERE 条件
7.4.1 等值判断(=) 前后相等
查询工资为11000的员工信息:
SELECT EMPLOYEE_ ID,FIRST_NAME,salary
FROM t_employees
WHERE salary =11000;
7.4.2 逻辑判断(AND OR NOT)
SELECT EMPLOYEE_ ID,FIRST_NAME,salary
FROM t_employees
WHERE salary =11000 AND COMMISSION_PCT=0.30;
7.4.3 不等值判断(>、<、>=、<=、‘!=、<>’)
SELECT EMPLOYEE_ ID,FIRST_NAME,salary
FROM t_employees
WHERE salary != 11000 ;
WHERE salary <> 11000 ;
WHERE salary >= 6000 AND salary <= 11000;
7.4.4 区间判断(between and)
SELECT EMPLOYEE_ ID,FIRST_NAME,salary
FROM t_employees
WHERE salary BETWEEN 6000 AND 11000 ; 前面小值,后面大值
7.4.5 NULL值判断(IS NULL 、 IS NOT NULL)
SELECT EMPLOYEE_ ID,FIRST_NAME,salary
FROM t_employees
WHERE commission_pct IS NULL ; 不能用 ‘= NULL’
7.4.6 枚举查询(IN(值1,值2,值3))
#查询部门编号为70、80、90的员工信息(编号,名字,薪资,部门编号)
SELECT employee_id,first_name,salary,department_id
FROM t_employees
WHERE department_id IN(70,80,90); 注:in的查询效率较低,可通过多条件拼接。
7.4.7 模糊查询(LIKE)
#查询名字以“L“开头的员工信息(编号,名字,薪资,部门编号)
SELECT employee_id,first_name,salary,department_id FROM t_employees
WHERE first_name LIKE ‘L%’;
#查询名字以“L“开头并且长度为4的员工信息(编号,名字,薪资,部门编号)
SELECT employeeid,first_name,salary,department_id FROM t_employees
WHERE first_name LIKE 'L___'; (3个下划线)
7.4.8 分支结构查询
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
ELSE 结果
END
#查询员工信息(编号,名字,薪资,薪资级别<对应条件表达式生成>)
SELECT employee_id,first_name,salary,department_id,
CASE
WHEN salary >=10000 THEN 'A'
WHEN salary>=8000 AND salary < 10000 THEN 'B'
WHEN salary>=6000 AND salary < 8000 THEN 'C'
WHEN salary>=4000 AND salary < 6000 THEN 'D'
ELSE 'E'
END AS "薪资级别"
FROM t_employees; CASE...END 会生成一个独立的列, AS 将其命名
7.5 时间查询
执行时间查询函数,会自动生成一张虚拟表(1行1列)
#当前系统时间 SELECT SYSDATE();
#当前系统日期 SELECT CURDATE();
#当前系统时间 SELECT CURTIME();
#获取指定日期为一年中的第几周 SELECT WEEK(SYSDATE());
#获取指定日期中的年份 SELECT YEAR('2020-4-1');
#获取小时值 SELECT HOUR(CURTIME());
#获取分钟值 SELECT MINUTE(CURTIME());
#指定日期之间的相隔天数 SELECT DATEDIFF('2020-4-1','2019-4-1');
#计算Date日期加上N天后的日期 SELECT ADDDATE('2020-4-1',4);
7.6 字符串查询
1.多个字符串拼接 SELECT CONCAT('MY','S','QL')
SELECT CONCAT(FIRST NAME,LAST NAE)AS'姓名’ FROM t_employees;
2.字符串替换
SELECT INSERT('这是一个数据库,3,2,MySQL'); # 参数3为开始位置,参数2为len长度
执行结果:这是MYSQL数据库
3.字符串转换大小写
SELECT LOWER('MYSQL'); 结果: mysql
SELECT UPPER('mysql'); 结果: MYSQL
4.指定内容截取
SELECT SUBSTRING('JavaMySQLOracle',5,5); 执行结果:MySQL 从5位置开始向后截5个
7.7 聚合函数 自动忽略NULL值,不进行统计
SUM() AVG() MAX() MIN() COUNT()求总行数
SELECT SUM(salary)FROM t_employees; #求单列所有数据的和
SELECT AVG(salary)FROM t_employees; #求单列所有数据的平均值
7.8分组查询 GROUP BY
在WHERE之后生效
#查询各部门的总人数
SELECT department_ID,COUNT(EMPLOYEE_ID)
FROM t_employees GROUP BY DEPARTMENT_ID;
#查询各部门的平均薪资
SELECT department_ID,AVG (salary)
FROM t_employees GROUP BY DEPARTMENT_ID;
# 查询各个部门,各岗位的人数
SELECT DEPARTMENT_ID,JOB_ID,COUNT(EMPLOYEE_ID)
FROM t_employees GROUP BY DEPARTMENT_ID, job_id;
分组查询中,select显示的列只能是分组依据列,或者聚合函数列,不能出现其他列。
7.9 分组过滤查询 'HAVING 过滤规则'
语法:SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组列 HAVING 过滤规则
# 统计部门为60,70,90的最高工资
SELECT DEPARTMENT_ID,MAX(salary)
FROM t_employees GROUP BY DEPARTMENT_ID HAVING DEPARTMENT_ID IN(60,70,90);
7.10 限定查询 'LIMIT 起始行,查询行数'
#查询前五条
SELECT * FROM t_employees LIMIT 0,5;
·注意:起始行是从0开始,代表了第一行。第二个参数代表的是从指定行开始查询几行
典型应用
分页查询,一页显示10条,一共查询3页
SELECT * FROM t_employees LIMIT 0,10;
SELECT * FROM t_employees LIMIT 10,10;
SELECT * FROM t_employees LIMIT 20,10;
7.11 查询总结
1. 语句编写顺序
SELECT 列名 FROM 表名 WHERE 条件
GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列(asc|desc) LIMIT 起始行,总条数
2. 执行顺序
1. FROM:指定数据来源表
2. WHERE:对查询数据做第一次过滤
3. GROUP BY:分组
4. HAVING:对分组后的数据第二次过滤
5. SELECT:查询各字段的值
6. ORDER BY:排序
7. LIMIT:限定查询结果
参考: 数据库知识整理