使用SELECT语句进行检索
SQL SELECT:
- 输入:SELECT prod_name FROM products
- 利用SELECT语句从products表中检索一个名为prod_name的列
- 输出列的信息
未排序数据:
在自己做上述语句的时候可能顺序不同
如果没有明确排序查询结果,那查询后的顺序没有任何意义
对上面的操作会返回列中的所有行,没有过滤和排序操作
结束SQL语句:要求以分号结束,DBMS中部分允许不加分号,但特定的情况下需要,所以加个分号几乎总是好的,尤其是使用mysql命令行,此时必须使用分号来结束SQL语句
SQL语句不区分大小写
SQL开发人员习惯于使用大写来标记关键字,而对所有列和表名使用小写,这样做使得代码易于阅读和调试
语句空格:
在处理SQL语句时,其中所有的空格都被忽略。SQL语句可以在一行上给出,也可以分成许多行,多数SQL开发人员认为为SQL语句进行多行的划分更容易阅读和调试
检索多个列
要想从一个表中检索多个列,使用相同的SELETE语句。唯一的不同是必须在SELECT关键字后给出多个列名,列名之中必须以逗号分隔。
!!!@在选择多个列是,一定要在列名之间加上逗号,但最后一个列名不加。如果在·最后一个列名加上逗号,会出现错误
-
输入:SELECT prod_id , prod_name , prod_price
FROM products -
分析:与前一个例子一样,这条语句使用SELECT语句从表products中选择数据。在这个例子中,
指定了3个列名,列名之间用逗号分隔。此语句输出如下: -
输出:对应表列——————
。。。。。。。| 。。 | 。。 |
。。。。。。。| 。。 | 。。 |
、、、、、、、——————@@数据表示:
从上述输出可以看到,SQL语句一般返回原始的、无格式的数据。数据的格式化是一个表示问题,而不是一个检索问题,因此,表示(对齐和显示上面的价格值,用货币符号和逗号表示其金额)一般在显示该数据的应用程序中规定。一般很少使用实际检索出的原始数据(没有应用程序提供的格式)
检索所有列
除了指定所需的列外(如上所述,一个或多个列),SELECT语句还可以检索所有的列而不必逐个列出列出他们。这可以通过在实际列名的位置使用星号(*)通配符来达到,如下所示:
- 输入:SELECT *
FROM products
-如果给定一个通配符(*),则返回表中所有列(和java包中的“ * ”一样作用)
列的返回顺序一般是列在表定义中出现的顺序。但有时候并不是这样的,表的模式的变化可能导致顺序的变化。
通配符的使用
一般除了确实需要,否则最好别用这个通配符,它可能会降低检索和应用程序的性能。
检索不同的行(检索的去重)
如上所示,SELECT返回所有匹配的行。但是,如果不想要每个值每次都出现,则需要另外的办法
譬如:想要得出products表中产品的所有供应商ID:
-
输入: SELECT vend_id
FROM products; -
输出vend_id:
这样得出的数据会有14行,因为返回的是products表里所有产品的数据
那么要怎样才能只返回需要的数据的真实数量呢? -
输入: SELECT DISTINCT vend_id
FROM products -
分析:使用DISTINCT关键字,此关键字指示MySQL使之不会多次返回重复值
该关键字必须直接用在类名的前面。
DISTINCT应用于所有列而非前置它的列
如果给定SELECT DISTINCT ven_id ,prod_price。除非指定的两个列都不同,否则所有航都会被检索出来
【简单的说就是对小写的关键词对应的列的数据进行去重,如果两个列名,则是综合考虑,去除两个都重复的。】
限制结果
【【
SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可以使用LIMIT子句。
】】
- 输入:SELECT prod_name
FROM products
LIMIT 5;
-上述语句先使用SELECT语句返回多个列,LIMIT5指示MySQL返回的值不超过5行
获取下一个5行/向后返回读取:
- 输入 SECECT prod_name
FROM products
LIMIT 5,5;
(或者可以替代使用LIMIT 5 OFFSET 5 以避免可能出现的歧义)
LIMIT5,5指示从MySQL返回从行5开始的5行,第一个数为开始位置,第二个为要检索的行数
行的标号 从0开始,所以LIMIT 1,1将得出第二行而不是第一行
使用完全限定的列名引用列
如SELECT products.prod_name
FROM products
这就像用类::成员函数一样,用表名来限制列的归属
!!同理也可以用数据库名来限定表名!:
如SELECT products.prod_name
FROM crashcourse.products;
(实际上等于
SELECT prod_name FROM products 的作用,但是不同点在于对表名完全限定)