1 概述
数据查询语言(Data Query Language):查询(SELECT)。
2 基础查询
语法:
SELECT
查询列表
FROM
表名;
注意:
- 查询列表可以是:表中的字段、常量值、表达式、函数
- 查询的结果是一个虚拟的表格
2.1 查询表中的单个字段
SELECT last_name FROM employees;
2.2 查询表中的多个字段
SELECT last_name,salary,email FROM employees;
2.3 查询表中的所有字段
SELECT * FROM employees;
2.4 查询常量值
SELECT 100;
SELECT 'john';
2.5 查询表达式
SELECT 100%98;
2.6 查询函数
SELECT VERSION();
2.7 起别名
SELECT 100%98 AS 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
SELECT last_name 姓,first_name 名 FROM employees;
SELECT salary AS 'out put' FROM employees;
2.8 去重
案例:查询员工表中涉及到的所有的部门编号。
SELECT DISTINCT department_id FROM employees;
2.9 +的作用
MySQL中+只能当做算数运算符。比如’123’+90会解析成123+90,‘john’+90会解析成0+90,null+10会解析成null。
2.10 字符串拼接
案例:查询员工名和姓连接成一个字段,并显示为姓名。
SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;
3 条件查询
语法:
SELECT
查询列表
FROM
表名
WHERE
筛选条件;
3.1 按条件表达式筛选
条件运算符:> < = != <> >= <=
案例1:查询工资>12000的员工信息
SELECT
*
FROM
employees
WHERE
salary>12000;
案例2:查询部门编号不等于90号的员工名和部门编号
SELECT
last_name,
department_id
FROM
employees
WHERE
department_id<>90;
3.2 按逻辑表达式筛选
逻辑运算符:&& || ! AND OR NOT
案例1:查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
salary>=10000 AND salary<=20000;
案例2:查询部门编号不在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE
NOT(department_id<90 AND department_id>110) OR salary>15000;
3.3 模糊查询
LIKE
通配符:
- %:匹配任意多个字符。
- _:任意单个字符。
案例1:查询员工名中包含字符a的员工信息。
SELECT
*
FROM
employees
WHERE
last_name LIKE '%a%';
案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资。
SELECT
last_name,
salary
FROM
employees
WHERE
last_name LIKE '__e_a%';
案例3:查询员工名中第二个字符为_的员工名。
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_\_%';
案例4:查询员工名中第一个字符为$的员工名。
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_$%' ESCAPE '$';
BETWEEN AND
注意:
- 使用BETWEEN AND可以提高语句的简洁度。
- 包含临界值。
- 两个临界值不要调换顺序。
案例1:查询员工编号在100到1200之间的员工信息。
SELECT
*
FROM
employees
WHERE
employees_id BETWEEN 100 AND 120;
IN
判断某字段的值是否 属于IN列表中的某一项
特点:
- 提高语句简洁度
- 列表的值类型必须一致或兼容
案例1:查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN('IT_PROT','AD_VP','AD_PRES');
IS NULL
注意:
- =或<>不能用于判断NULL值。
- IS NULL或IS NOT NULL可以判断NULL值。
案例1:查询没有奖金的员工名和奖金率。
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
3.4 安全等于 <=>
<=>既能判断NULL值,又能判断普通数值。
案例1:查询没有奖金的员工名和奖金率。
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct <=> NULL;
案例2:查询工资为12000的员工信息。
SELECT
last_name,
salary
FROM
employees
WHERE
salary <=> 12000;
4 排序查询
注意:
- ASC表升序,DESC表降序,默认升序。
- ORDER BY子句中可以支持单个字段、多个字段、表达式、函数、别名。
- ORDER BY子句一般式放在查询语句的最后面,limit子句除外。
语法:
SELECT
查询列表
FROM
表
WHERE
筛选条件
ORDER BY
排序条件 [ASC|DESC]
案例1:查询员工信息,要求工资从高到低排序。
SELECT
*
FROM
employees
ORDER BY
salary DESC;
案例2:查询部门编号>=90的员工信息,按入职时间的先后排序
SELECT
*
FROM
employees
WHERE
department_id>=90
ORDER BY
hiredate ASC;
案例3:按年薪的高低显示员工的信息和年薪(按表达式排序)
SELECT
*,
salary*12*(1+IFNULL(commission_pct,0))
FROM
employees
ORDER BY
salary*12*(1+IFNULL(commission_pct,0)) DESC;
案例4:按年薪的高低显示员工的信息和年薪(按别名排序)
SELECT
*,
salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM
employees
ORDER BY
年薪 DESC;
案例5:按姓名的长度显示员工的姓名和工资(按函数排序)
SELECT
LENGTH(last_name),
last_name,
salary
FROM
employees
ORDER BY
LENGTH(last_name) DESC;
案例6:查询员工信息,要求先按工资升序,再按员工编号降序(多字段排序)
SELECT
*
FROM
employees
ORDER BY
salary ASC,
employee_id DESC;
5 常见函数
类似于Java中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名。
好处:
- 隐藏了实现细节。
- 提高代码的重用性。
调用:
SELECT
函数名([实参列表])
FROM
表名;
5.1 单行函数
5.1.1 字符函数
LENGTH
获取参数值的字节个数。
在utf8中一个汉字占3个字节,在gb2312中一个汉字占两个字节。
CONCAT
拼接字符串。
SELECT
CONCAT(last_name,'_',first_name) 姓名
FROM
employees;
UPPER、LOWER
案例1:将姓变大写、名变小写,然后拼接。
SELECT
CONCAT(UPPER(last_name),LOWER(first_name)) 姓名
FROM
employees;
SUBSTR、SUBSTRING
截取子串