提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
今天是SQL组队学习的第三天,我将对SQL基础查询的部分学习做一些记录。
一、SELECT语句基础
从表中选取数据时需要使用SELECT语句,也就是只从表中选出(SELECT)必要数据的意思。通过SELECT语句查询并选取出必要数据的过程称为匹配查询或查询(query)。
SELECT <列名>,
FROM <表名>;
1.WHERE语句(从表中选取符合条件的数据)
SELECT 语句通过WHERE子句来指定查询数据的条件。在WHERE 子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。执行含有这些条件的SELECT语句,就可以查询出只符合该条件的记录了。
SELECT <列名>, ……
FROM <表名>
WHERE <条件表达式>;
示例代码,在表product中,两种选择语句,找出product_tyle = ‘衣服’的列
代码部分:
-- 用来选取product type列为衣服的记录的SELECT语句
SELECT product_name, product_type
FROM product
WHERE product_type = '衣服';
-- 也可以选取出不是查询条件的列(条件列与输出列不同)
SELECT product_name
FROM product
WHERE product_type = '衣服';
输出结果:
由上图可以看出最终的输出结果由select语句决定,后面有几个列名,在约束条件下就输出几列。
2.相关法则
星号()代表全部列的意思。
SQL中可以随意使用换行符,不影响语句执行(但不可插入空行)。
设定汉语别名时需要使用双引号(“”)括起来。
在SELECT语句中使用DISTINCT可以删除重复行。
注释是SQL语句中用来标识说明或者注意事项的部分。分为1行注释"-- “和多行注释两种”/ */"。
-- 想要查询出全部列时,可以使用代表所有列的星号(*)。
SELECT *
FROM <表名>;
-- 想要查询出全部列时,可以使用代表所有列的星号(*)。
select*FROM product;
-- SQL语句可以使用AS关键字为列设定别名(用中文时需要双引号(“”))。
SELECT product_id As id,
product_name As name,
purchase_price AS "进货单价"
FROM product;
-- 使用DISTINCT删除product_type列中重复的数据
SELECT DISTINCT product_type
FROM product;
运行结果:
二、算术运算符和比较运算符
1.算数运算符
SQL语句中可以使用的四则运算的主要运算符如下:
2.比较运算符
SQL常见比较运算符如下:
代码示例:
-- 选取出sale_price列为500的记录
SELECT product_name, product_type
FROM product
WHERE sale_price = 500;
对product表中的sale_price列的数据进行比较运算。
3.常用法则
SELECT子句中可以使用常数或者表达式。
使用比较运算符时一定要注意不等号和等号的位置。
字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
相关代码如下:
-- SQL语句中也可以使用运算表达式
SELECT product_name, sale_price, sale_price * 2 AS "sale_price x2"
FROM product;
-- WHERE子句的条件表达式中也可以使用计算表达式
SELECT product_name, sale_price, purchase_price
FROM product
WHERE sale_price - purchase_price >= 500;
/* 对字符串使用不等号
首先创建chars并插入数据
选取出大于‘2’的SELECT语句*/
-- DDL:创建表
CREATE TABLE chars
(chr CHAR(3)NOT NULL,
PRIMARY KEY(chr));
-- 选取出大于'2'的数据的SELECT语句('2'为字符串)
SELECT chr
FROM chars
WHERE chr > '2';
-- 选取NULL的记录
SELECT product_name, purchase_price
FROM product
WHERE purchase_price IS NULL;
-- 选取不为NULL的记录
SELECT product_name, purchase_price
FROM product
WHERE purchase_price IS NOT NULL;
运行结果如下:
三、逻辑运算符
1.NOT运算符
SELECT product_name, product_type, sale_price
FROM product
WHERE sale_price >= 1000;
SELECT product_name, product_type, sale_price
FROM product
WHERE NOT sale_price >= 1000;
可以看出,通过否定销售单价大于等于 1000 日元 (sale_price >= 1000) 这个查询条件,选取出了销售单价小于 1000 日元的商品。也就是说 NOT sale_price >= 1000 与 sale_price < 1000 是等价的。
但值得注意的是,虽然通过 NOT 运算符否定一个条件可以得到相反查询条件的结果,但是其可读性明显不如显式指定查询条件,因此,不可滥用该运算符。
2.AND运算符和OR运算符
AND相当于交集,OR相当于取并集。
例子,还是来源于上面的product表,假如要查找这样一个商品
“商品种类为办公用品”并且“登记日期是 2009 年 9 月 11 日或者 2009 年 9 月 20 日” 理想结果为“打孔器”,但当你输入以下信息时,会得到错误结果
-- 将查询条件原封不动地写入条件表达式,会得到错误结果
SELECT product_name, product_type, regist_date
FROM product
WHERE product_type = '办公用品'
AND regist_date = '2009-09-11'
OR regist_date = '2009-09-20';
结果为:
可以看见上面的输出结果是登记日期为2009-9-11的办公用品和所有登记日期为2009-9-20的商品。
这是因为AND运算符优先与OR运算符,想要优先执行OR运算,可以使用括号(正确代码如下):
-- 通过使用括号让OR运算符先于AND运算符执行
SELECT product_name, product_type, regist_date
FROM product
WHERE product_type = '办公用品'
AND ( regist_date = '2009-09-11'
OR regist_date = '2009-09-20');
这样会得到理想的输出结果:
真值表
当碰到条件较复杂的语句时,理解语句含义并不容易,这时可以采用真值表来梳理逻辑关系。
AND 运算符两侧的真值都为真时返回真,除此之外都返回假。
OR 运算符两侧的真值只要有一个不为假就返回真,只有当其两侧的真值都为假时才返回假。
NOT运算符只是单纯的将真转换为假,将假转换为真。
含有NULL的真值
NULL的真值结果既不为真,也不为假,因为并不知道这样一个值,即不确定。
这时真值是除真假之外的第三种值——不确定(UNKNOWN)。一般的逻辑运算并不存在这第三种值。SQL 之外的语言也基本上只使用真和假这两种真值。与通常的逻辑运算被称为二值逻辑相对,只有 SQL 中的逻辑运算被称为三值逻辑。
四、练习题
SELECT product_name, regist_date
FROM product
WHERE regist_date > '2009-04-28';
运行结果:
代码如下:
SELECT product_name,sale_price,purchase_price
FROM product
WHERE sale_price-purchase_price >= 500;
SELECT product_name,sale_price,purchase_price
FROM product
WHERE NOT sale_price-purchase_price < 500;
结果如下:
代码如下:
SELECT product_name,product_type,sale_price*0.9 AS profit
FROM product
WHERE sale_price*0.9 - purchase_price >100;
输出结果:
疑惑点:
三块命令的运行结果均为:
这是因为NULL只能通过is null或者is not null来判断,其他操作符与null操作都是false,查不出有关null的记录,而对上述代码进行修改后
代码:
SELECT *
FROM product
WHERE purchase_price IS NULL;
结果:
代码:
SELECT *
FROM product
WHERE purchase_price IS NOT NULL;
结果: