sqlmysql

进阶1:基础查询

语法
**SELECT * | {[DISTINCT] column | expression[alias], ...}**
**FROM table;**
类似于:System.out.println(打印东西);
特点

  1. 查询列表可以是:表中的字段、常量值、表达式、函数
  2. 查询的结果是一个虚拟的表格 ```sql USE myemployees;

1.查询表中的单个字段

SELECT last_name FROM employees;

2.查询表中的多个字段

SELECT last_name, salary, email FROM employees;

3.查询表中的所有字段

方式一:

SELECT employee_id, first_name, last_name, phone_number, last_name, job_id, phone_number, job_id, salary, commission_pct, manager_id, department_id, hiredate FROM employees;

方式二:

SELECT * FROM employees;

4.查询常量值

SELECT 100; SELECT ‘john’;

5.查询表达式

SELECT 100%98;

6.查询函数

SELECT VERSION();

7.起别名

/ ①便于理解 ②如果要查询的字段有重名的情况,使用别名可以区分开来 ③匹配javabean属性 /

方式一:使用as

SELECT 100%98 AS 结果; SELECT last_name AS 姓,first_name AS 名 FROM employees;

方式二:使用空格

SELECT last_name 姓,first_name 名 FROM employees;

案例:查询salary,显示结果为 out put

SELECT salary AS “out put” FROM employees; #单引号也行

8.去重

DISTINCT🔴

案例:查询员工表中涉及到的所有的部门编号

SELECT DISTINCT department_id FROM employees;

  1. <a name="4Y7az"></a>
  2. #### +号的作用
  3. java中的+号<br />①运算符,两个操作数都为数值型<br />②连接符,只要有一个操作数为字符串<br />mysql中的+号<br />**仅仅只有一个功能:运算符**
  4. | select 100+90; | 两个操作数都为数值型,则做加法运算 |
  5. | --- | --- |
  6. | select '123'+90; | **只要其中一方为字符型,试图将字符型数值转换成数值型**。如果转换成功,则继续做加法运算 |
  7. | select 'john'+90; | 如果转换失败,则将字符型数值转换成0 |
  8. | select null+10; | **只要其中一方为null,则结果肯定为null** |
  9. `**CONCAT()**` <br />`**ISNULL()**` 判断某字段或表达式是否为null,是返回1,否则返回0 <br />`**IFNULL(expression, alt_value)**` 如果第一个参数的表达式 expression 为 null,则返回第二个参数的备用值
  10. ```sql
  11. SELECT CONCAT('a','b','c') AS 结果;
  12. #案例:查询员工名和姓连接成一个字段,并显示为 姓名
  13. SELECT CONCAT(last_name, first_name) AS 姓名
  14. FROM employees;
  15. #ISNULL() 判断某字段或表达式是否为null,是返回1,否则返回0

练习

  1. #1.下面的语句是否可以执行成功
  2. SELECT last_name, job_id, salary AS sal
  3. FROM employees;
  4. #2.下面的语句是否可以执行成功
  5. SELECT * FROM employees;
  6. #3.找出下面语句中的错误
  7. SELECT employee_id, last_name salary * 12 AS "ANNUAL SALARY"
  8. FROM employees;
  9. #4.显示表departments的结构,并查询其中的全部数据
  10. DESC departments;
  11. SELECT * FROM departments;
  12. #5.显示出表employees中的全部job_id(不能重复)
  13. SELECT DISTINCT job_id FROM employees;
  14. #6.显示出表employees的全部列,各个列之间用逗号连接,列头显示成OUT_PUT
  15. SELECT IFNULL(commission_pct, 0) AS 奖金率, commission_pct FROM employees;
  16. SELECT CONCAT(first_name, ',', last_name, ',', job_id, ',',
  17. IFNULL(commission_pct, 0)) AS out_put
  18. FROM employees;

进阶2:条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法
**select 查询列表**
**from 表名**
**where 筛选条件;**
分类

  • 按条件表达式筛选

image.png

  • 按逻辑表达式筛选

逻辑运算符作用:用于连接条件表达式
image.png
&& 和 and 两个条件都为true,结果为true,反之为false
|| 或 or 只要有一个条件为true,结果为true,反之为false
! 或 not 如果连接的条件本身为false,结果为true,反之为false

  • 模糊查询

