写在前面

前面学习使用DML来管理数据库中的数据,接下来学习如何使用数据查询语言(Data Query Language)来对数据库中存储的数据进行查询操作。说白了就是介绍如何从数据库中获取数据,开发者可以按照DQL的语法给数据库发送一条指令,然后数据库就会按照需求来返回满足条件的数据。

由于DQL使用起来较为复杂,且应用场景较为广泛,因此这里分多篇进行介绍学习。本篇是DQL基础篇,主要学习的内容如下所示:(1)DQL基本语法格式;(2)查询常量;(3)查询表达式;(4)查询函数;(5)查询指定字段;(6)查询所有列;(7)列别名;(8)表别名等。

DQL语法

基本语法格式

数据查询最基本的语法格式如下所示:

1
select 查询的列 from 表名;

请注意,由于MySQL不区分大小写,因此语句中的select和SELECT、from和FROM最终效果都是一致的。

查询结果会放在一个表格中,表格的第一行称为列头,自第二行开始是数据,有点类似于一个二维数组。

查询常量

查询常量的语法格式如下所示:

1
select 常量值1,常量值2,常量值3,...;

例子1:下面就展示了,如何查询常量:

1
2
3
4
5
6
7
mysql> select 1,'a';
+---+---+
| 1 | a |
+---+---+
| 1 | a |
+---+---+
1 row in set (0.04 sec)

查询表达式

查询表达式的语法格式如下所示:

1
select 表达式;

例子2:下面就展示了,如何查询表达式:

1
2
3
4
5
6
7
mysql> select 1+1,2*4,10/3;
+-----+-----+--------+
| 1+1 | 2*4 | 10/3 |
+-----+-----+--------+
| 2 | 8 | 3.3333 |
+-----+-----+--------+
1 row in set (0.16 sec)

查询函数

查询函数的语法格式如下所示:

1
select 函数;

例子3:下面就展示了,如何查询函数:

1
2
3
4
5
6
7
mysql> select mod(10,4),isnull(null),ifnull(null,'第一个参数为空返回这个值'),ifnull(1,'第一个参数为空返回这个值,否则返回第一个参数');
+-----------+--------------+-----------------------------------------+----------------------------------------------------------+
| mod(10,4) | isnull(null) | ifnull(null,'第一个参数为空返回这个值') | ifnull(1,'第一个参数为空返回这个值,否则返回第一个参数') |
+-----------+--------------+-----------------------------------------+----------------------------------------------------------+
| 2 | 1 | 第一个参数为空返回这个值 | 1 |
+-----------+--------------+-----------------------------------------+----------------------------------------------------------+
1 row in set (0.08 sec)

在上面的例子中,mod函数用于对两个参数进行取模运算;isnull函数用于判断参数是否为空,如果为空则返回1,否则返回0;ifnull函数,里面有两个参数,用于判断第一个参数是否为空,如果为空则返回第二个参数的值,否则就返回第一个参数的值。

查询指定字段

查询指定字段的语法格式如下所示:

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

例子4:下面就展示了,如何查询指定字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> drop table if exists envy3;
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> create table envy3(
-> a int not null comment '字段a',
-> b varchar(10) not null default '' comment '字段b'
-> );
Query OK, 0 rows affected (0.68 sec)

