Data Query Language 数据查询语言
1.数据库表的操作步骤
1.查看当前连接下所有的数据库
SHOW DATABASES;
2.启用指定的数据库
USE myemployees;
3.查看当前库下所有表
SHOW TABLES;
SHOW TABLES FROM Database;
4.查看表的具体结构
方式1:
SHOW COLUMNS FROM employees;
方式2:
DESC employees;
5.具体表的查询语句
SELECT * FROM table;
其他:
-
查看当前数据库服务器的版本
SELECT VERSION();
-
查看当前用户
SELECT USER();
-
修改字符集
SET NAMES GBK;
2.Data Query Language 数据查询语言
DQL就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
语法:
SELECT selection_list /*要查询的列名称*/
FROM table_list /*要查询的表名称*/
JOIN table_list
ON condition /*联结条件*/
WHERE condition /*行条件*/
GROUP BY grouping_columns /*对结果分组*/
HAVING condition /*分组后的行条件*/
ORDER BYsorting_columns /*对结果分组*/
LIMIT offset_start, row_count /*结果限定*/
着重号:`
2.1 SELECT FROM
2.1.1 Select语句的执行顺序:
- FROM:检测对应表是否存在、连接是否正确
- ON
- JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT:检测对应列名是否存在,运算、函数是否正确
- DISTINCT
- ORDER BY
- LIMIT
2.1.2 DQL特点
1、查询结果为一个虚拟表,类似于java中学过的System.out.println(打印内容);
2、查询列表可以是:
- 常量值
- 表达式
- 变量
- 字段
- 函数
- 也可以是上述的组合
2.1.3 别名
- 1.AS “别名”:唯一有双引号的地方
- 2.空格(省略AS关键字)
- 3.可以省略双引号
- 前提没有特殊符号
方式一:使用as关键字
SELECT 900 AS 出勤天数,VERSION() AS 版本号,last_name FROM employees;
方式二:使用空格
SELECT 900 "出勤天数",VERSION() "版本号",last_name FROM employees;
案例:查询last_name,别名为 :姓 名
SELECT last_name AS "姓 名" FROM employees;
注意:
- 别名可以添加双引号,也可以不使用。
- 但如果别名里面包含特殊符号,则要求双引号必须加
- 特殊符号如:空格、#……
2.1.4 去重
语法:
SELECT DISTINCT column FROM table;
/*显示出表 employees 中的全部 job_id(不能重复)*/
SELECT DISTINCT job_id FROM employees;
2.2 WHERE 条件筛选
select 查询列表③
from 表名 ①
where 筛选条件;②
2.2.1 筛选条件的书写形式
1.按条件表达式筛选
sql中的关系运算符:> < >= <= = <>(!=)
2.按逻辑表达式筛选
sql中的逻辑运算符:and、or、not
3.按布尔类型的常量值筛选
- 0 代表的是false
- 非0 代表的是true
注意:布尔值是用 0 和 非0 表示;
4.模糊查询
- like
- between and
- in
- is null
2.2.2 模糊查询
1.like/not like 关键字
一般搭配通配符使用,用于判断字符型的数据
- _ 任意单个字符
- % 任意多个字符
- escape关键字:
- \ 转义字符
案例4:查询姓名中第二个字符为_的员工姓名和邮箱
/*方式1*/
SELECT last_name,email
FROM employees
WHERE last_name LIKE '_\_%';
/*方式2:推荐使用*/
SELECT last_name,email
FROM employees
WHERE last_name LIKE '_a_%' ESCAPE 'a';
2.between and /not between and 关键字
说明:用于判断某字段的值是否在指定的区间
注意:
- 1、闭区间
- 2、两个值不能调换顺序,否则影响效果
3.in/not in关键字
说明:判断某字段或表达式的值是否在指定列表内
4.is null /is not null
注意:
- IS 只能判断NULL值,不能判断普通数值
- = 只能判断普通数值,不能判断NULL值
- <=> 既能判断NULL值,又能判断普通数值,但阅读性差
- NULL 值的运算都为unknow:三值逻辑和NULL
2.3 GROUP BY 与 HAVING
1.分组查询筛选的分类
分类 | 基于的表 | 使用的关键字 | 位置 |
---|---|---|---|
分组前筛选 | 原始表 | where | group by前面 |
分组后筛选 | 分组后的虚拟表 | having | group by后面 |
问题:HAVING 与 where 的区别?基于的表;位置与执行顺序;功能;
1)两者都可以实现对表数据进行筛选
2)having条件筛选是:在group by之后,即分组后进行条件筛选,针对的是分组后的虚拟表,一般结合聚合函数一起使用,位置与执行都在group by 之后
3)where条件筛选是:在from之后,group by分组之前进行条件筛选,针对的是from中的原始表,其位置与执行都在group by之前;
2.和分组函数一同查询的字段只能是group by后面的字段
3.having子句能够使用的三种要素:
- 常数
- 聚合函数
- group by子句中指定的列名(聚合键)
4.having子句可以单独使用:
- 此时:认为是对空字段进行group by。
2.3 ORDER BY 排序
select 查询列表 ③
from 表名 ①
【where 筛选条件】 ②
order by 排序列表 【asc|desc】; ④
特点:
- 1、升序 通过asc,降序 通过 desc:默认行为:升序
- 2、排序列表可以是:单个字段、多个字段、表达式、函数、别名
- 3、ORDER BY 执行顺序在 SELECT 语句之后:所以可以使用别名
1.按单个字段排序
案例:查询姓名中包含e的员工姓名、工资,且按工资降序
SELECT last_name,salary
FROM employees
WHERE last_name LIKE '%e%'
ORDER BY salary DESC;
2.按多个字段排序
案例:查询员工信息,先按部门编号降序,如果部门一样,按员工编号升序
SELECT *
FROM employees
ORDER BY department_id DESC,employee_id ASC;
3.按表达式排序
案例:将有年终奖员工信息进行年薪的降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0))
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
4.按别名排序
案例:将有年终奖员工信息进行年薪的降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY 年薪 DESC;
5.按函数的结果排序
案例:按姓名的字符个数进行升序
SELECT last_name,CHAR_LENGTH(last_name)
FROM employees
ORDER BY CHAR_LENGTH(last_name) ASC;
- CHAR_LENGTH(str) :获取指定参数的字符个数
- LENGTH(str):获取指定参数的字节个数
2.5 LIMIT 分页查询
1.语法:
select 查询列表
from 表
[where 条件]
limit [起始条目索引,] 查询的条目数;
2.特点:
- 1.limit子句的索引序号,从0开始,且默认为0
- 2.假如待显示的条目,从第一条开始,则可以省略起始条目索引
limit 0,10;
/*等价于:*/
limit 10;
3.分页查询:
问:待显示的页数page,每页显示的条目数sizePerPage,如何实现分页查询?
SELECT * FROM tableName
LIMIT (page-1)*sizePerPage,sizePerPage;
/*
每页显示10条
1 limit 0,10
2 limit 10,10
3 limit 20,10
*/