03 - 查询基础

SELECT 语句

列的查询

基本的 SELECT 语句

  • 语法:
SELECT <列名>,……
 FROM <表名>;
  • 说明:
  1. 该 SELECT 语句包含了 SELECT 和 FROM 两个子句(clause)
  2. 子句是 SQL 语句的组成要素,是以 SELECT 或者 FROM 等作为起始的短语。
  3. SELECT 子句中列举了希望从表中查询出的列的名称,而 FROM 子句则指定了选取出数据的表的名称。
  • 示例:
SELECT product_id, product_name, purchase_price
FROM Product;
  • 说明:
  1. 查询出的列的顺序可以任意指定。
  2. 查询多列时,需要使用逗号进行分隔。
  3. 查询结果中列的顺序和 SELECT 子句中的顺序相同。

查询出表中所有的列

想要查询出全部列时,可以使用代表所有列的星号(*)。

  • 语法:
SELECT *
FROM <表名>;
  • 示例:
SELECT *
FROM Product;

-- 等价于

SELECT product_id, product_name, product_type, sale_price,
       purchase_price, regist_date
  FROM Product;
  • 说明:

如果使用星号的话,就无法设定列的显示顺序了。这时就会按照 CREATE TABLE 语句的定义对列进行排序。


为列设定别名

SQL 语句可以使用 AS 关键字为列设定别名

  • 示例
