写在前面 前面学习使用DML来管理数据库中的数据,接下来学习如何使用数据查询语言(Data Query Language)来对数据库中存储的数据进行查询操作。说白了就是介绍如何从数据库中获取数据,开发者可以按照DQL的语法给数据库发送一条指令,然后数据库就会按照需求来返回满足条件的数据。
由于DQL使用起来较为复杂,且应用场景较为广泛,因此这里分多篇进行介绍学习。本篇是DQL基础篇,主要学习的内容如下所示:(1)DQL基本语法格式;(2)查询常量;(3)查询表达式;(4)查询函数;(5)查询指定字段;(6)查询所有列;(7)列别名;(8)表别名等。
DQL语法 基本语法格式 数据查询最基本的语法格式如下所示:
请注意,由于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)
查询表达式 查询表达式的语法格式如下所示:
例子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)
查询函数 查询函数的语法格式如下所示:
例子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表中两个字段的数据。
查询所有列 查询所有列的语法格式如下所示:
注意上面格式中的*
表示返回表中的所有字段。
例子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 *
子句,而应当是具体的列名,也就是需要什么字段就选择什么字段。