SELECT语句:从一个或多个表中检索信息
为了使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择
检索单个列
SELECT prod_name FROM products; 从products表中检索一个名为prod_name的列
如果没有明确排序查询结果,则返回的数据的顺序没有特殊意义。返回数据的顺序可能是数据被添加到表中的顺序,也可能不是。只要返回相同数目的行,就是正常的
如果你使用的是mysql命令行,必须加上分号来结束SQL语句
SQL语句不区分大小写。许多SQL开发人员喜欢对所有SQL关键字使用大写,而对所有列和表名使用小写
在处理SQL语句时,其中所有空格都被忽略。SQL语句可以在一行上给出,也可以分成许多行
检索多个列
在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加
SELECT prod_id, prod_name, prod_price FROM products;
SQL语句一般返回原始的、无格式的数据。数据的格式化是一个表示问题,而不是一个检索问题。因此,表示一般在显示该数据的应用程序中规定。一般很少使用实际检索出的原始数据
检索所有列
SELECT语句可以检索所有的列而不必逐个列出它们,通过在实际列名的位置使用星号(*)通配符来达到
SELECT * FROM products;
列的顺序一般是列在表定义中出现的顺序,但有时并不是这样的,表的模式的变化(如添加或删除列)可能会导致顺序的变化
检索不必要的列通常会降低检索和应用程序的性能
不明确指定列名(因为星号检索每个列),能检索出名字未知的列
检索不同的行
DISTINCT关键字指示MySQL只返回不同的值
SELECT DISTINCT vend_id FROM products;
如果使用DISTINCT关键字,必须直接放在列名的前面
SELECT DISTINCT vend_id, prod_price FROM products;
不能部分使用DISTINCT,DISTINCT关键字应用于所有列而不仅是前置它的列
限制结果
SELECT语句返回所有匹配的行,为了返回第一行或前几行,可使用LIMIT子句
SELECT prod_name FROM products LIMIT 5; 检索单个列,LIMIT 5指示MySQL返回不多于5行
SELECT prod_name FROM products LIMIT 4, 5; LIMIT4, 5指示MySQL返回从行4开始的5行。第一个数为开始位置,第二个数为要检索的行数
带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT可以指定从行号为第一个值的位置开始
行0 检索出来的第一行为行0而不是行1。因此,LIMIT 1, 1将检索出第二行而不是第一行
LIMIT中指定要检索的行数为检索的最大行数,如果没有足够的行,MySQL将只返回它能返回的那么多行
LIMIT 3, 4表示从行3开始的4行;替代语法LIMIT 4 OFFSET 3意为从行3开始取4行
使用完全限定的表名
使用完全限定的名字来引用列(同时使用表名和列名);表名也可以是完全限定的
SELECT products.prod_name FROM crashcourse.products;
排序数据
如果不排序,数据一般将以它在底层表中出现的顺序显示。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义
SQL语句是由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成
为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序
SELECT prod_name FROM products ORDER BY prod_name; 从products表中检索prod_name列,按prod_name列以字母顺序排序数据,返回所有行
通过非选择列进行排序,用非检索的列排序数据是完全合法的
按多个列排序
为了按多个列排序,只要指定列名,列名之间用逗号分开即可
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name; 检索三个列,并按其中两个列对结果进行排序
按多个列排序时,排序完全按所规定的顺序进行
指定排序方向
为了降序排序,必须指定DESC关键字
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;
DESC关键字只应用到直接位于其前面的列名。如果想在多个列上进行降序排序,必须对每个列指定DESC关键字
与DESC相反的关键字是ASC,升序是默认的
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1; 使用ORDER BY和LIMIT的组合,找出一个列中最高的值
在给出ORDER BY子句时,应该保证它位于FROM子句之后,如果使用LIMIT,它必须位于ORDER BY之后