SELECT语句(检索数据)
- 查询结果只是一个虚拟的表格
- 查询前建议先用use表明使用的库
- `不是单引号,是着重号可以与关键字区别
基础查询
SELECT 查询列表 FROM 表名;
- 查询列表处可以是:列名,表中字段,常量值,表达式,函数
- 当检索多个列时,在SELECT关键字后给出多个列名,并将列名以逗号分隔
- 在查询处使用*则代表检索所有列
- DESC+表名 可以显示该表结构
SELECT 列名 FROM 表名 LIMIT m,n;
- 为了返回第一行或前几行,可使用LIMIT子句。
LIMIT m,n代表从第m行开始,返回n行;如果只有一个数字,则默认从第0行开始返回
去重-DISTINCT
- 每次检索列时会自动返回该列所有行,如果想要去重可以使用DISTINCT关键字:
注意:如果给出SELECT DISTINCT后接多个列名,除非指定的几个列都不同,否则所有行都将被检索出来。
SELECT DISTINCT 列名 FROM 表名;
起别名-AS
- 当查询字段有重名,可以用别名进行区分;
- 当别名有特殊符号如#或空格,可以用双引号避免误会
#方式一
SELECT “last#name” AS 姓,first_name AS 名 FROM + 表名
#方式二
SELECT last_name 姓,first_name 名 FROM + 表名
拼接-CONCAT
- 将两个字段拼接成一个字段
#案例:查询员工姓名,将姓和名拼接成一个字段
SELECT
CONCAT(last_name, first_name) AS 姓名
FROM
employees ;
条件查询(WHERE)
select 查询列表
from 表名
where 筛选条件;
- 按条件表达式筛选
条件运算符:>, <, =, !=, <>, >=, <=
(!=和<>均为不等于,建议使用后者) - 按逻辑表达式筛选
逻辑运算符:&&,||,!或and, or, not - 模糊查询
like:一般和通配符搭配使用
between and:范围是闭区间(可以写not between…and…)
in:in列表的值类型必须一致或兼容
is null:is null只能判断null值;=不能判断null值;安全等于(<=>)可以判断null值也可以判断数值。 - 使用说明
通配符:%表示任意多个字符,包含0个字符;_表示任意单个字符
转义:若出现已有含义的字符在字段中,可通过转义从而正常查询,如例三所示,\就是一个转义符,此外还可通过ESCAPE子句自定义转义符。
#例1:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE department_id < 90
OR department_id > 110
OR salary > 15000 ;
#例2:查询员工名第二个字符为a的员工信息
SELECT * FROM employees WHERE last_name LIKE '_a%';
#字符型要加单引号,%代表充沛符,代表任意一个字符,即任意位置有a均算在内
#例3:查询员工中第二个字符为_的员工名
#方案一:
SELECT last_name FROM employees WHERE last_name LIKE '_\_%';
#方案二:
SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';
#例4:查询员工工种编号是IT_FROG,AD_VP,AD_PRES中的一个的员工名和工种编号
SELECT last_name,job_id FROM employees WHERE job_id IN ('IT_FROG','AD_VP','AD_PRES');
#例5:查询无奖金的员工名
SELECT last_name FROM employees WHERE commission_pct IS NULL;
#类似的有奖金的则改成IS NOT NULL
IF NULL子句
当表中有null值,无法进行数值运算,可以利用IF NULL为空值赋值
#例:查询员工号为AD_VP的员工名,员工号和年薪
SELECT
last_name,
job_id,
salary * 12 * (1+ IFNULL(commission_pct, 0)) AS 年薪
FROM
employees
WHERE
job_id='AD_VP';
排序查询(ORDER BY)
- ORDER BY子句取一个或多个列的名字,据此对输出进行排序
- ORDER BY子句一般放在查询语句最后,LIMIT子句除外
- #默认升序排序
#语法:
SELECT 查询列表
FROM 表
【WHERE 筛选条件】
ORDER BY 排序列 【ASC或DESC】
- 可以按照表达式,别名,函数等排序:如之前所说的年薪,LENGTH函数等。
#例:按年薪高低显示信息
SELECT
*,
salary * 12 * (1+ IFNULL(commission_pct, 0)) 年薪
FROM
employees
ORDER BY 年薪 DESC ;
#例:按姓名长度显示员工姓名和工资
SELECT
LENGTH(last_name) AS 字节长度,last_name,salary
FROM
employees
ORDER BY
LENGTH(last_name) DESC;
- 可以填入多个列名,在按多个列排序时,排序完全按所规定的顺序进行。例如age, name这样的顺序下,先按age排序,如果有相同年龄者再在其中按姓名排序。
#例:先按工资升序,再按员工编号降序
SELECT *
FROM employees
ORDER BY salary ASC, employee_id DESC;