查询
- SELECT语句:SELECT语句的用途是从一个或多个表中检索数据,需要给出两条信息:选择什么&&从什么地方选择。
1. 检索数据基础——SELECT语句
1.1 检索单个列
- 语法:
SELECT colName
FROM tableName;
-
数据顺序:在没有指定查询排序结果的情况下,返回数据的顺序是没有特殊意义的。
-
结束SQL语句:多条SQL语句需要以分号(;)结尾
- 注意:某些DBMS可能需要每一句单句SQL语句结尾都要加分号
-
SQL语句大小写:SQL语句实际上是不区分大小写的,也即select与SELECT是一样的;但习惯而言,开发者往往喜欢对SQL关键字使用大写,而对所有列和表名使用小写从而使代码易于阅读和调试。
-
忽略空格:在处理SQL语句时,所有的空格都会被忽略,可以将较长的语句拆分成多行以便阅读和调试。
1.2 检索多个列
- 语法:
SELECT col1Name,col2Name,col3Name...
FROM tableName;
- 注意逗号:在检索多个列时,需要在列名之间加上逗号,但最后一个列名不需要加。
1.3 检索所有列——使用通配符*
- 语法:
SELECT *
FROM tableName
- 使用通配符:一般情况下,除非确实需要表中的所有列,应该尽量避免使用通配符*。检索不需要的列通常会减低检索和应用程序的性能。
- 通配符优点:由于不明确指定列名,所以使用通配符可以检索出名字未知的列。
1.4 检索不同的行——DISTINCT关键字
- 使用DISTINCT关键字:去除重复值,指示MySQL只返回不同的值
- 注意:不能部分使用DISTINCT:DISTINCT关键字作用于所有列而不仅仅是前置它的列,换言之,如果给出多个选择列,除非某些行的值在所有列中都有重复,否则所有行都会被检索出来。
- 语法:
SELECT DISTINCT colName
FROM tableName;
1.5 限制检索结果——LIMIT子句
- 使用LIMIT子句:返回第一行或者前几行
- 语法:
# 选取前5行
SELECT colName
FROM tableName
LIMIT 5;
# 选取从行5开始的5行
SELECT colName
FROM tableName
LIMIT 5,5;
- 注意
- 行n:索引是从0开始的,所以第一行是行0而不是行1;因此,LIMIT 1,1检索出来的是表的第二行而非第一行。
- 行数不够时,返回剩下的所有行。
- LIMIT的替代用法:LIMIT 3,4含义是从行3开始的4行;在MySQL5之后,支持使用LIMIT 4 OFFSET 3来替代上述用法。
1.6 使用完全限定的表名
- 使用完全限定的名字来引用列(同时使用表名和列字)/表名
# 完全限定的列名
SELECT tableName.colName
FROM tableName;
# 完全限定的表名
SELECT tableName.colName
FROM dataBaseName.tableName;
2. 排序检索数据——ORDER BY子句
-
子句(clause):SQL语句是由子句构成的,有些子句是必须的,而有些则是可选的。一个子句通常是由一个关键字和所提供的数据组成。
-
注意:由SELECT语句直接检索出来的数据并不是以纯粹的随即顺序显示的。**如果不排序,数据一般将以它在底层表中出现的顺序显示。**这个顺序可以是最初添加到表中的顺序,但是如果数据后来进行过更新或者删除,则顺序会受到MySQL重用回收存储空间的影响。因此,如果不明确控制顺序,则认为检索出来的数据顺序没有意义。
-
ORDER BY子句:为了明确地排序用SELECT语句检索出的数据,可以使用ORDER BY子句。它选取一个或多个列的名字,据此对输出进行排序。
- 通常,ORDER BY子句使用的列为检索列,但是使用非检索列进行数据排序也是完全合法的。
-
语法:
SELECT colName
FROM tableName
ORDER BY colName;
2.1 按多列进行排序
-
在实际运用中,我们可能需要使用多列进行排序(如先按姓氏排序,再按名字排序)。但值得注意的是,只有在对于前一个排序列,多个行有相同值时,后一个排序列才是有意义的。(例如如果没有姓氏相同的行,那么只会按姓氏排序,后续用名字排序是没有意义的)
-
语法:
SELECT colName
FROM tableName
ORDER BY colName1,colName2...;
2.2 指定排序方向——DESC、ASC关键字
- 排序顺序默认为升序排列(ASC关键字ASCENDING,其实这个关键字没啥用,因为默认就是升序),如要使用降序排列,则需要使用DESC关键字
- 多个列降序排序:DESC关键字只作用在位于它前面的列名,如果要在多个列上指定降序排序,必须为每个列指定DESC关键字。
- 区分大小写和排序顺序:在MySQL中,使用默认字典排序顺序,也即大小写字母是视为相同的,如果需要更改这种排序顺序,简单的ORDER BY子句是做不到的,需要请求数据库管理员的帮助。
- 子句的顺序:在给出ORDER BY子句时,应该确保它在FROM子句后面;如果要使用LIMIT子句,则要保证它在ORDER BY子句后面。子句顺序不对会报错!