查询基础
- 前言
- 整体思维导图
- 列的查询
- 语法2.1 基本的SELECT语句
- 代码示例:从Product表中输出3列
- 执行结果
- 查询出所有的列
- 语法2.2 查询全部的列
- 代码示例2.2 输出Product表中全部的列
- 执行结果
- 为列设置别名
- 代码示例2.3 为列设置别名
- 执行结果
- 代码示例2.4 设置中文别名
- 执行结果
- 常数的查询
- 代码示例2.5 查询常数
- 执行结果
- 从结果中删除重复行
- 代码示例2.6 使用DISTINCT删除product_type列中重复的数据
- 执行结果
- 代码示例2.7 在多列之前使用DISTINCT
- 执行结果
- 根据WHERE语句来选择记录
- 语法示例2.3 SELECT语句中的WHERE子句
- 代码示例2.8 用来选取product_type列为'衣服'的记录的SELECT语句
- 执行结果
- SQL注释的书写方法
- 单行注释
- 代码示例2.9 单行注释
- 多行注释
- 代码示例2.10 多行注释
- 算术运算符和比较运算符
- 比较运算符
- 代码示例2.11 选取出销售单价大于等于1000日元的记录
- 执行结果
- 代码示例2.12 选取出登记日期在2009年9月27日之前的记录
- 执行结果
- 代码示例2.13 WHERE子句的条件表达式中也可以使用计算表达式
- 执行结果
- 对字符串使用不等号时的注意事项
- 不能对NULL使用比较运算符
- 代码示例2.14 选取NULL的记录
- 执行结果
- 代码示例2.15 选取不为NULL的记录
- 执行结果
- 逻辑运算符
- NOT运算符
- 代码示例2.16
- 执行结果
- AND运算符和OR运算符
- 代码示例2.17 在WHERE子句的查询条件中使用AND运算符
- 执行结果
- 代码示例 2.18 在WHERE子句的查询条件中使用OR运算符
- 执行结果
- 注意 AND运算符优先于OR运算符
- 代码示例2.19
- 执行结果
- 代码示例2.20 通过括号让OR运算符优先于AND运算符执行
- 执行结果
- 如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!
前言
系统学习SQL的笔记,用于记录学习过程。
整体思维导图
列的查询
从表中选取数据是需要使用SELECT语句,通过SELECT语句查询并选取出必要数据的过程称为匹配查询或查询(query)
语法2.1 基本的SELECT语句
SELECT <列名>,
…… FROM <表名>;
该SELECT语句包含SELECT和FROM两个子句(clause)。子句是SQL语句的组成要素,是以SELECT或者FROM等作为起始的短语。
SELECT子句中列举了希望从表中查询出的列的名称,而FROM子句则指出选择出数据的表的名称。
代码示例:从Product表中输出3列
SELECT product_id, product_name, purchase_price FROM Product;
执行结果
SELECT语句第一行的SELECT product_id, product_name, purchase_price就是SELECT子句。查询出的列的顺序可以任意指定。查询多列时,需要使用逗号进行分隔。查询结果中列的顺序和SELECT子句中的顺序相同。
查询出所有的列
想要查询出全部列是,可以使用代表所有列的星号(*)
语法2.2 查询全部的列
SELECT * FROM <表名>;
代码示例2.2 输出Product表中全部的列
SELECT * FROM Product;
执行结果
注意:星号(*)代表全部列的意思。但是,如果使用星号的话,就无法设定列的显示顺序了。这时就会按照CREATE TABLE语句的定义对列进行排序。
为列设置别名
SQL语句可以使用AS关键字为列设定别名。
代码示例2.3 为列设置别名
SELECT
product_id AS id,
product_name AS `name`,
purchase_price AS price
FROM
Product;
执行结果
代码示例2.4 设置中文别名
SELECT
product_id AS "商品编号",
product_name AS "商品名称",
purchase_price AS "进货单价"
FROM
Product;
通过执行结果就可以知道相对于英文别名来说,会更好理解与操作。
执行结果
注意:设定汉语别名时需要使用双引号(")括起来。
常数的查询
SELECT子句不仅可以书写列名,还可以书写常数。
代码示例2.5 查询常数
SELECT
'商品' AS string,
38 AS number,
'2009-02-24' AS date,
product_id,
product_name
FROM
Product;
执行结果
从结果中删除重复行
想要删除重复行时,可以通过在SELECT子句中使用DISTINCT来实现
代码示例2.6 使用DISTINCT删除product_type列中重复的数据
SELECT DISTINCT product_type FROM Product;
执行结果
注意:在SELECT语句中使用DISTINCT可以删除重复行。
在使用DISTINCT时,NULL也被视为一类数据。NULL存在于多行中时,也会被合并为一条NULL数据。
代码示例2.7 在多列之前使用DISTINCT
SELECT DISTINCT
product_type,
regist_date
FROM
Product;
执行结果
注意:DISTINCT关键字只能用在第一个列名之前,因此,请大家注意不能写成regist_date, DISTINCT product_type。
根据WHERE语句来选择记录
SELECT语句通过WHERE子句来指定查询数据的条件。
语法示例2.3 SELECT语句中的WHERE子句
SELECT
<列名>,
……
FROM
<表名>
WHERE
<条件表达式>;
代码示例2.8 用来选取product_type列为’衣服’的记录的SELECT语句
SELECT
product_name,
product_type
FROM
Product
WHERE
product_type = '衣服';
执行结果
通过WHERE子句查询出符合指定条件的记录,然后再选取出SELECT语句指定的列。
注意:SQL中子句的书写顺序是固定的,不能随意更改。WHERE子句必须紧跟在FROM子句之后,书写顺序发生改变的话会造成执行错误。
SQL注释的书写方法
注释对SQL的执行没有任何影响。因此,无论是英文字母还是汉字都可以随意使用。
注释的书写方法有如下两种。
单行注释
书写在"–"之后,只能写在同一行。
代码示例2.9 单行注释
-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT
product_id,
purchase_price
FROM
Product;
SELECT DISTINCT
product_id,
purchase_price
-- 本SELECT语句会从结果中删除重复行。
FROM
Product;
多行注释
多行注释
书写在“ /*
”和“ /”之间,可以跨多行。
代码示例2.10 多行注释
/* 本SELECT语句, 会从结果中删除重复行。*/
SELECT DISTINCT
product_id,
purchase_price
FROM
Product;
SELECT DISTINCT
product_id,
purchase_price
/* 本SELECT语句, 会从结果中删除重复行。*/
FROM
Product;
这些SELECT语句的执行结果与没有使用注释时完全一样。注释能够帮助阅读者更好地理解SQL语句,特别是在书写复杂的SQL语句时注释不仅可以写在SELECT语句中,而且可以写在任何SQL语句当中。
算术运算符和比较运算符
四则运算使用的运算符(+,-,*,/)成为算术运算符。运算符就是使用两边的值进行四则运算或者字符串拼接、数值大小比较等运算,并返回结果的符号。加法运算符(+)前后入股欧式数字或者数字类型的列名的话,就会返回加法运算的结果。
括号可以提升运算的优先顺序(优先进行运算)。
包含NULL的运算,其结果也是NULL。
比较运算符
比较运算符可以用来判断列或者值是否相等,还可以用来比较大小。
比较运算符 | 含义 |
---|---|
= | 相等 |
<> | 不相等 |
.>= | 大于等于 |
.> | 大于 |
<= | 小于等于 |
< | 小于 |
代码示例2.11 选取出销售单价大于等于1000日元的记录
SELECT
product_name,
product_type,
sale_price
FROM
Product
WHERE
sale_price >= 1000;
执行结果
代码示例2.12 选取出登记日期在2009年9月27日之前的记录
SELECT
product_name,
product_type,
regist_date
FROM
Product
WHERE
regist_date < '2009-09-27';
执行结果
还可以使用比较运算符对计算结果进行比较
代码示例2.13 WHERE子句的条件表达式中也可以使用计算表达式
SELECT
product_name,
sale_price,
purchase_price
FROM
Product
WHERE
sale_price - purchase_price >= 500;
执行结果
对字符串使用不等号时的注意事项
字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
不能对NULL使用比较运算符
SQL提供了专门用来判断是否为NULL的IS NULL运算符。想要选取NULL的记录时,可以像代码示例2.14那样来书写条件表达式。
代码示例2.14 选取NULL的记录
SELECT
product_name,
purchase_price
FROM
Product
WHERE
purchase_price IS NULL;
执行结果
希望选取不是NULL的记录时,需要使用IS NOT NULL运算符
代码示例2.15 选取不为NULL的记录
SELECT
product_name,
purchase_price
FROM
Product
WHERE
purchase_price IS NOT NULL;
执行结果
希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
逻辑运算符
通过使用逻辑运算符,可以将多个查询条件进行组合。
通过NOT运算符可以生成“不是~”这样的查询条件。
两边条件都成立时,使用AND运算符的查询条件才成立。
只要两边的条件中有一个成立,使用OR运算符的查询条件就可以成立。
NOT运算符
NOT不能单独使用,必须和其他查询条件组合起来使用。例如,选取出销售单价(sale_price)不大于等于1000日元的记录的SELECT语句如下所示
代码示例2.16
SELECT
product_name,
product_type,
sale_price
FROM
Product
WHERE
NOT sale_price >=1000;
执行结果
AND运算符和OR运算符
在实际使用当中,往往都是同时指定多个查询条件对数据进行查询的。例如,想要查询“商品种类为厨房用具、销售单价大于等于3000日元”或“进货单价大于等于5000日元或小于1000日元”的商品等情况。
在WHERE子句中使用AND运算符或者OR运算符,可以对多个查询条件进行组合。
AND运算符在其两侧的查询条件都成立是整个查询条件才成立,意思相当于“并且”
OR运算符在其两侧的查询条件有一个成立整个查询条件都成立,意思相当于“或者”
例如,从Product表中选取出“商品种类为厨房用具(product_type = ‘厨房用具’),并且销售单价大于等于3000日元(sale_price >= 3000)的商品”
代码示例2.17 在WHERE子句的查询条件中使用AND运算符
SELECT
product_name,
purchase_price
FROM
Product
WHERE
product_type = '厨房用具'
AND sale_price >= 3000;
执行结果
选取出“商品种类为厨房用具(product_type = ‘厨房用具’),或者销售单价大于等于3000日元(sale_price >= 3000)的商品”
代码示例 2.18 在WHERE子句的查询条件中使用OR运算符
SELECT
product_name,
purchase_price
FROM
Product
WHERE
product_type = '厨房用具'
OR sale_price >= 3000;
执行结果
注意 AND运算符优先于OR运算符
查询条件:“商品种类为办公用品” 并且“登记日期是2009年9月11日或者2009年9月20日”
代码示例2.19
SELECT
product_name,
product_type,
regist_date
FROM
Product
WHERE
product_type = '办公用品'
AND regist_date = '2009-09-11'
OR regist_date = '2009-09-20';
执行结果
过观察发现,不想要的T恤衫和菜刀和叉子也被选择出来了,这是由于AND运算符优选与OR运算符导致的。
将代码示例2.19的条件表达式会被解释翻译成下面这样:
「 product_type = '办公用品'
AND regist_date = '2009-09-11'」
OR 「 regist_date = '2009-09-20'」
也就是,“商品种类为办公用品,并且登记日期是2009年9月11日”
或者
“登记日期是2009年9月20日”这和想要指定的查询条件并不相符
想要优先执行OR运算符时,可以通过使用括号将OR运算符优先于AND运算符执行。
代码示例2.20 通过括号让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' );