select语句,是数据库中使用最广泛的语句。

查询表中所有数据

语法如下:

select * from [数据库名.]表名;

语句中的*号,表示数据表中的所有字段。

connect-database-workbench-1

如果已经使用use 数据库名语句选定了数据库,则在执行查询语句时,可以不指定数据库名。

示例:

select * from school.student;

查询表中指定字段

语法如下:

select 字段1,字段2,... from [数据库名.]表名;
connect-database-workbench-1

示例:

select student_id,student_name from school.student;

查询表中部分数据

语法如下:

select * 
from [数据库名.]表名
where 查询条件1
and|or 查询条件2
...;

and:查询条件1和查询条件2都满足才返回;

or:查询条件1和查询条件2只要有一个满足就返回;

connect-database-workbench-1

当有多个查询条件时,查询条件的执行顺序可能会影响最终返回的结果。默认情况下,查询条件是从左到右、从上到下执行的。可以使用括号改变查询条件的执行顺序。

比如:(查询条件1 and 查询条件2) or (查询条件3 and 查询条件4)

示例:

查看年龄在10岁以上的男同学:

select *
from school.student
where age > 10
and gender = '男';

查询表中指定字段的部分数据

语法如下:

select 字段1,字段2,...
from [数据库名.]表名
where 查询条件1
and|or 查询条件2
...;
connect-database-workbench-1

示例:

select student_id,student_name
from school.student
where age > 10
and gender = '男';

完整的SELECT语句

语法如下:

SELECT
    [distinct]
    * | [表名|表别名.]字段1 [as] [字段别名1],[表名|表别名.]字段2 [as] [字段别名1],...
[FROM 表名 [as] [表别名]
[WHERE 查询条件]
[GROUP BY子句]
[HAVING子句]
[ORDER BY 子句]
[LIMIT 子句]

表名、字段名如果为SQL的关键字,会引起歧义导致语法错误。此时,需要在表名和字段名两边加上反引号`。如`table`;

select语句中的部分子句可以没有,但书写不能乱。必须以上面的顺序书写。

示例:

查询student表中,教授50个以上大于10岁的学生的前5个老师id及学生数量:

select
    a.teacher_id,
    count(1)
from school.student a
where a.age > 10
group by a.teacher_id
having count(1) >= 50
order by a.teacher_id asc
limit 5;

表别名

在FROM的表名后面,可以为表取一个别名。这样在使用这个表中的字段时,除了可以限定表名外,还可以限定别名。

这在FROM后有多张表或表名本身较长时,非常有用。

当然,当FROM后面只有一张表时,SELECT中使用的字段名前可以不限定表名或表别名,因为即使不限定也不会引起歧义。

设置的表别名如果为SQL的关键字或包含有空格,需要在别名两边添加反引号`。如`table`;

比如:

select student.student_id,student.student_name from student;

等价于:

select a.student_id,a.student_name from student as a;

字段别名

跟表别名一样,也可以为字段设置别名。设置字段别名后,返回的结果集的列名即名设置后的别名。

比如:

select student_id as id,student_name as name from student;

设置的字段别名如果为SQL的关键字或包含有空格,需要在别名两边添加反引号`。如`table`;

DISTINCT去除重复

当SELECT的结果集中存在重复数据,而对于重复数据又只想返回一条时,可以使用DISTINCT关键字,对SELECT返回的结果集去重。

示例:

查询学生表中所有的teacher_id、teacher_name并去重:

select distinct teacher_id,teacher_name from student;

LIMIT限定返回行数

在不做其他限定的情况下,SELECT语句返回所有符合条件的行。但如果返回的行比较多,而又只需要返回部分行时,可以使用LIMIT关键字进行限定。常常应用于WEB应用中的分页功能。

语法如下:

limit [位置偏移量[,|offset]]行数

位置偏移量:指定从哪一行结果开始返回。第一行的位置偏移量为0;如果不指定位置偏移量,会从第一行开始返回;

行数:要返回的总行数;

offset:在LIMIT子句中,使用逗号,与使用offset关键字是等价的。也就是说,limit m,n等价于limit m offset n;

示例:

按student_id升序排序,返回前5名学生:

select * from school.student order by student_id limit 5;

按student_id升序排序,每10行记录为一页,返回第3页(开始的位置偏移量为20)的记录:

select * from school.student order by student_id limit 20,10;

在未指定返回顺序的情况下,SELECT结果集的返回结果是无序的。所以在使用LIMIT子句时,经常搭配ORDER BY子句一起使用,否则返回的结果可能是不稳定的;

limit n与limit 0,n是等价的;

limit 1,1返回的是第二行的记录;

SELECT子句的执行顺序

数据库接收到查询请求时,按照预先定义好的顺序进行执行。

select子句的执行顺序如下:

FROM > WHERE > GROUP BY > HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
picture loss