赞
踩
从表中选取数据需要用到SELECT语句,该过程称为匹配查询或查询。该语句是SQL中使用最多的语句。
SELECT字句是可以单独输出计算结果的,例如:
SELECT 1 + 2;
图1 SELECT 1+2 ; 的运行结果
-------------------分割线-------------------
-- 基本语法:
SELECT <列1>,<列2>,…… -- 列举出要查询的列名称
FROM <表名>; -- 指定要查询的表名
-- 例:在order_info表中查询用户ID,名称和居住地
SELECT id , consignee , delivery_address
FROM order_info;
图2 order_info表
图3 查询结果
-- 例:查询order_info表中所有的列
SELECT * -- '*'代表全部的意思
FROM order_info;
图4 查询所有的列执行结果
SQL语句可以用AS关键字为查询出的列设置别名
-- 例:从order_info表中查询数据
SELECT id AS ID ,
consignee AS NAME ,
delivery_address AS `add`
FROM order_info;
图5 为列设定别名执行结果
别名也可以设置成中文,但需要用双引号括起来(" ")
-- 例:
SELECT id AS "编码" ,
consignee AS "姓名" ,
delivery_address AS "地址"
FROM order_info;
图6 设置中文别名查询结果
SELECT字句不仅可以查询列,还可以将某个常数作为查询结果输出。
-- 例:将数字10和字符串"编码"作为列输出("10"与"编码"仅作例子使用,无实际意义)
SELECT 10 AS 数字 ,
"编码" AS string ,
delivery_address AS "地址"
FROM order_info;
图7 将常数作为列输出
在要去重的列前使用DISTINCT修饰即可完成,在使用DISTINCT时,NULL也会被视为一类数据,同时也可以将两列进行组合进行去重处理,将重复的组合合并成一条。
-- 例:查询订单时间
SELECT DISTINCT expire_time
FROM order_info;
图8 原数据
图9 去重后查询结果
许多场景下并不需要查询全部的数据,大部分情况要将表中符合条件的数据输出出来,此时就用到了WHERE字句。
例如要查询出province_id为27的相关订单信息
SELECT id AS ID , consignee AS "姓名" , delivery_address AS "地址" ,province_id AS "省份编号"
FROM `order_info`
WHERE province_id = 27;
图10 查询省份编号为27的相关订单信息
WHERE子句中的province_id = 27是将province_id的值与27进行比较,如果符合条件即输出相关行。也可以不输出作为条件的列,如图所示:
图11 不输出作为条件的列
SQL语句中也可以使用计算表达式,例如
-- 查询所有商品的id,名称,价格及价格的二倍
SELECT sku_id AS ID ,
sku_name AS "商品名称" ,
order_price AS "商品价格" ,
order_price * 2 AS "商品价格 * 2"
FROM `order_detail`
图12 带有计算表达式的查询结果
SQL中也有四则主要运算,分别是加、减、乘、除,运算符分别是(+ , - , * , / ),也被称为算术运算符。除了算术运算符外,SQL中还有其他各种各样的运算符。当然,也可以像平常的运算表达式一样用括号来表示运算的优先级。
有如下表达式:
5 + NULL
10 - NULL
1 * NULL
4 / NULL
NULL / 9
NULL / 0
这些表达式的运算结果都是NULL,在SQL中,NULL与任何数的运算结果都是NULL(若业务中有要求 5 + NULL的结果等于5,通过函数可以实现这一需求。)
在WHERE字句中使用的"="就是比较运算符的一种,除此之外还有其他运算符如:
大于:>
大于等于:>=
小于:<
小于等于:<=
不等于:<>
注:不等于的表现方式最好使用<>,虽然很多RDBMS支持 != 这种写法,但这是不被标准SQL所承认的。
这些比较运算符可以对字符,数字,日期等几乎所有数据类型的列和值进行比较。同时可以在WHERE条件中使用,例如查询所有利润大于等于500元的商品信息:
SELECT *
FROM order_info
WHERE sell_price - cost_price >= 500;
注:数据类型为字符串的’2’与"13"和数据类型为数字的 2 与 13 的比较结果是不同的。
图13 比较结果
'0’代表结果为假,‘1’代表结果为真。
如果是数据类型为数字的2与13,那么会进行正常的大小比较
如果是数据类型为字符串的’2’与’13’,那么就会进行字符串的大小比较
字符串的大小比较:字符串的大小比较是从前向后进行,所以会将2与’13’中的1进行比较,2比1大,得出结果为真。
字符串的大小比较是按照字典序进行排序,比如apple<banana,该等式结果为真,切勿与数字比较大小的概念混淆。
如果华为Mate60 Pro进货价为空,此时
WHERE cost_price = 200 ;
WHERE cost_price = NULL ;
两个WHERE字句都不能将这条数据查出来,因此SQL提供了专门判断是否为空的运算符:IS NULL,此时
WHERE cost_price IS NULL ;
就可以将华为Mate60 Pro这条数据查出。反之如果希望选取不是空值的记录时,需要使用IS NOT NULL运算符。
NOT运算符表示否定,该运算符不能单独使用,需要搭配其他查询条件。
例如查询order_info表中总消费金额超过5000元的用户详细信息:
SELECT *
FROM order_info
WHERE final_total_amount >= 5000;
如果用上NOT运算符:
SELECT *
FROM order_info
WHERE NOT final_total_amount < 5000;
图14 order_info表中总消费金额超过5000元的用户详细信息
但由上例可知,不使用NOT运算符的语句似乎更容易让人理解,所以大家千万不要乱用NOT运算符。。。。
但是也不能完全否定NOT的存在,毕竟他主要是在复杂的SQL语句中发挥作用,此处只是对他的书写方法和工作原理进行了解。
目前为止所展现出的例子都是单一查询条件,但实际应用中往往通过指定多个查询条件对数据进行查询。例如:“查询省份编号为27且消费总额大于5000的用户详细信息”,“查询用户ID大于3572或省份编号为27的用户详细信息”等情况。
AND运算符相当于“并且”,当AND连接的查询条件全部成立时,整个查询条件才成立。
OR运算符相当于“或者”,当OR连接的查询条件被满足一个时,整个查询条件即可成立。
-- 查询省份编号为27且消费总额大于5000的用户详细信息
SELECT *
FROM order_info
WHERE province_id = 27 AND final_total_amount > 5000;
图15 省份编号为27且消费总额大于5000的用户详细信息
-- 查询用户ID大于3572或省份编号为27的用户详细信息
SELECT *
FROM order_info
WHERE id > 3572 OR province_id = 27;
图16 用户ID大于3572或省份编号为27的用户详细信息
注:在一些情况下会碰到AND与OR一起用的情况,但是由于AND的优先级高于OR,所以为避免错误,建议使用括号强化处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。