1.分组与过滤

  1. where 过滤条件
  2. group by 字段1,字段2,...
  3. */
  4. #求各部门中最高的薪水
  5. SELECT department_id, MAX(salary)
  6. FROM employees
  7. WHERE department_id IS NOT NULL
  8. GROUP BY department_id;
  9. #求各部门中最高的薪水,按照最高薪水排序
  10. SELECT department_id, MAX(salary)
  11. FROM employees
  12. WHERE department_id IS NOT NULL
  13. GROUP BY department_id
  14. ORDER BY MAX(salary);
  15. #求各部门中各工种的平均薪水
  16. SELECT department_id,job_id,AVG(salary)
  17. FROM employees
  18. WHERE department_id IS NOT NULL
  19. GROUP BY department_id,job_id;
  20. # 求10,20,30号部门的平均薪水,并要求平均薪水>4200
  21. /*
  22. where和having的区别?
  23. 1.where后面不能出现组函数,having后面可以出现组函数
  24. 2.where在group by的前面,having在group by的后面
  25. */
  26. #方式一:效率更高
  27. SELECT department_id, AVG(salary)
  28. FROM employees
  29. WHERE department_id IN(10,20,30)
  30. GROUP BY department_id
  31. HAVING AVG(salary)>4200;
  32. #方式二:
  33. SELECT department_id, AVG(salary)
  34. FROM employees
  35. GROUP BY department_id
  36. HAVING AVG(salary)>4200 AND department_id IN(10,20,30);

GROUP BY
HAVING

注意2:一旦select后面出现组函数(聚合函数,多行函数)就不能再出现其它字段。
除非该字段也出现在group by的后面。

where和having的区别?
1.where后面不能出现组函数,having后面可以出现组函数
2.where在group by的前面,having在group by的后面。
3.一般先用where过滤完分组字段再用having过滤别的字段

2.子查询

  1. /*
  2. 子查询:在一个查询语句a中可以再嵌套一个查询语句b,那么b语句叫作子查询(内查询)
  3. a语句叫作主查询(外查询)
  4. 子查询分类 :单行子查询 vs 多行子查询
  5. 单行子查询 :子查询的结果只有一条
  6. 多行子查询 :子查询的结果有多条
  7. 单行子查询使用的运算符 := <> > >= < <=
  8. 多行子查询使用的运算符 :in any all
  9. 查询语句在执行时会先执行子查询再执行主查询。
  10. */
  11. #案例 :谁的工资比 Abel 高?
  12. #方式一:①先查出Abel工资 ②再查出比Abel高的工资
  13. SELECT salary
  14. FROM employees
  15. WHERE last_name='Abel'; #11000
  16. SELECT last_name,salary
  17. FROM employees
  18. WHERE salary > 11000;
  19. #方式二:自连接
  20. SELECT e.`last_name`,e.`salary`
  21. FROM employees e JOIN employees e2
  22. ON e.`salary`>e2.`salary` AND e2.`last_name`='Abel';
  23. #方式三:子查询
  24. SELECT last_name,salary
  25. FROM employees
  26. WHERE salary > (
  27. SELECT salary
  28. FROM employees
  29. WHERE last_name='Abel'
  30. )
  31. #题目:返回job_id与141号员工相同,salary比143号员工多的员工
  32. # 姓名,job_id 和工资
  33. #方式一:
  34. #1.先查出141号员工的job_id
  35. SELECT job_id
  36. FROM employees
  37. WHERE employee_id=141;#ST_CLERK
  38. #2.再查出143号员工的薪水
  39. SELECT salary
  40. FROM employees
  41. WHERE employee_id=143;#2600
  42. #3.再查出结果
  43. SELECT last_name,job_id,salary
  44. FROM employees
  45. WHERE job_id='ST_CLERK' AND salary>2600;
  46. #方式二
  47. SELECT last_name,job_id,salary
  48. FROM employees
  49. WHERE job_id=(
  50. SELECT job_id
  51. FROM employees
  52. WHERE employee_id=141
  53. ) AND salary>(
  54. SELECT salary
  55. FROM employees
  56. WHERE employee_id=143
  57. );
  58. #题目:返回公司工资最少的员工的last_name,job_id和salary
  59. #方式一:
  60. #1.先获取最低工资
  61. SELECT MIN(salary)
  62. FROM employees; #2100
  63. #2.再根据最低工资查出相应信息
  64. SELECT last_name,job_id,salary
  65. FROM employees
  66. WHERE salary=2100;
  67. #方式二:
  68. SELECT last_name,job_id,salary
  69. FROM employees
  70. WHERE salary=(
  71. SELECT MIN(salary)
  72. FROM employees
  73. );
  74. #题目:查询最低工资大于50号部门最低工资的部门id和其最低工资
  75. SELECT department_id,MIN(salary)
  76. FROM employees
  77. WHERE department_id IS NOT NULL
  78. GROUP BY department_id
  79. HAVING MIN(salary) > (
  80. #50号部门最低薪水
  81. SELECT MIN(salary)
  82. FROM employees
  83. WHERE department_id=50
  84. );
  85. #多行子查询
  86. #题目:返回其它部门中比job_id为‘IT_PROG’部门任一工资低的员工的员
  87. # 工号、姓名、job_id 以及salary
  88. SELECT employee_id,last_name,job_id,salary
  89. FROM employees
  90. WHERE salary <ANY(
  91. #job_id为IT的薪水
  92. SELECT DISTINCT salary
  93. FROM employees
  94. WHERE job_id='IT_PROG'
  95. ) AND job_id <> 'IT_PROG';
  96. #题目:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工
  97. # 的员工号、姓名、job_id 以及salary
  98. SELECT employee_id,last_name,job_id,salary
  99. FROM employees
  100. WHERE salary <ALL(
  101. #job_id为IT的薪水
  102. SELECT DISTINCT salary
  103. FROM employees
  104. WHERE job_id='IT_PROG'
  105. ) AND job_id <> 'IT_PROG';

