MySQL-查询语句(一)

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: MySQL-查询语句

数据库管理系统的一个最重要的功能就是数据查询,数据查询不应只是简单查询数据库中存储的数据,还应该根据需要对数据进行筛选,以及确定数据以什么样的格式显示。MySQL提供了功能强大、灵活的语句来实现这些操作。

下面是通过help帮助查看到的select语法格式

1. Name: 'SELECT'
2. Description:
3. Syntax:
4. SELECT
5.     select_expr [, select_expr] ...
6.       [FROM table_references]
7.     [WHERE where_condition]
8.     [GROUP BY {col_name | expr | position}
9.       [ASC | DESC], ... [WITH ROLLUP]]
10.     [HAVING where_condition]
11.     [ORDER BY {col_name | expr | position}
12.       [ASC | DESC], ...]
13.     [LIMIT {[offset,] row_count | row_count OFFSET offset}]

基本查询


mysql从数据表中查询数据的基本语句为select语句。

select语句的基本格式如下:

SELECT {* | <字段列表>} [ FROM <表1>, <表2>.... [ where <表达式> ] [ group by ] [ having ] [ order by<..> ] [ limit <...> ]
  1. {*|<字段列表>}包含星号通配符选择字段列表,表示查询的字段,其中字段列至少包含一个字段名称,如果要查询多个字段,多个字段之间用逗号隔开,最后一个字段后不要加逗号。
  2. FROM<表1>,<表2>...:表1和表2表示查询数据的来源,可以是单个或多个。
  3. WHERE子句是可选项,如果选择该项,将限定查询必须满足的查询条件。
  4. GROUP BY<字段>,该子句告诉MySQL按什么样的顺序显示查询出来的数据,可以进行的排序有:升序(asc)、降序(desc)。
  5. [limit],该子句告诉mysql每次显示查询出来的数据条款。
1. mysql> create table fruits 
2.  -> (
3.  -> f_id char(10) not null,
4.  -> s_id int not null,
5.  -> f_name char(255) not null,
6.  -> f_price decimal(8,2) not null,
7.  -> primary key(f_id)
8.  -> );
9. Query OK, 0 rows affected (0.02 sec)
10. mysql> insert into fruits(f_id,s_id,f_name,f_price)
11.  -> values('a1',101,'apple','5.2'),
12.  -> ('b1',101,'blackberry','10.2'),
13.  -> ('bs1',102,'orange','11.2'),
14.  -> ('bs2',105,'melon','8.2'),
15.  -> ('t1',102,'banana','10.3'),
16.  -> ('t2',102,'grape','5.3'),
17.  -> ('o2',103,'coconut','9.2'),
18.  -> ('c0',101,'cherry','3.2'),
19.  -> ('a2',103,'apricot','2.2'),
20.  -> ('l2',104,'lemon','6.4'),
21.  -> ('b2',104,'berry','7.6'),
22.  -> ('m1',106,'mango','15.7'),
23.  -> ('m2',105,'xbabay','2.6'),
24.  -> ('t4',107,'xbababa','3.6'),
25.  -> ('m3',105,'xxtt','11.6'),
26.  -> ('b5',107,'xxxx','3.6');
27. Query OK, 16 rows affected (0.02 sec)
28. Records: 16 Duplicates: 0 Warnings: 0

单表查询


单表查询是指从一张表数据中查询所需的数据。主要有:查询所有字段、查询指定字段、查询指定记录、查询空值、多条件的查询、对查询结果进行排序等方式。

查询所有字段

1、在select语句中使用星号()通配符查询所有字段。 select查询记录最简单的形式是从一个表中检索所有记录,实现的方法是使用星号()通配符指定查找所有列的名称。

1. mysql> select * from fruits;
2. +------+------+------------+---------+
3. | f_id | s_id | f_name     | f_price |
4. +------+------+------------+---------+
5. | a1   |  101 | apple      |    5.20 |
6. | a2   |  103 | apricot    |    2.20 |
7. | b1   |  101 | blackberry |   10.20 |
8. | b2   |  104 | berry      |    7.60 |
9. | b5   |  107 | xxxx       |    3.60 |
10. | bs1  |  102 | orange     |   11.20 |
11. | bs2  |  105 | melon      |    8.20 |
12. | c0   |  101 | cherry     |    3.20 |
13. | l2   |  104 | lemon      |    6.40 |
14. | m1   |  106 | mango      |   15.70 |
15. | m2   |  105 | xbabay     |    2.60 |
16. | m3   |  105 | xxtt       |   11.60 |
17. | o2   |  103 | coconut    |    9.20 |
18. | t1   |  102 | banana     |   10.30 |
19. | t2   |  102 | grape      |    5.30 |
20. | t4   |  107 | xbababa    |    3.60 |
21. +------+------+------------+---------+
22. 16 rows in set (0.00 sec)

2、在select语句中指定所有字段 根据前面select语句的格式,select关键字后面的字段名为将要查询的数据,因此可以将表中所有字段的名称跟在select子句后面,如果忘记了字段名称,可以使用DESC命令查看表的结构。有时候,由于表中的字段多,不一定能记住所有的字段名称。因此很不方便,不建议使用。

语法格式:

1. mysql> select f_id,s_id,f_name,f_price from fruits;
2. +------+------+------------+---------+
3. | f_id | s_id | f_name     | f_price |
4. +------+------+------------+---------+
5. | a1   |  101 | apple      |    5.20 |
6. | a2   |  103 | apricot    |    2.20 |
7. | b1   |  101 | blackberry |   10.20 |
8. | b2   |  104 | berry      |    7.60 |
9. | b5   |  107 | xxxx       |    3.60 |
10. | bs1  |  102 | orange     |   11.20 |
11. | bs2  |  105 | melon      |    8.20 |
12. | c0   |  101 | cherry     |    3.20 |
13. | l2   |  104 | lemon      |    6.40 |
14. | m1   |  106 | mango      |   15.70 |
15. | m2   |  105 | xbabay     |    2.60 |
16. | m3   |  105 | xxtt       |   11.60 |
17. | o2   |  103 | coconut    |    9.20 |
18. | t1   |  102 | banana     |   10.30 |
19. | t2   |  102 | grape      |    5.30 |
20. | t4   |  107 | xbababa    |    3.60 |
21. +------+------+------------+---------+
22. 16 rows in set (0.00 sec)

查询指定字段

语法格式:

select 字段名 from 表名;

1. mysql> select f_name from fruits;
2. +------------+
3. | f_name     |
4. +------------+
5. | apple      |
6. | apricot    |
7. | blackberry |
8. | berry      |
9. | xxxx       |
10. | orange     |
11. | melon      |
12. | cherry     |
13. | lemon      |
14. | mango      |
15. | xbabay     |
16. | xxtt       |
17. | coconut    |
18. | banana     |
19. | grape      |
20. | xbababa    |
21. +------------+
22. 16 rows in set (0.00 sec)

查询多个字段 使用select声明,可以获取多个字段下的数据,只需要在关键字select后面指定要查询的字段的名称,不同字段名称之间用逗号分隔,最后一个字段后面不需要加逗号

语法格式:

select 字段1,字段2,字段3 ....,字段n from 表名;

1. mysql> select f_name,f_price from fruits;
2. +------------+---------+
3. | f_name     | f_price |
4. +------------+---------+
5. | apple      |    5.20 |
6. | apricot    |    2.20 |
7. | blackberry |   10.20 |
8. | berry      |    7.60 |
9. | xxxx       |    3.60 |
10. | orange     |   11.20 |
11. | melon      |    8.20 |
12. | cherry     |    3.20 |
13. | lemon      |    6.40 |
14. | mango      |   15.70 |
15. | xbabay     |    2.60 |
16. | xxtt       |   11.60 |
17. | coconut    |    9.20 |
18. | banana     |   10.30 |
19. | grape      |    5.30 |
20. | xbababa    |    3.60 |
21. +------------+---------+
22. 16 rows in set (0.00 sec)

查询指定记录

数据库中包含大量的数据,根据特殊要求可能只需要查询表中的指定数据,相当于对数据的过滤。在select语句中,通过where子句可以对数据进行过滤。

语法格式:

select 字段1,字段2....字段n from 表名 where 查询条件;

操作符

说明

=

相等

<>,!=

不相等

<

小于

<=

小于等于

>

大于

>=

大于等于

BETWEEN

位于两端之间

1. mysql> select f_name,f_price from fruits where f_price = 10.2;
2. +------------+---------+
3. | f_name     | f_price |
4. +------------+---------+
5. | blackberry |   10.20 |
6. +------------+---------+
7. 1 row in set (0.00 sec)

带in关键字的查询

in操作符用来查询满足指定范围内的条件的记录,使用IN操作符,将所有检索条件用括号括起来,检索条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项。

1. mysql> select s_id,f_name,f_price 
2.     -> from fruits
3.     -> where s_id in (101,102)
4.     -> order by f_name;
5. +------+------------+---------+
6. | s_id | f_name     | f_price |
7. +------+------------+---------+
8. |  101 | apple      |    5.20 |
9. |  102 | banana     |   10.30 |
10. |  101 | blackberry |   10.20 |
11. |  101 | cherry     |    3.20 |
12. |  102 | grape      |    5.30 |
13. |  102 | orange     |   11.20 |
14. +------+------------+---------+
15. 6 rows in set (0.00 sec)

带between and的范围查询

Between and用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值,如果字段值满足指定的范围查询条件,则这些记录被返回。

1. mysql> select f_name,f_price
2.     -> from fruits
3.     -> where f_price between 2.00 and 10.20;
4. +------------+---------+
5. | f_name     | f_price |
6. +------------+---------+
7. | apple      |    5.20 |
8. | apricot    |    2.20 |
9. | blackberry |   10.20 |
10. | berry      |    7.60 |
11. | xxxx       |    3.60 |
12. | melon      |    8.20 |
13. | cherry     |    3.20 |
14. | lemon      |    6.40 |
15. | xbabay     |    2.60 |
16. | coconut    |    9.20 |
17. | grape      |    5.30 |
18. | xbababa    |    3.60 |
19. +------------+---------+
20. 12 rows in set (0.00 sec)

带like的字符匹配查询

通配符是一种在SQL的where条件子句中拥有特殊意思的字符,SQL语句中支持多种通配符,可以和like一起使用的通配符有‘%’和‘_’。

  1. 百分号(%)通配符,匹配任意长度的字符,甚至包括零字符
1. mysql> select f_id,f_name
2.     -> from fruits
3.     -> where f_name like 'b%';
4. +------+------------+
5. | f_id | f_name     |
6. +------+------------+
7. | b1   | blackberry |
8. | b2   | berry      |
9. | t1   | banana     |
10. +------+------------+
11. 3 rows in set (0.00 sec)
  1. 下划线(__)通配符,一次只能匹配任意一个字符
1. mysql> select f_id,f_name
2.     -> from fruits
3.     -> where f_name like '____y';
4. +------+--------+
5. | f_id | f_name |
6. +------+--------+
7. | b2   | berry  |
8. +------+--------+
9. 1 row in set (0.00 sec)

查询空值

数据表创建的时候,设计者可以指定某列中是否可以包含空值(NULL)。空值不同于0,也不同于空字符串。空值一般表示数据未知、不适用或将在以后添加数据。

创建customers表并插入数据

1. mysql> create table customers
2.     ->  (
3.     ->  c_id int not null auto_increment,
4.     ->  c_name char(50) not null,
5.     ->  c_address char(50) null,
6.     ->  c_city char(50) null,
7.     ->  c_zip char(50) null,
8.     ->  c_contact char(50) null,
9.     ->  c_email char(50) null,
10.     ->  primary key(c_id)
11.     ->  );
12. Query OK, 0 rows affected (0.03 sec)
13. 
14. mysql> insert into customers(c_id,c_name,c_address,c_city,c_zip,c_contact,c_email)
15.     ->   values(10001,'RedHook','200Street','Tianjin','300000','LiMing','LMing@163.com'),
16.     ->   (10002,'Stars','333 FromageLane','Dalian','116000','Zhangbo','Jerry@hotmail.com'),
17.     ->   (10003,'Netbhood','1 Sunny Place','Qingdao','266000','LuoCong',NULL),
18.     ->  (10004,'JOTO','829 Riverside Drive', 'Haikou','570000','YangShan','sam@hotmail.com');
19. Query OK, 4 rows affected (0.00 sec)
20. Records: 4  Duplicates: 0  Warnings: 0

在select语句中使用IS NULL子句,可以查询某字段内容为空的记录。

1. mysql> select c_id,c_name,c_email from customers where c_email is null;
2. +-------+----------+---------+
3. | c_id  | c_name   | c_email |
4. +-------+----------+---------+
5. | 10003 | Netbhood | NULL    |
6. +-------+----------+---------+
7. 1 row in set (0.00 sec)

带and的多条件查询

使用select查询时,可以增加查询的限制条件,这样可以使查询的结果更加精确。MySQL在where子句中使用and操作符限定只有满足所有查询条件的记录才会被返回。可以使用and连接两个甚至多个查询条件,多个条件表达式之间用and分开。

1. mysql> select f_id,f_price,f_name
2.     -> from fruits
3.     -> where s_id = '101' and f_price >=5;
4. +------+---------+------------+
5. | f_id | f_price | f_name     |
6. +------+---------+------------+
7. | a1   |    5.20 | apple      |
8. | b1   |   10.20 | blackberry |
9. +------+---------+------------+
10. 2 rows in set (0.00 sec)

带or的多条件查询

与and相反,在where声明中使用or操作符,表示只需要满足其中一个条件的记录即可返回。or也可以连接两个甚至多个查询条件,多个条件表达式之间用or分开。

1. mysql> select s_id,f_name,f_price
2.     -> from fruits
3.     -> where s_id =101 or s_id =102;
4. +------+------------+---------+
5. | s_id | f_name     | f_price |
6. +------+------------+---------+
7. |  101 | apple      |    5.20 |
8. |  101 | blackberry |   10.20 |
9. |  102 | orange     |   11.20 |
10. |  101 | cherry     |    3.20 |
11. |  102 | banana     |   10.30 |
12. |  102 | grape      |    5.30 |
13. +------+------------+---------+
14. 6 rows in set (0.00 sec)

查询结果不重复

语法格式:select distinct 列名 from 表名;

现在查看fruits表s_id列可以看到很多重复的行

1. mysql> select s_id from fruits;
2. +------+
3. | s_id |
4. +------+
5. | 101 |
6. | 103 |
7. | 101 |
8. | 104 |
9. | 107 |
10. | 102 |
11. | 105 |
12. | 101 |
13. | 104 |
14. | 106 |
15. | 105 |
16. | 105 |
17. | 103 |
18. | 102 |
19. | 102 |
20. | 107 |
21. +------+
22. 16 rows in set (0.00 sec)

添加关键字再次查看s_id列

1. mysql> select distinct s_id from fruits;
2. +------+
3. | s_id |
4. +------+
5. | 101 |
6. | 103 |
7. | 104 |
8. | 107 |
9. | 102 |
10. | 105 |
11. | 106 |
12. +------+
13. 7 rows in set (0.00 sec)

对查询结果排序

1、单列排序

1. mysql> select f_name from fruits;
2. +------------+
3. | f_name     |
4. +------------+
5. | apple      |
6. | apricot    |
7. | blackberry |
8. | berry      |
9. | xxxx       |
10. | orange     |
11. | melon      |
12. | cherry     |
13. | lemon      |
14. | mango      |
15. | xbabay     |
16. | xxtt       |
17. | coconut    |
18. | banana     |
19. | grape      |
20. | xbababa    |
21. +------------+
22. 16 rows in set (0.00 sec)
23. 
24. mysql> select f_name from fruits order by f_name;
25. +------------+
26. | f_name     |
27. +------------+
28. | apple      |
29. | apricot    |
30. | banana     |
31. | berry      |
32. | blackberry |
33. | cherry     |
34. | coconut    |
35. | grape      |
36. | lemon      |
37. | mango      |
38. | melon      |
39. | orange     |
40. | xbababa    |
41. | xbabay     |
42. | xxtt       |
43. | xxxx       |
44. +------------+
45. 16 rows in set (0.01 sec)

2、多列排序

在多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。

1. mysql> select f_name,f_price from fruits order by f_name,f_price;
2. +------------+---------+
3. | f_name     | f_price |
4. +------------+---------+
5. | apple      |    5.20 |
6. | apricot    |    2.20 |
7. | banana     |   10.30 |
8. | berry      |    7.60 |
9. | blackberry |   10.20 |
10. | cherry     |    3.20 |
11. | coconut    |    9.20 |
12. | grape      |    5.30 |
13. | lemon      |    6.40 |
14. | mango      |   15.70 |
15. | melon      |    8.20 |
16. | orange     |   11.20 |
17. | xbababa    |    3.60 |
18. | xbabay     |    2.60 |
19. | xxtt       |   11.60 |
20. | xxxx       |    3.60 |
21. +------------+---------+
22. 16 rows in set (0.00 sec)

3、指定排序方向

默认情况下,查询数据按字母升序进行排序(从A~Z),但数据的排序并不仅限于此,还可以使用order by对查询结果进行降序排序(从Z~A),这可以通过关键字DESC实现。

1. mysql> select f_name,f_price from fruits order by f_name,f_price DESC;
2. +------------+---------+
3. | f_name     | f_price |
4. +------------+---------+
5. | apple      |    5.20 |
6. | apricot    |    2.20 |
7. | banana     |   10.30 |
8. | berry      |    7.60 |
9. | blackberry |   10.20 |
10. | cherry     |    3.20 |
11. | coconut    |    9.20 |
12. | grape      |    5.30 |
13. | lemon      |    6.40 |
14. | mango      |   15.70 |
15. | melon      |    8.20 |
16. | orange     |   11.20 |
17. | xbababa    |    3.60 |
18. | xbabay     |    2.60 |
19. | xxtt       |   11.60 |
20. | xxxx       |    3.60 |
21. +------------+---------+
22. 16 rows in set (0.00 sec)

注:与DESC相反ASC是升序


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
关系型数据库 MySQL
mysql关联查询
mysql关联查询
19 0
|
27天前
|
存储 关系型数据库 MySQL
MySQL数据库的数据类型、语法和高级查询
MySQL数据库的数据类型、语法和高级查询
30 0
|
14天前
|
SQL 关系型数据库 MySQL
MySQL数据库—DQL查询语句(一篇教会你快速找到想要的数据)
MySQL数据库—DQL查询语句(一篇教会你快速找到想要的数据)
|
19天前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用问题之mysql迁移后查询不走索引了,该如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
27天前
|
存储 缓存 监控
MySQL 8.0中查询缓存的废弃与原因分析
MySQL 8.0中查询缓存的废弃与原因分析
39 1
|
1月前
|
SQL 关系型数据库 MySQL
MySQL周内训参照3、简单查询与多表联合复杂查询
MySQL周内训参照3、简单查询与多表联合复杂查询
23 1
|
11天前
|
SQL 关系型数据库 MySQL
Navicate,数据库,Mysql,改表,4月29日Finished - Unsuccessfully,导出数据不妨,右键,备份一下Mysql数据库的内容,你想导入和导出数据不如,用查询的方式去做
Navicate,数据库,Mysql,改表,4月29日Finished - Unsuccessfully,导出数据不妨,右键,备份一下Mysql数据库的内容,你想导入和导出数据不如,用查询的方式去做
|
13天前
|
存储 关系型数据库 MySQL
【Elasticsearch】在es中实现mysql中的FIND_IN_SET查询条件
【Elasticsearch】在es中实现mysql中的FIND_IN_SET查询条件
20 0
|
14天前
|
存储 关系型数据库 MySQL
MySQL数据库—多表设计与关联查询
MySQL数据库—多表设计与关联查询
|
14天前
|
关系型数据库 MySQL 数据库
MySQL数据库—查询:关联查询(一篇教会你在多表关联下查询数据)
MySQL数据库—查询:关联查询(一篇教会你在多表关联下查询数据)