# 查询员工工资在6000-10000的员工的信息 SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees WHERE SALARY>6000AND SALARY<10000; # 查询员工工资在9000 或 10000的员工的信息 SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees WHERE SALARY=9000OR SALARY=10000; # 查询员工工资不是10000的员工的信息 SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees WHERE SALARY!=10000; SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees WHERENOT SALARY=10000;
3.3 不等值判断(> 、< 、>= 、<= 、!= 、<>)
1 2 3
#查询员工的薪资在6000~10000之间的员工信息(编号,名字,薪资) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees WHERE SALARY>6000AND SALARY<10000;
3.4 区间判断(between and)
1 2
#查询员工的薪资在6000~10000之间的员工信息(编号,名字,薪资) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees WHERE SALARY BETWEEN6000AND10000;
注意:在区间判断语法中
闭区间,包含区间边界的两个值;
顺序不能颠倒:小值在前,大值在后,反之,得不到正确结果。
3.5 NULL 值判断(IS NULL、IS NOT NULL)
列名 IS NULL
列名 IS NOT NULL
1 2 3 4 5 6 7 8 9
# 查询经理编号为null的员工信息 SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, MANAGER_ID FROM t_employees WHERE MANAGER_ID ISNULL; # 查询经理编号不为null的员工信息 SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, MANAGER_ID FROM t_employees WHERE MANAGER_ID ISNOTNULL; # 查询经理编号为null以外员工信息(NOT为取反,两个结果) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, MANAGER_ID FROM t_employees WHERENOT MANAGER_ID ISNULL;
3.6 枚举查询( IN (值 1,值 2,值 3 ) )
1 2 3
# 查询部门编号为70, 80, 90的员工信息 - 枚举查询(不冗余,效率低) SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, DEPARTMENT_ID FROM t_employees WHERE DEPARTMENT_ID IN(70,80,90); # ()中值之间的关系是 or 的关系
注:in的查询效率较低,建议使用多条件拼接。
3.7 模糊查询
LIKE _ (_ 代表单个任意字符,_ 的数量就代表字符的数量,模糊内容、精确长度)
列名 LIKE 'S_' 以s开头长度2 _S 以s结尾长度2 _S_中间s长度为3
LIKE %(% 代表任意长度的任意字符,0~n个)
列名 LIKE 'S%'以s开头的 %S 以s结尾的 %S%只要有s的
注意:模糊查询只能和 LIKE 关键字结合使用
两者可以混合灵活使用
1 2 3 4 5 6 7
# 查询名字以"S"开头的员工信息,长度为 5 个字符(编号,名字,薪资 , 部门编号) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID FROM t_employees WHERE FIRST_NAME LIKE'S_____';
# 查询名字以"S"开头的员工信息(编号,名字,薪资 , 部门编号) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID FROM t_employees WHERE FIRST_NAME LIKE'S%';
1 2 3 4 5 6 7 8 9
# 全字段模糊查询(包含 "蓝" 的字) + 连表查询 + 排序 + 分页 SELECT*FROM (SELECT*FROM tb_stu, tb_grade WHERE tb_stu.gId = tb_grade.gradeId) AS fullTable WHERE (stuName LIKE'%蓝%') OR (stuBirthday LIKE'%蓝%') OR (stuHobby LIKE'%蓝%') OR (stuAge LIKE'%蓝%') ORDERBY stuId LIMIT 0,10;
Java Dao 层 sql 语句拼接注意事项:
3.8 分支结构查询
语法:CASE WHEN 条件 THEN 结果 … END
CASE
? WHEN 条件1 THEN 结果1
? WHEN 条件2 THEN 结果2
? WHEN 条件3 THEN 条件3
? ELSE 结果x
END
注意:通过使用CASE END进行条件判断,每条数据对应生成一个值。
经验:类似 Java 中的switch。
1 2 3 4 5 6 7 8 9 10
#查询员工信息(编号,名字,薪资 , 薪资级别<对应条件表达式生成>) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, CASE WHEN SALARY>=10000THEN'A' WHEN SALARY>=8000AND SALARY<10000THEN'B' WHEN SALARY>=6000AND SALARY<8000THEN'C' WHEN SALARY>=2000AND SALARY<6000THEN'D' ELSE'E' ENDAS'薪资级别' FROM t_employees ORDERBY 薪资级别; # 顺便排个序
# 1.先查询到 Bruce 的工资(一行一列) SELECT SALARY FROM t_employees WHERE FIRST_NAME ='Bruce'; #工资是 6000 # 2.查询工资大于 Bruce 的员工信息 SELECT*FROM t_employees WHERE SALARY >6000; # 3.将 1、2 两条语句整合 SELECT*FROM t_employees WHERE SALARY > (SELECT SALARY FROM t_employees WHERE FIRST_NAME ='Bruce' );
注意:将子查询 “一行一列”的结果作为外部查询的条件,做第二次查询;
子查询得到一行一列的结果,才能作为外部查询的等值或不等值判断条件。
12. 子查询(作为枚举查询条件)
语法:SELECT 列名 FROM 表名 WHERE 列名 IN(子查询结果列);
12.1 查询与姓’King’同一部门的员工信息
1 2 3 4 5 6 7 8 9
#思路: # 1.先查询 King 所在的部门编号(多行单列) SELECT DEPARTMENT_ID FROM t_employees WHERE LAST_NAME='King'; # 80,90 # 2.将80、90作为枚举查询条件 SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees WHERE DEPARTMENT_ID IN(80,90); # 整合:查询与姓'King'同一部门的员工信息 SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, DEPARTMENT_ID, SALARY FROM t_employees WHERE DEPARTMENT_ID IN(SELECT DEPARTMENT_ID FROM t_employees WHERE LAST_NAME='King'); #N行一列
将子查询 多行单列的结果作为外部查询的枚举查询条件,做第二次查询
12.2 工资高于60部门所有人的信息
1 2 3 4 5 6 7 8
# 1.查询部门编号为 60 的工资信息 SELECT SALARY FROM t_employees WHERE DEPARTMENT_ID=60; # 2.整合:查询高于部门 60 的员工工资的所有人的信息(ALL)——高于所有 SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees WHERE SALARY >ALL(SELECT SALARY FROM t_employees WHERE DEPARTMENT_ID=60); # 2.整合:查询高于部门 60 的员工工资的所有人的信息(ANY)——高于部分 SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees WHERE SALARY >ANY(SELECT SALARY FROM t_employees WHERE DEPARTMENT_ID=60);
注意:当子查询结果集形式为多行单列时可以使用 ANY 或 ALL 关键字
13. 子查询(作为一张表)
SELECT 列名 FROM (子查询结果表) AS 表别名;
13.1 查询员工表中工资排名前 5 名的员工信息
1 2 3 4 5 6 7 8
# 思路: # 查询员工表中工资排名前 5 的员工信息 # 1.先对所有员工依据工资进行排序,生成表(多行多列) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees ORDERBY SALARY DESC; # 2.将子查询得到的结果做二次查询,查前 5 行(字表需要定义别名,如 tmp) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM (SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM t_employees ORDERBY SALARY DESC) AS tmp LIMIT 0,5;
# 1.查询两张表所有有部门的员工信息(不包括没有部门的员工) # MySQL 标准 SELECT EMPLOYEE_ID, FIRST_NAME, DEPARTMENT_NAME FROM t_employees, t_departments WHERE t_employees.`DEPARTMENT_ID` = t_departments.`DEPARTMENT_ID`; # SQL 标准【通用】 # 注意:① 两张表查询,要有关联条件。但关联条件的列重复了,需要明确查询是哪个表的列 # 注意:② 表名比较长,表名多次重复出现容易混淆,可以给表一个别名 SELECT EMPLOYEE_ID, FIRST_NAME, d.`DEPARTMENT_ID`, DEPARTMENT_NAME FROM t_employees AS e INNERJOIN t_departments AS d ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
# 2.查询两张表所有岗位的员工信息,显示岗位名称 SELECT EMPLOYEE_ID, FIRST_NAME, j.`JOB_ID`, JOB_TITLE FROM t_employees AS e INNERJOIN t_jobs AS j ON e.`JOB_ID` = j.`JOB_ID`; # 列内容元素重合
经验: SQL 标准,与其他关系型数据库通用
15.2 三表连接查询(INNER JOIN … INNER JOIN … ON …)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# 三表连接查询 >> # 查询所有员工工号、名字、部门名称、部门所在国家ID SELECT EMPLOYEE_ID, FIRST_NAME, DEPARTMENT_NAME, CITY FROM t_employees AS e INNERJOIN t_departments AS d # 中间表承上启下 ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID` # 元素重合列 INNERJOIN t_locations AS l ON d.`LOCATION_ID` = l.`LOCATION_ID`; # 元素重合列
# 多表连接查询 >> # 查询所有员工工号、名字、部门名称、部门所在城市、城市所在国家 SELECT EMPLOYEE_ID, FIRST_NAME, DEPARTMENT_NAME, CITY, COUNTRY_NAME FROM t_employees AS e INNERJOIN t_departments AS d # 中间表承上启下 ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID` # 元素重合列 INNERJOIN t_locations AS l # 中间表承上启下 ON d.`LOCATION_ID` = l.`LOCATION_ID` # 元素重合列 INNERJOIN t_countries AS c ON l.`COUNTRY_ID` = c.`COUNTRY_ID`; # 元素重合列
经验:多表查询时,需要明确哪个表与其他表之间有关联的列(列元素重合)
15.3 左外连接(LEFT JOIN … ON …)
1 2 3 4
# 查询所有员工信息,以及所对应的部门名称(没有部门的员工,也在查询结果中,部门名称以 NULL 填充) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_NAME FROM t_employees AS e LEFTJOIN t_departments AS d ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`; # 匹配项,左表为主
注意:左外连接,是以左表为主表,依次向右匹配,匹配到,返回结果
匹配不到,则返回 NULL 值填充
15.4 右外连接(RIGHT JOIN … ON …)
1 2 3 4
# 查询所有部门信息,以及此部门中的所有员工信息(没有员工的部门,也在查询结果中,员工信息以 NULL 填充) SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_NAME FROM t_employees AS e RIGHTJOIN t_departments AS d ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`; # 匹配项,右表为主