子查询:在一个查询语句a中可以再嵌套一个查询语句b,那么b语句叫作子查询(内查询)
a语句叫作主查询(外查询)

子查询分类 :单行子查询 vs 多行子查询

单行子查询 :子查询的结果只有一条
多行子查询 :子查询的结果有多条

单行子查询使用的运算符 := <> > >= < <=
多行子查询使用的运算符 :in(等值) any all

—All:对所有数据都满足条件,整个条件才成立,例如:5大于所有返回的id
—Any:只要有一条数据满足条件,整个条件成立,例如:3大于1,2

查询语句在执行时会先执行子查询再执行主查询。

3.库操作

  1. #笛卡尔集的错误。
  2. #导致的原因:缺少连接条件或连接条件错误
  3. SELECT e.`first_name`,d.`department_name`
  4. FROM employees e,departments d;
  5. #查看所有的库
  6. SHOW DATABASES;
  7. #选库
  8. USE 库名;
  9. #创建库:create database [if not exists] 库名 [character set '编码集']
  10. CREATE DATABASE db;
  11. #if not exists :如果库不存在则创建,存在则不创建。如果没有该字段库存在则报错。
  12. CREATE DATABASE IF NOT EXISTS db;
  13. #character set '编码集' :指定库的编码集
  14. CREATE DATABASE db2 CHARACTER SET 'gbk';
  15. #查看库的信息
  16. SHOW CREATE DATABASE db2;
  17. #修改库的编码集
  18. ALTER DATABASE db CHARACTER SET 'utf8';
  19. #删除库:drop database [if exists] 库名
  20. #if exists :库存在则删除不存在则不删,如果没有该字段库不存在则报错。
  21. DROP DATABASE IF EXISTS db;

SHOW USE
CREAT DATABASE IF NOT EXISTS
CREAT DATABASE CHARACTER SET’GBK’
SHOW CREATE DATABASE
ALTER DATABASE CHARACTER SET’GBK’
DROP DATABASE IF EXISTS

4.表操作

  1. #查看表
  2. SHOW TABLES;
  3. #查看表的信息
  4. SHOW CREATE TABLE emp2;
  5. #查看表结构
  6. DESC emp;
  7. #创建表
  8. #方式一:白手起家
  9. #注意:表的默认编码集和库的编码集相同。
  10. CREATE TABLE emp(
  11. id INT,
  12. ename VARCHAR(20) #注意:最后一个字段没有","号
  13. )
  14. #IF NOT EXISTS :表不存在则创建,存在则不创建。如果没有该字段表存在则报错。
  15. CREATE TABLE IF NOT EXISTS emp2(
  16. id INT,
  17. ename VARCHAR(20) #注意:最后一个字段没有","号
  18. )CHARACTER SET 'utf8';
  19. #方式二:基于查询的结果创建一张新表
  20. CREATE TABLE emp3
  21. SELECT employee_id,first_name
  22. FROM myemployees.`employees`; #夸库读表 :库名.表名
  23. #方式三:根据现有表的结构创建一张新表(没有内容)
  24. CREATE TABLE emp4 LIKE myemployees.employees;
  25. #删除表
  26. #IF EXISTS : 如果表存在则删除不存在则不删,如果没有该字段表不存在则报错。
  27. DROP TABLE IF EXISTS emp4;

SHOW TABLES
SHOW CREATE TABLE
DESC
#创建表

方式一:白手起家
注意:表的默认编码集和库的编码集相同。
CREATE TABLE emp(
id INT,
ename VARCHAR(20) #注意:最后一个字段没有”,”号
)
IF NOT EXISTS; :表不存在则创建,存在则不创建。如果没有该字段表存在则报错。
CHARACTER SET ‘utf8’;

方式二:基于查询的结果创建一张新表
CREATE TABLE emp3
SELECT employee_id,first_name
FROM myemployees.employees; #夸库读表 :库名.表名

方式三:根据现有表的结构创建一张新表(没有内容)
CREATE TABLE emp4 LIKE myemployees.employees;

删除表
#IF EXISTS : 如果表存在则删除不存在则不删,如果没有该字段表不存在则报错。
DROP TABLE IF EXISTS emp4;

5.表字段操作2

  1. /*
  2. 对表中的字段进行添加,修改,删除的操作
  3. alter table 表名 add/change/modify/drop .......
  4. */
  5. #添加字段
  6. ALTER TABLE emp ADD eage INT;
  7. #修改字段的名字:ALTER TABLE 表名 CHANGE 原字段名 新字段名 字段的类型;
  8. ALTER TABLE emp CHANGE eage age INT;
  9. #修改字段的类型:很危险的一件事
  10. ALTER TABLE emp MODIFY age INT;
  11. #删除字段
  12. ALTER TABLE emp DROP age;
  13. #修改表的名字
  14. ALTER TABLE emp RENAME TO employee;
  15. #清空表中的内容
  16. TRUNCATE TABLE emp3;

ALTER TABLE ADD
ALTER TABLE CHANGE
ALTER TABLE MODIFY
ALTER TABLE DROP
ALTER TABLE RANAME TO
TRUNCATE TABLE