SELECT product_id     AS id,
       product_name   AS name,
       purchase_price AS price
  FROM Product;
  • 说明:
  1. 别名可以使用中文,使用中文时需要用双引号(")括起来。

常数的查询

  • 示例:
SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
       product_id, product_name
  FROM Product;
  
  • 执行结果
string  |  number  |    date     | product_id | product_name
---------+----------+-------------+------------+--------------
 商品    |  38      | 2009-02-24  | 0001       | T恤衫
 商品    |  38      | 2009-02-24  | 0002       | 打孔器
 商品    |  38      | 2009-02-24  | 0003       | 运动T恤
 商品    |  38      | 2009-02-24  | 0004       | 菜刀
 商品    |  38      | 2009-02-24  | 0005       | 高压锅
 商品    |  38      | 2009-02-24  | 0006       | 叉子
 商品    |  38      | 2009-02-24  | 0007       | 擦菜板
 商品    |  38      | 2009-02-24  | 0008       | 圆珠笔

从结果中删除重复行

  • 在SELECT语句中使用DISTINCT可以删除重复行。
SELECT DISTINCT product_type
  FROM Product;
  • 说明:
  1. 在使用 DISTINCT 时,NULL 也被视为一类数据。NULL 存在于多行中时,也会被合并为一条 NULL 数据。
  2. DISTINCT 关键字只能用在第一个列名之前。

根据 WHERE 语句来选择记录

  • SELECT 语句通过 WHERE 子句来指定查询数据的条件。在 WHERE 子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。
  • 语法:
SELECT <列名>, ……
  FROM <表名>
 WHERE <条件表达式>;
  • 说明:
  1. SQL 中子句的书写顺序是固定的,不能随意更改。
  2. WHERE 子句必须紧跟在 FROM 子句之后,书写顺序发生改变的话会造成执行错误。

注释的书写方法

  • 单行注释

书写在“--”之后,只能写在同一行。(MySQL中需要在“--”之后加入半角空格(如果不加的话就不会被认为是注释)。)

  • 多行注释

书写在“/”和“/”之间,可以跨多行。

  • 示例:
-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT product_id, purchase_price
  FROM Product;
  
/* 本SELECT语句,
   会从结果中删除重复行。*/
SELECT DISTINCT product_id, purchase_price
  FROM Product;

算术运算符和比较运算符

  1. 运算符就是对其两边的列或者值进行运算(计算或者比较大小等)的符号。
  2. 使用算术运算符可以进行四则运算。
  3. 括号可以提升运算的优先顺序(优先进行运算)。
  4. 包含NULL的运算,其结果也是NULL。
  5. 比较运算符可以用来判断列或者值是否相等,还可以用来比较大小。
  6. 判断是否为NULL,需要使用IS NULL或者IS NOT NULL运算符。

算术运算符

  • 四则运算所使用的运算符(+、-、*、/)称为算术运算符。
  1. 运算符就是使用其两边的值进行四则运算或者字符串拼接、数值大小比较等运算,并返回结果的符号。加法运算符(+)前后如果是数字或者数字类型的列名的话,就会返回加法运算后的结果。SQL 中除了算术运算符之外还有其他各种各样的运算符。
  2. SELECT子句中可以使用常数或者表达式。
  3. 所有包含 NULL 的计算,结果肯定是 NULL。
  • 示例:
-- 把各个商品单价的 2 倍(sale_price 的 2 倍)以 "sale_price_x2" 列的形式读取出来。
SELECT product_name, sale_price,
       sale_price * 2 AS "sale_price_x2"
  FROM Product;

FROM子句真的有必要吗?

  • FROM子句在SELECT语句中并不是必不可少的,只使用SELECT子句进行计算也是可以的。
-- SQL Server  PostgreSQL  MySQL
SELECT (100 + 200) * 3 AS calculation;

注意:在 Oracle 数据库中不允许省略 SELECT 语句中的 FROM 子句,这种情况下可以使用 DUAL 这个临时表。DB2 中可以使用SYSIBM.SYSDUMMY1这个临时表

比较运算符

  • 像符号 = 这样用来比较其两边的列或者值的符号称为比较运算符.在 WHERE 子句中通过使用比较运算符可以组合出各种各样的条件表达式。
比较运算符 含义
= 和 ~ 相等
<> 和 ~ 不相等
>= 大于等于 ~
> 大于 ~
<= <=
< 小于 ~
  • 示例:
SELECT product_name, product_type
  FROM Product
 WHERE sale_price <> 500;
 
 SELECT product_name, sale_price, purchase_price
  FROM Product
 WHERE sale_price - purchase_price >= 500;

对字符串使用不等号时的注意事项:
1. 字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
2. 不能对 NULL 使用比较运算符.希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。


逻辑运算符

NOT 运算符

  1. NOT 不能单独使用,必须和其他查询条件组合起来使用。
  2. NOT运算符用来否定某一条件,但是不能滥用
SELECT product_name, product_type, sale_price
  FROM Product
 WHERE NOT sale_price >= 1000;

AND 运算符和 OR 运算符

  • 简单示例
  1. AND 运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于“并且”。
  2. OR 运算符在其两侧的查询条件有一个成立时整个查询条件都成立,其意思相当于“或者”
  3. 多个查询条件进行组合时,需要使用AND运算符或者OR运算符。
-- AND 运算符
SELECT product_name, purchase_price
  FROM Product
 WHERE product_type = '厨房用具'
   AND sale_price >= 3000;

-- OR 运算符
SELECT product_name, purchase_price
  FROM Product
 WHERE product_type = '厨房用具'
    OR sale_price >= 3000;
  • 通过括号强化处理

AND运算符的优先级高于OR运算符。想要优先执行OR运算符时可以使用括号。

-- “商品种类为办公用品” 并且 “登记日期是 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');

逻辑运算符和真值

真值就是值为真(TRUE)或假(FALSE)其中之一的值.
比较运算符会把运算结果以真值的形式进行返回
真值是除真假之外的第三种值——不确定(UNKNOWN)。


代码清单

从 Product 表中输出 3 列

SELECT product_id, product_name, purchase_price
  FROM Product;

输出 Product 表中全部的列

SELECT *
  FROM Product;
  
SELECT product_id, product_name, product_type, sale_price,
       purchase_price, regist_date
  FROM Product;

为列设定别名

SELECT product_id     AS id,
       product_name   AS name,
       purchase_price AS price
  FROM Product;

设定中文别名

SELECT product_id     AS "商品编号",
       product_name   AS "商品名称",
       purchase_price AS "进货单价"
  FROM Product;    

查询常数

SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
       product_id, product_name
  FROM Product;

使用 DISTINCT 删除 product_type 列中重复的数据

SELECT DISTINCT product_type
  FROM Product;

对含有 NULL 数据的列使用 DISTINCT 关键字

SELECT DISTINCT purchase_price
  FROM Product;

在多列之前使用DISTINCT

SELECT DISTINCT product_type, regist_date
  FROM Product;

用来选取product_type列为'衣服'的记录的SELECT语句

SELECT product_name, product_type
  FROM Product
 WHERE product_type = '衣服';

不选取出作为查询条件的列

SELECT product_name
  FROM Product
 WHERE product_type = '衣服';

1行注释的使用示例

-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT product_id, purchase_price
  FROM Product;

多行注释的使用示例

/* 本SELECT语句,
   会从结果中删除重复行。*/
SELECT DISTINCT product_id, purchase_price
  FROM Product;

SQL 语句中使用运算表达式

SELECT product_name, sale_price,
       sale_price * 2 AS "sale_price_x2"
  FROM Product;

只包含SELECT子句的SELECT语句

-- SQL Server  PostgreSQL  MySQL
SELECT (100 + 200) * 3 AS calculation;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,169评论 0 9
  • 1. SQL 简介 SQL 的目标 理想情况下,数据库语言应允许用户: 建立数据库和关系结构 完成基本数据管理任务...
    板蓝根plank阅读 2,330评论 0 11
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,028评论 0 19
  • 2017/3/14 RDBMS:关系型数据库管理系统 关系模型独立于语言 SQL有几种不同类型的语言:数据定义语言...
    ancherl阅读 1,577评论 0 6
  • 一年365天,如同梦境一样,可 这是真真的过去了。 一辈子也就那么2万多天,一转眼就过去了6000多天了。 仔细这...
    安白丿阅读 67评论 0 1