SELECT last_name, department_id, salary 工资, CASE department_id WHEN30THEN salary*1.1 WHEN40THEN salary*1.2 ELSE salary ENDAS 新工资 FROM employees; # case函数的使用二 # 工资大于20000,显示A级别 # 工资大于15000,显示B级别 # 工资大于10000,显示C级别 SELECT last_name, salary, CASE WHEN salary>20000THEN'A' WHEN salary>15000THEN'B' WHEN salary>10000THEN'C' ELSE'D' ENDAS 工资等级 FROM employees;
# sum求和 SELECTSUM(salary) FROM employees; # avg求平均值 SELECTAVG(salary) FROM employees; # max最大值 SELECTMAX(salary) FROM employees; # min最小值 SELECTMIN(salary) FROM employees;
# count统计有效数据个数(非null值) SELECTCOUNT(salary) FROM employees;
# 和distinct搭配使用,取出重复内容 SELECTSUM(DISTINCT salary),SUM(salary) FROM employees;
# count()函数 SELECTCOUNT(*) FROM employees; # 可以用来统计实际有效行数 SELECTCOUNT(1) FROM employees;
分组查询
语法:
1 2 3 4 5
SELECT 分组函数,列(要求出现在group_by后面) FROM 表 【WHERE 筛选条件】 GROUPBY 分组列表 【ORDERBY 子句】
#错误格式 SELECT NAME,boyName FROM boys,beauty; #正确格式 SELECT NAME,boyName FROM boys,beauty WHERE beauty.boyfriend_id=boys.id;
# 等值连接 SELECT NAME,boyName FROM boys,beauty WHERE beauty.boyfriend_id=boys.id;
# 起别名后进行等值连接 # 起别名后在select语句中的表名也需要修改为别名 SELECT last_name,e.job_id,job_title FROM employees e,jobs j WHERE e.`job_id`=j.`job_id` ;
# 等值查询后可以进行模糊查询等,用AND语句连接即可
# 非等值连接 # 相较于等值查询的主要区别就是替换了查询语句的等于为其他判断符号
# 自连接 # 本质就是只在自己表内部的等值连接 # 查询 员工名和上级名称 SELECT e.employee_id,e.last_name,m.employee_id,m.last_name FROM employees e,employees m WHERE e.`manager_id`=m.`employee_id`;
# sql99语法 /* 语法: SELECT 查询列表 FROM 表1 别名 【连接类型】 JOIN 表2 别名 ON 连接条件 【WHERE 筛选条件】 【GROUP BY 分组】 【HAVING 筛选条件】 【ORDER BY 排序列表】 sql99语法包括(连接类型): 内连接(INNER) 外连接 左外(LEFT 【OUTER】) 右外(LEFT 【OUTER】) 全外(FULL 【OUTER】) 交叉连接(CROSS) */
# 内连接 /* SELECT 查询列表 FROM 表1 别名 INNER JOIN 表2 别名 ON 连接条件; INNER可以省略 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读 */ # 等值连接
# 查询部门名与员工名 SELECT last_name,department_name FROM employees e INNERJOIN departments d ON e.`department_id`=d.`department_id`;
# 查询谁的工资比Abel高 # 1. 查询Abel工资(单行查询) SELECT salary FROM employees WHERE last_name='Abel'; # 2.查询员工信息,满足salary大于1中结果的 SELECT* FROM employees WHERE salary>( SELECT salary FROM employees WHERE last_name='Abel' ); # 子查询内部不需要;作为结束标志
# 非法使用标量子查询 SELECTMIN(salary),department_id FROM employees GROUPBY department_id HAVINGMIN(salary)>( SELECT salary FROM employees WHERE department_id=50 ); # 以上语句会报错,因为子查询语句的结果不为一行一列,所以不能用标量子查询(多行多列或0行0列都不可以)
# 列子查询(多行子查询,因为子查询结果是一列多行) /* 多行操作符: IN/NOT IN 等于/不等于列表中的任意一个 ANY/SOME 和子查询中的某个值作比较,例如15>ANY(40,10,25),因为15>10所以上式成立 ALL 和子查询返回的所有值比较,例如15>ANY(40,10,25),因为40>15所以上式不成立 */
# 返回location_id是1400或1700的部门中的员工姓名 # 1. location_id是1400或1700的部门号 SELECT department_id FROM departments WHERE location_id IN(1400,1700);
# 2. 查询符合条件的员工姓名 SELECT last_name FROM employees WHERE department_id IN( SELECT department_id FROM departments WHERE location_id IN(1400,1700) );
# 行子查询(一行多列或多行多列)
# 查询员工编号最小并且工资最高的员工信息(不一定存在同时满足两个条件的员工) # 1. 查询最小的员工编号 SELECTMIN(employee_id) FROM employees # 2. 查询最高工资 SELECTMAX(salary) FROM employees # 3. 查询同时满足这两个条件的员工 SELECT* FROM employees WHERE employee_id=( SELECTMIN(employee_id) FROM employees )AND( SELECTMAX(salary) FROM employees ); # 利用行子查询代替上式 SELECT* FROM employees WHERE (employee_id,salary)=( SELECTMIN(employee_id),MAX(salary) FROM employees )
# 放在SELECT后面
# 查询每个部门员工个数 SELECT d.*,( SELECTCOUNT(*) FROM employees e WHERE e.`department_id`=d.`department_id` ) FROM departments d;
# 放在from后面
# 查询每个部门的平均工资等级 # 1. 查询每个部门的平均工资 SELECTAVG(salary),department_id FROM employees GROUPBY department_id; # 2. 查询工资等级 SELECT ag_dep.*,g.`grade_leve` FROM ( SELECTAVG(salary) ag,department_id FROM employees GROUPBY department_id ) ag_dep # 起别名 INNERJOIN job_grades g ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
# exists后面(相关子查询) /* 语法:EXISTS(完整查询语句) 结果只有0或1 */ # 判断employees中是否存在employee_id这一列 SELECTEXISTS(SELECT employee_id FROM employees); # 判断是否存在工资为30000的人 SELECTEXISTS(SELECT employee_id FROM employees WHERE salary=30000);
# 分页查询 /* 应用场景: 当要显示的数据,一夜显示不全,需要分页提交sql请求 语法: SELECT 查询列表 FROM 表名 【JOIN TYPE join 表2 ON 连接条件 WHERE 筛选条件 GROUP BY 分组字段 HAVING 分组后的筛选 ORDER BY 排序的字段】 LIMIT offset,zize; offset表示条目的起始索引(起始索引从0开始) size表示要显示的条目个数 LIMIT 语句放在查询语句的最后 */