012F4E94-7F7B-4324-BFFC-FE1B30926252.png

  1. #一、按条件表达式筛选
  2. #案例1:查询工资>12000的员工信息
  3. SELECT *
  4. FROM employees
  5. WHERE salary > 12000;
  6. #案例2:查询部门编号不等于90号的员工名和部门编号
  7. SELECT last_name, department_id
  8. FROM employees
  9. WHERE department_id <> 90;
  10. #二、按逻辑表达式筛选
  11. #案例1:查询工资z在10000到20000之间的员工名、工资以及奖金
  12. SELECT last_name, salary, commission_pct
  13. FROM employees
  14. WHERE salary >= 10000 AND salary <= 20000;
  15. #案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
  16. SELECT *
  17. FROM employees
  18. WHERE NOT (department_id >= 90 AND department_id <= 110)
  19. OR salary > 15000;
  20. #三、模糊查询
  21. #1.like
  22. /*
  23. 特点:
  24. ①一般和通配符搭配使用🔴
  25. 通配符:
  26. % 任意多个字符,包含0个字符
  27. _ 任意单个字符
  28. */
  29. #案例1:查询员工名中包含字符a的员工信息
  30. select *
  31. from employees
  32. where last_name like '%a%'; #abc
  33. #案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
  34. select last_name, salary
  35. FROM employees
  36. WHERE last_name LIKE '__e_a%';
  37. #案例3:查询员工名中第二个字符为_的员工名的🔴
  38. SELECT last_name
  39. FROM employees
  40. WHERE last_name LIKE '_$_%' ESCAPE '$'; #指定$为转移字符
  41. #WHERE last_name LIKE '_\_%';
  42. #2.between and
  43. /*
  44. ①使用between and可以提高语句的简洁度
  45. ②包含临界值
  46. ③两个临界值不要调换顺序
  47. */
  48. #案例:查询员工编号在100到120之间的员工信息
  49. SELECT *
  50. FROM employees
  51. WHERE employee_id >= 100 AND employee_id <= 120;
  52. #----------------------
  53. SELECT *
  54. FROM employees
  55. WHERE employee_id BETWEEN 100 AND 120;
  56. #3.in
  57. /*
  58. 含义:判断某字段的值是否属于in列表中的某一项
  59. 特点:
  60. ①使用in提高语句简洁度
  61. ②in列表的值类型必须一致或兼容
  62. ③in列表中不支持通配符
  63. */
  64. #案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
  65. SELECT last_name, job_id
  66. FROM employees
  67. WHERE job_id = 'IT_PROT'
  68. OR job_id = 'AD_VP'
  69. OR JOB_ID = 'AD_PRES';
  70. #-----------------------
  71. SELECT last_name, job_id
  72. FROM employees
  73. WHERE job_id IN ('IT_PROT', 'AD_VP', 'AD_PRES');
  74. #4、is null
  75. /*
  76. =或<>不能用于判断null值
  77. is null或is not null 可以判断null值
  78. */
  79. #案例1:查询没有奖金的员工名和奖金率
  80. SELECT last_name, commission_pct
  81. FROM employees
  82. WHERE commission_pct IS NULL;
  83. #案例2:查询有奖金的员工名和奖金率
  84. SELECT last_name, commission_pct
  85. FROM employees
  86. WHERE commission_pct IS NOT NULL;
  87. #----------------以下为❌
  88. SELECT last_name, commission_pct
  89. FROM employees
  90. WHERE salary IS 12000;

安全等于 <=>
IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
<=>:既可以判断NULL值,又可以判断普通的数值,可读性较低

  1. #案例1:查询没有奖金的员工名和奖金率
  2. SELECT last_name, commission_pct
  3. FROM employees
  4. WHERE commission_pct <=> NULL;
  5. #案例2:查询工资为12000的员工信息
  6. SELECT last_name, salary
  7. FROM employees
  8. WHERE salary <=> 12000;

进阶3:排序查询

语法:
**select 要查询的东西**
**from 表**
**where 条件**
**order by 排序的字段|表达式|函数|别名 [asc | desc];**
特点:

  1. asc代表的是升序,可以省略,desc代表的是降序
  2. order by子句可以支持单个字段、别名、表达式、函数、多个字段
  3. order by子句在查询语句的最后面,除了limit子句 ```sql

    1、按单个字段排序

    SELECT * FROM employees ORDER BY salary DESC;

2、添加筛选条件再排序

案例:查询部门编号>=90的员工信息,并按员工编号降序

SELECT * FROM employees WHERE department_id>=90 ORDER BY employee_id DESC;

3、按表达式排序

案例:查询员工信息 按年薪降序

SELECT , salary12(1+IFNULL(commission_pct,0)) FROM employees ORDER BY salary12*(1+IFNULL(commission_pct,0)) DESC;

4、按别名排序

案例:查询员工信息 按年薪升序

SELECT , salary12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 ASC;

5、按函数排序

案例:查询员工名,并且按名字的长度降序

SELECT LENGTH(last_name), last_name FROM employees ORDER BY LENGTH(last_name) DESC;

6、按多个字段排序

案例:查询员工信息,要求先按工资降序,再按employee_id升序

SELECT * FROM employees ORDER BY salary DESC, employee_id ASC;

  1. 练习
  2. ```sql
  3. #1.查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
  4. SELECT last_name, department_id, salary*12*(1+IFNULL(commission_pct,0)) 年薪
  5. FROM employees
  6. ORDER BY 年薪 DESC, last_name ASC;
  7. #2.选择工资不在8000到17000的员工的姓名和工资,按工资降序
  8. SELECT last_name, salary
  9. FROM employees
  10. WHERE salary NOT BETWEEN 8000 AND 17000
  11. ORDER BY salary DESC;
  12. #3.查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
  13. SELECT *, LENGTH(email)
  14. FROM employees
  15. WHERE email LIKE '%e%'
  16. ORDER BY LENGTH(email) DESC, department_id ASC;