Mysql之检索数据

来自廖雪峰老师学习网站和sql必知必会总结

检索数据

一:基本查询数据

1. 检索所有列

SELECT * FROM <表名>;

SELECT是关键字,表示将要执行一个查询* (通配符)表示所有列,FROM表示从哪个表查询。

2. 检索单个列或多个列

SELECT 列1,列2 FROM <表名>;

返回指定的列,也可以给每个列起一个别名,语法是SELECT 列1 别名1,列2 别名2,… FROM …

3. 检索不同的值

SELECT DISTINCT 列名1 FROM <表名>;

distanct关键字表示只返回不同的值。

总结:基本查询就是使用SELECT、FROM结合DISTINCT进行查询。

二:排序查询数据

1. 按列进行排序检索

SELECT * FROM <表名> ORDER BY <列名>;

ORDER BY 子句取一个列或多个列的名字进行排序。多列排序时,只有第一个列相同时,才会通过第二列进行排序。

2. 按列位置排序检索

SELECT * FROM <表名> ORDER BY 5;

只需将列名换成列的相对位置即可。

3. 按列进行排序检索并指定方向

SELECT * FROM <表名> ORDER BY <列名> DESC;

默认排序方向为升序,使用DESC为降序。当使用ORDER BY score DESC,name 时,只对score进行降序,而当score相同时,name使用升序。

总结:排序检索就是使用ORDER BY子句进行排序检索,默认为升序,使用DESC为降序。

三:条件查询(过滤查询)

注意:在同时使用where子句和order by子句时,应该让order by子句位置where子句后,否则将会发生错误。

WHERE子句操作符

操作符 说明 操作符 说明
= 等于 > 大于
<> 不等于 >= 大于等于
!= 不等于 !> 不大于
< 小于 BETWEEN 在指定的两个值之间
<= 小于等于 IS NULL 为NULL值
!< 不小于 NOT 例:NOT id = 2;表示不符合id等于2的数据

1. 按条件查询

SELECT * FROM <表名> where score=80;

检索出score等于80的所有数据。

2. AND条件查询

SELECT * FROM <表名> where score=80 AND gender=‘M’;

也可以用 <条件一> AND <条件二> 表示‘与’

3. OR条件查询

SELECT * FROM <表名> where score=80 OR gender=‘M’;

也可以用 <条件一> OR <条件二> 表示‘或’

4. IN条件查询

SELECT * FROM <表名> where score IN (10,90);

IN(x1,x2)表示socre的范围

5. BETWEEN条件查询

SELECT * FROM <表名> WHERE score BETWEEN 10 AND 80;

使用BETWEEN关键字时,必须制定两个值,所需范围的低端值和高端值,必须使用AND分隔开。

6. NOT条件查询

SELECT * FROM <表名> where NOT score=80;

检索score不为80的所有数据。

7. 使用LIKE过滤查询

  • 通配符百分号(%)表示任意字符出现任意次数(包括0)。
  • 通配符下划线(_)表示任意字符出现一次。
  • 通配符方括号([])表示指定字符集。(匹配[]内任意一个字符)

SELECT * FROM <表名> WHERE name LIKE ‘a%’;

使用LIKE和通配符进行过滤查询。例’a%'表示以a开头的所有数据。

SELECT * FROM <表名> WHERE name LIKE ‘[ab]%’;

表示以a或者b开头的数据。

!!!注意:优先级关系:!=>AND>OR

总结:条件查询就是如何使用AND、OR、IN、NOT操作符结合WHERE进行查询。

四:分页查询

1. 限制行数查询

SELECT * FROM <表名> LIMIT <行数> OFFSET <起始行>;

LIMIT关键字表示检索的行数,OFFSET关键字表示从哪一行开始。(不包括开始的哪一行,为开区间。例上,从6行开始)

由于检索结果集过大,需要分页进行展示。

分页查询的关键是,首先要确定每页显示的数量pageSize,然后是当前页的索引pageIndex。

  • LIMIT总是设定为pageSize
  • OFFSET计算公式为pageSize * (pageIndex - 1)

总结:分页查询使用LIMIT<查询的行数> OFFSET<起始的行数>进行查询,查询的计算公式如上。

五:聚合查询

函数 说明
COUNT() 计算行的个数
SUM 计算某一列的合计值,该列必须为数值
AVG 计算某一列的平均值,该列必须为数值
MAX 计算某一列的最大值
MIN 计算某一列的最小值
CONCAT 将多个列拼接在一起

如果where条件没有匹配到任何行,这些函数将返回null。

1. 聚合查询示例:

SELECT COUNT(*) num FROM students;

查询学生的总个数

2.拼接字段

使用CONCAT函数将多个列拼接在一起

SELECT CONCAT(NAME,’(’,score,’)’) FROM students;
Mysql之检索数据_第1张图片

六: 分组查询

重点: 子句执行顺序:WHERE > GROUP BY > HAVING > ORDER BY

1. GROUP BY 子句

SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;

GROUP BY子句按照class_id先进行分组,然后再分别计算总和。

2. HAVING 子句

WHERE过滤指定的行,而HAVING支持所有WHERE的功能,且支持过滤分组

SELECT COUNT() FROM students GROUP BY class_id HAVING COUNT()>=2;

将学生表根据班级分组,并且过滤出班级里学生数大于2的班级。

七:多表查询(联结查询)

SELECT查询不但可以从一张表查询数据,还可以从多张表同时查询数据。

1.多表查询

SELECT * FROM <表1> <表2>

多表查询产生笛卡尔积,必须使用WHERE子句过滤检索出想要的数据。联结查询是SQL中农一个最重要,最强大的特性。

八:连接查询

1.内连接

SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score

FROM students s

INNER JOIN classes c

ON s.class_id = c.id;

FROM <表一>先确定主表,INNER JOIN <表二>再确定需要连接的表,ON <条件> 确定条件。 INNER JOIN 连接只返回同时存在于两张表的行数据。

2.外连接

语法 含义
FROM …LEFT OUTER JOIN 返回左表都存在的行,右表中不存在的则填充NULL
FROM …RIGHT OUTER JOIN 返回右表中的所有行,左表中不存在,则用NULL来填充
FROM …RIGHT OUTER JOIN 会把两张表中所有记录全部选择出来,自动把把对方不存在的填充为NULL

如图所示:
Mysql之检索数据_第2张图片

九:组合查询

主要有两种情况需要使用组合查询:

  • 在一个查询中从不同的表返回结构数据。
  • 对一个表执行多个查询,按一个查询返回数据。

组合查询使用UNION连接多个SELECT语句。语法为:SELECT… UNION SELECT…

  • 在对同一个表进行组合查询时,使用UNION和WHERE子句中使用OR相同。
  • UNION中每个查询的必须包含相同的列、表达式、聚集函数。
  • UNION从查询结果集中自动去除了重复的行。如果不想去除,则使用UNION ALL。
  • 使用UNION组合查询时,如果使用ORDER BY子句排序,则必须放在最后一条SELECT中。

你可能感兴趣的:(数据库)