当前位置:   article > 正文

SQL基础之——SELECT语句,算术运算符、比较运算符与逻辑运算符_sql select 运算

sql select 运算

SELECT子句基本语法

从表中选取数据需要用到SELECT语句,该过程称为匹配查询或查询。该语句是SQL中使用最多的语句。

SELECT字句是可以单独输出计算结果的,例如:

SELECT 1 + 2
  • 1

SELECT 1+2 ; 的运行结果
图1 SELECT 1+2 ; 的运行结果

-------------------分割线-------------------

-- 基本语法:
SELECT <1>,<2>,…… 	-- 列举出要查询的列名称
FROM <表名>;			-- 指定要查询的表名

-- 例:在order_info表中查询用户ID,名称和居住地
SELECT id , consignee , delivery_address
FROM order_info;	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

order_info表
图2 order_info表

查询结果
图3 查询结果

查询所有的列

-- 例:查询order_info表中所有的列
SELECT *			-- '*'代表全部的意思
FROM order_info;		
  • 1
  • 2
  • 3

查询所有的列执行结果
图4 查询所有的列执行结果

为列设定别名

SQL语句可以用AS关键字为查询出的列设置别名

-- 例:从order_info表中查询数据
SELECT id AS ID ,
			 consignee AS NAME ,
			 delivery_address AS `add`  
FROM order_info;
  • 1
  • 2
  • 3
  • 4
  • 5

为列设定别名执行结果
图5 为列设定别名执行结果

别名也可以设置成中文,但需要用双引号括起来(" ")

-- 例:
SELECT id AS "编码" ,
			 consignee AS "姓名" ,
			 delivery_address AS "地址"  
FROM order_info;
  • 1
  • 2
  • 3
  • 4
  • 5

设置中文别名查询结果
图6 设置中文别名查询结果

书写常数

SELECT字句不仅可以查询列,还可以将某个常数作为查询结果输出。

-- 例:将数字10和字符串"编码"作为列输出("10"与"编码"仅作例子使用,无实际意义)
SELECT 10 AS 数字 ,
	   "编码" AS string ,
	   delivery_address AS "地址" 
FROM order_info;
  • 1
  • 2
  • 3
  • 4
  • 5

将常数作为列输出
图7 将常数作为列输出

从结果中删除重复行(去重)

在要去重的列前使用DISTINCT修饰即可完成,在使用DISTINCT时,NULL也会被视为一类数据,同时也可以将两列进行组合进行去重处理,将重复的组合合并成一条。

-- 例:查询订单时间
SELECT DISTINCT expire_time 
FROM order_info;
  • 1
  • 2
  • 3

原数据
图8 原数据
去重后查询结果
图9 去重后查询结果

根据WHERE语句来选择记录

许多场景下并不需要查询全部的数据,大部分情况要将表中符合条件的数据输出出来,此时就用到了WHERE字句。
例如要查询出province_id为27的相关订单信息

SELECT id AS ID , consignee AS "姓名" , delivery_address AS "地址" ,province_id AS "省份编号"
FROM `order_info`
WHERE province_id = 27;
  • 1
  • 2
  • 3

查询省份编号为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`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

带有计算表达式的查询结果
图12 带有计算表达式的查询结果

SQL中也有四则主要运算,分别是加、减、乘、除,运算符分别是(+ , - , * , / ),也被称为算术运算符。除了算术运算符外,SQL中还有其他各种各样的运算符。当然,也可以像平常的运算表达式一样用括号来表示运算的优先级。

关于空值NULL使用算数运算符

有如下表达式:

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;
  • 1
  • 2
  • 3

注:数据类型为字符串的’2’与"13"和数据类型为数字的 2 与 13 的比较结果是不同的。
比较结果

图13 比较结果

'0’代表结果为假,‘1’代表结果为真。
如果是数据类型为数字的2与13,那么会进行正常的大小比较
如果是数据类型为字符串的’2’与’13’,那么就会进行字符串的大小比较
字符串的大小比较:字符串的大小比较是从前向后进行,所以会将2与’13’中的1进行比较,2比1大,得出结果为真。

字符串的大小比较是按照字典序进行排序,比如apple<banana,该等式结果为真,切勿与数字比较大小的概念混淆。

关于空值NULL与比较运算符

如果华为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运算符

NOT运算符表示否定,该运算符不能单独使用,需要搭配其他查询条件。
例如查询order_info表中总消费金额超过5000元的用户详细信息:

SELECT *
FROM order_info
WHERE final_total_amount >= 5000;
  • 1
  • 2
  • 3

如果用上NOT运算符:

SELECT *
FROM order_info
WHERE NOT final_total_amount < 5000;
  • 1
  • 2
  • 3

order_info表中总消费金额超过5000元的用户详细信息
图14 order_info表中总消费金额超过5000元的用户详细信息

但由上例可知,不使用NOT运算符的语句似乎更容易让人理解,所以大家千万不要乱用NOT运算符。。。。

但是也不能完全否定NOT的存在,毕竟他主要是在复杂的SQL语句中发挥作用,此处只是对他的书写方法和工作原理进行了解。

AND运算符和OR运算符

目前为止所展现出的例子都是单一查询条件,但实际应用中往往通过指定多个查询条件对数据进行查询。例如:“查询省份编号为27且消费总额大于5000的用户详细信息”,“查询用户ID大于3572或省份编号为27的用户详细信息”等情况。

AND运算符相当于“并且”,当AND连接的查询条件全部成立时,整个查询条件才成立。
OR运算符相当于“或者”,当OR连接的查询条件被满足一个时,整个查询条件即可成立。

-- 查询省份编号为27且消费总额大于5000的用户详细信息
SELECT *
FROM order_info
WHERE province_id = 27 AND final_total_amount > 5000;
  • 1
  • 2
  • 3
  • 4

省份编号为27且消费总额大于5000的用户详细信息
图15 省份编号为27且消费总额大于5000的用户详细信息

-- 查询用户ID大于3572或省份编号为27的用户详细信息
SELECT *
FROM order_info
WHERE id > 3572 OR province_id = 27;
  • 1
  • 2
  • 3
  • 4

用户ID大于3572或省份编号为27的用户详细信息
图16 用户ID大于3572或省份编号为27的用户详细信息

注:在一些情况下会碰到AND与OR一起用的情况,但是由于AND的优先级高于OR,所以为避免错误,建议使用括号强化处理。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号