数据查询语言DQL

DQL(data query language)数据查询语言 select操作。

基本查询

语法形式

select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];

select语句表示从某个或某些表中查询(取得)若干条数据。

select语句,作用是从“数据源”中,找出(取出)一定的数据,并作为该语句的返回结果(数据集)。

上述语法形式中,所有中括号中的部分都是可以省略的,但如果出现,则他们的顺序必须按上述给出的顺序书写。

而且,逻辑上,后一子句都是在前一子句所获得结果的基础上再进行其设定的功能操作。

如图所示:

mysql查询出带中文的数据 mysql数据查询语言_基本查询

数据源

通常,数据源就是“表”。但是:也可以没有数据源,而是使用“直接数据”(或函数执行结果)。

mysql查询出带中文的数据 mysql数据查询语言_字段或表达式列表_02

mysql查询出带中文的数据 mysql数据查询语言_from子句_03

mysql查询出带中文的数据 mysql数据查询语言_数据查询语言DQL_04

mysql查询出带中文的数据 mysql数据查询语言_mysql查询出带中文的数据_05

可以给其加上字段(别)名:

mysql查询出带中文的数据 mysql数据查询语言_字段或表达式列表_06

此语法,不可以没有from子句而使用表的字段:

mysql查询出带中文的数据 mysql数据查询语言_字段或表达式列表_07

而如果有表(from子句),则对字段同样可以进行“计算”:

mysql查询出带中文的数据 mysql数据查询语言_数据查询语言DQL_08

还可以对表中的字段和“直接值”(或函数返回值)同时并列“取出”:

mysql查询出带中文的数据 mysql数据查询语言_数据查询语言DQL_09

也可以使用“表名.字段名”的形式来指定某个表的某个字段(通常用于多表查询):

mysql查询出带中文的数据 mysql数据查询语言_mysql查询出带中文的数据_10

[all | distinct]

[all | distinct]表示是否返回取得的数据中的“重复行”。

用于设定所select出来的数据是否允许出现重复行(完全相同的数据行)。

all表示会返回重复行,允许出现。

distinct表示不返回重复行,就是所谓的“消除重复行”。意思是,重复的若干行数据就只返回一行。

默认不写就是all(允许的),也是最常用的,因为通常数据都不会有重复行。

字段或表达式列表:

使用形式

字段或表达式1 [as] [别名1], 字段或表达式2 [as] [别名2], ....
  • 这部分最常见的就是字段列表。select语句的各部分中,就这部分不可以省略。每一项之间用逗号分开,表示结果集中的一个字段值。
  • 字段就是表示某个或某些表的中的字段名,顺序可以按需要的写,而不必非得按数据表中字段的本来顺序。
  • 也可以是“表达式”。
  • 每一个字段或表达式都可以使用一个“别名”来重新命名。

示例如下:

  1. 最常规情况:
select id, userName, userPswd, realName from userInfo;
  1. 给其中的2个字段设定了别名,其中as关键字可以省略,但建议都写上:
select id, userName as un, userPswd as up, realName from userInfo;
  1. 将userName和userPswd“连接起来”作为一个字符串字段,这就是表达式:
select id,concat(userName, userPswd) from userInfo;
  1. 连接了字段和其他非字段数据(这里是一个“-”),并给其一个别名:
select id, concat(userName,'-',userPswd) as uu from userInfo;
  1. 一个字段值,一个固定值(别名为f1),一个计算值(别名为f2):
select id,5 as f1, 1+2*3 as f2 from userInfo;
  1. 注意:如果要“取得”的数据根本不在表格中的时候,就无需from子句了:
select 5 as f1, 1+2*3 as f2;
  1. 字段前可以用表名来做限定,通常只有from子句有多个表,且不同表的名称有相同字段的时候需要。如果字段名本身就不同,也可以不写:
select 表名1.id, 表名2.id as id2, 表名1.userName, regTime, tele from 表1,表2;

注意:别名可在后续的语法部分(比如group部分,order部分)当作字段名使用,但不能在where部分使用。

from子句

就是指定数据的来源,其实就是“表”,可以是一个表名,也可以是多个表名(多表查询)。

表示从哪个(或哪些)表中取得数据。

可以不从任何表中取得数据,此时from子句就可以省略了。举例如下:

from 表名1;  # 这是最常用,最基本,也是最容易理解的情况。

from 表名1,表名2;  # 表示从这2个表中取得数据。具体到底怎么取,就涉及到“连接查询”。

from 表名1 [连接方式] 表名2 on 连接条件;  # 是从2个表中取得数据并指定这两个表的连接方式和连接条件。