二、MySQL检索数据
1 基础查询
基础查询语法:
SELECT 查询列表 FROM 表名;
特点:
- 查询列表可以是:表中的字段、常量值、表达式、函数;
- 查询的结果是一个虚拟的表格。
1.1 单列多列查询
- 查询表中的单个列:
SELECT last_name FROM employees;
- 查询表中的多个列:
SELECT first_name,last_name FROM employees;
- 查询表中的所有列:
SELECT * FROM employees;
注意此方式查找出的所有列的顺序为表中定义的顺序。
1.2 检索不同的行(去重)
使用DISTINCT关键字,可以去掉列中重复的值,只显示不同的值。
使用SELECT manager_id FROM employees;
时,可以看到显示了重复的manager_id值。
使用DISTINCT关键字:
SELECT DISTINCT manager_id FROM employees;
可以看到只显示了不同的值。
1.3 限制结果
使用LIMIT关键字,可以只返回指定的行数。
输入:
SELECT last_name FROM employees LIMIT 5;
输入:
SELECT last_name FROM employees LIMIT 5,5;
此时指的是从行5开始的前5行(当然行数从0开始)
2 排序检索的数据
-
按单列排序:
SELECT last_name FROM employees ORDER BY last_name;
-
按多列排序:在排序方式一内容相同的情况下,按排序方式二排序。
SELECT last_name,first_name FROM employees ORDER BY last_name,first_name;
-
默认排序:字符(从A到Z),数字从小到大。
-
指定方向排序:DESC关键字可以将默认排序方式反向。
SELECT last_name FROM employees ORDER BY last_name DESC;
3 数据过滤
数据库一般包含大量数据。只检索所需数据需要指定搜索条件,也称为过滤条件。在SELECT语句中,我们可以通过使用WHERE子句中指定的搜索条件进行过滤。
首先,我们使用默认排序显示employees表中的salary:
SELECT salary FROM employees ORDER BY salary;
使用WHERE子句添加检索条件salary>5000:
SELECT salary FROM employees WHERE salary>5000 ORDER BY salary;
3.1 WHERE子句操作符
类似>之类的操作符包括以下几种。
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
3.2 范围值检查
使用WHERE子句中的BETWEEN操作符设定在指定了两个值之间的范围,两个值之间必须用AND连接。
SELECT salary FROM employees WHERE salary BETWEEN 5000 AND 6200 ORDER BY salary;
3.3 空值检查
空值NULL与0、空格不同。是使用WHERE子句的IS NULL来检索
SELECT manager_id FROM employees WHERE manager_id IS NULL;
3.4 AND操作符与OR操作符
在WHERE子句中可以使用AND或OR来连接多个WHERE子句:
- AND语句:“与”
检索salary>5000且id<110的行。每添加一个条件使用一个AND。
SELECT employee_id,first_name,salary FROM employees WHERE salary>5000 AND employee_id<110;
- OR语句:“或”
检索salary<5000或salary>10000的行。
SELECT employee_id,first_name,salary FROM employees WHERE salary<5000 OR salary>10000;
说明:
当AND和OR同时出现时,优先计算AND语句。例如,
SELECT employee_id,first_name,salary FROM employees WHERE salary<5000 OR salary>10000 AND employee_id <110;
我输入语句的目的:输出id<110中salary<5000或salary>10000的员工。
实际输出:输出salary<5000的员工(无论id)或者id<110且salary>10000的员工
二者不相同,因为MySQL优先计算AND语句。为了解决这种问题,建议使用()将条件包裹起来,手动设置优先级。
SELECT employee_id,first_name,salary FROM employees WHERE (salary<5000 OR salary>10000) AND employee_id <110;
此时的输出就是我们想要的结果了。
3.5 IN操作符
IN操作符类似于OR操作符连接。括号中的即为所有合法值清单,而非范围。
找出salary=5000或salary=10000的员工
SELECT employee_id,first_name,salary FROM employees WHERE salary IN(5000,10000);
3.6 NOT操作符
NOT操作符只有一个用处,否定后面的语句,即取反。
找出salary在5000-10000的员工(我故意写复杂以显示NOT的作用)
SELECT employee_id,first_name,salary FROM employees WHERE NOT (salary<5000 OR salary>10000);
4 使用通配符过滤
LIKE操作符指示MySQL,后跟的搜索模式为通配符匹配而不是相等匹配。
-
百分号(%)通配符
%表示任意字符出现任意次数。
展示id中以’1’结尾的员工。
SELECT employee_id,first_name,salary FROM employees WHERE employee_id LIKE '%1';
与此相同,’1%‘指以’1‘开头的值,’%1%‘指值中带有’1‘即满足条件。 -
下划线(_)操作符
_指单个字符,仅仅只有一个!!
查找id中以1结尾且前面仅有一个字符的值。
SELECT employee_id,first_name,salary FROM employees WHERE employee_id LIKE '_1';
将上一条语句的%改为_,查询不到任何值。这是因为_只代表一个字符,所以如果能搜仅能搜到“81”,”71“之类的值,但我这的id三位数起步,嘻嘻。
5 使用正则表达式搜索
5.1 基本字符匹配
检索id中带有’13’的所有行
SELECT employee_id,first_name,salary FROM employees WHERE employee_id REGEXP '13';
是不是感觉上与LIKE语句类似。但是,我们使用LIKE语句时
SELECT employee_id,first_name,salary FROM employees WHERE employee_id LIKE '13';
没有结果。这是因为,LIKE语句检索的是整行,而正则表达式检索的是行中有没有相关字段。当然我们也可以使用LIKE+通配符实现:
SELECT employee_id,first_name,salary FROM employees WHERE employee_id LIKE '%13%';
说明:
我们还可以使用.
来匹配任意一个字符来增加过滤条件。
5.2 进行OR匹配
我们可以在正则表达式中使用|来达成”或“的效果。
查找id为135或150的员工
SELECT employee_id,first_name,salary FROM employees WHERE employee_id REGEXP '135|150';
5.3 匹配特定字符
如果只想匹配特定的字符,可以使用[]。
[12]意味匹配1或2,所以整体来讲即为匹配id为100或200的员工
SELECT employee_id,first_name,salary FROM employees WHERE employee_id REGEXP '[12]00';
可以使用^对结果取反
5.4 匹配范围
集合可以用来匹配范围内的一个或多个字符:如[0-5]
查找id为1开头,0结尾,中间为0到5的员工。
SELECT employee_id,first_name,salary FROM employees WHERE employee_id REGEXP '1[0-5]0';
5.5 匹配特殊字符
当我们需要匹配类似.
,[]之类的字符时,我们需要用到转义字符\\
使用转义后,搜索带.
的salary。
SELECT employee_id,first_name,salary FROM employees WHERE salary REGEXP '10000\\.00';
说明:\\
也被用来引用空白元字符。
元字符 | 说明 |
---|---|
\\f | 换页 |
\\n | 换行 |
\\r | 回车 |
\\t | 制表 |
\\v | 纵向制表 |