mysql> insert into envy3 values(1,'a'),(2,'b'),(3,'c'),(4,'d');
Query OK, 4 rows affected (0.14 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> select a,b from envy3;
+---+---+
| a | b |
+---+---+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+---+---+
4 rows in set (0.00 sec)

可以看到envy3表中有两个字段a,b,然后我们使用select a,b from envy3;语句来查询envy3表中两个字段的数据。

查询所有列

查询所有列的语法格式如下所示:

1
select * from 表名;

注意上面格式中的*表示返回表中的所有字段。

例子5:下面就展示了,如何查询所有列:

1
2
3
4
5
6
7
8
9
10
mysql> select * from envy3;
+---+---+
| a | b |
+---+---+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+---+---+
4 rows in set (0.00 sec)

列别名

在创建数据表的时候,一般会使用英文单词或者英文单词缩写来设置字段名称,但是这样会使得在查询的时候列名都是以英文形式进行显示的,不太方便用户阅读,因此推荐大家使用别名来代替英文列名,以增强数据的阅读性。

查询时给列取别名的语法格式如下所示:

1
select 列名 [as] 列的别名 from 表名;

例子6:下面就展示了,如何使用单引号来创建别名

1
2
3
4
5
6
7
8
9
10
mysql> select a '列名1',b '列名2' from envy3;
+-------+-------+
| 列名1 | 列名2 |
+-------+-------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+-------+-------+
4 rows in set (0.00 sec)

例子7:下面就展示了,如何使用双引号来创建别名

1
2
3
4
5
6
7
8
9
10
mysql> select a "列名1",b "列名2" from envy3;
+-------+-------+
| 列名1 | 列名2 |
+-------+-------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+-------+-------+
4 rows in set (0.00 sec)

例子8:下面就展示了,如何不使用引号来创建别名

1
2
3
4
5
6
7
8
9
10
mysql> select a 列名1,b 列名2 from envy3;
+-------+-------+
| 列名1 | 列名2 |
+-------+-------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+-------+-------+
4 rows in set (0.10 sec)

例子9:下面就展示了,如何使用as来创建别名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> select a as 列名1,b as 列名2 from envy3;
+-------+-------+
| 列名1 | 列名2 |
+-------+-------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+-------+-------+
4 rows in set (0.00 sec)

mysql> select a as 列名1,b as 列名 2 from envy3;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 from envy3' at line 1
mysql> select a as 列名1,b as '列名 2' from envy3;
+-------+--------+
| 列名1 | 列名 2 |
+-------+--------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+-------+--------+
4 rows in set (0.00 sec)

由上面的执行结果可以知道,如果别名中包含特殊符号,如空格,此时别名必须使用引号括起来,否则程序会抛异常。

上面的例子是不是都看仔细了,接下来看一个比较综合的例子,这个例子会让人头晕。

例子10:下面就展示了,一个比较懵的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mysql> select 'a' 'b';
+----+
| a |
+----+
| ab |
+----+
1 row in set (0.00 sec)

mysql> select 'a' b;
+---+
| b |
+---+
| a |
+---+
1 row in set (0.00 sec)

mysql> select 'a' "b";
+----+
| a |
+----+
| ab |
+----+
1 row in set (0.00 sec)

mysql> select 'a'as "b";
+---+
| b |
+---+
| a |
+---+
1 row in set (0.00 sec)

是不是比较晕,仔细看一下第一个和第三个返回的结果,注意列名和数据,建议这种情况使用as,然后在as后面跟上列的别名。其实更推荐在任何时候都使用as,因为这是一种比较规范的写法。

表别名

除了可以在查询的时候给列去别名,开发者还可以给表取别名。

查询时给表取别名的语法格式如下所示:

1
select 别名.字段,别名.* from 表名 [as] 别名;

例子11:下面就展示了,如何在查询的时候给表创建别名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
mysql> select * from envy3;
+---+---+
| a | b |
+---+---+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+---+---+
4 rows in set (0.01 sec)

mysql> select e3.a,e3.b from envy3 as e3;
+---+---+
| a | b |
+---+---+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+---+---+
4 rows in set (0.10 sec)

mysql> select e3.a as '列1',e3.b as '列2' from envy3 as e3;
+-----+-----+
| 列1 | 列2 |
+-----+-----+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+-----+-----+
4 rows in set (0.00 sec)

mysql> select e3.* from envy3 as e3;
+---+---+
| a | b |
+---+---+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+---+---+
4 rows in set (0.00 sec)

mysql> select * from envy3 as e3;
+---+---+
| a | b |
+---+---+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+---+---+
4 rows in set (0.00 sec)

可以看到这里顺便将之前的知识进行了使用。还是那句话,建议在别名的前面都加上as,这样可以避免一些错误的产生。还有在查询数据的时候,尽量避免使用select *子句,而应当是具体的列名,也就是需要什么字段就选择什么字段。