SQL 的基本使用概念简介

一、查询不重复的记录:

SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料。这将把所有的资料都抓出,无论资料值有无重复。在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况。换句话说,我们需要知道这个表格/栏位内有哪些不同的值,而每个值出现的次数并不重要。这要如何达成呢?在 SQL 中,这是很容易做到的。我们只要在 SELECT 后加上一个 DISTINCT 就可以了。DISTINCT 的语法如下:

SELECT DISTINCT "栏位名"
FROM "表格名";
"""
python学习交流群:923414804,群内每天分享干货,包括最新的企业级案例学习资料和零基础入门教程,欢迎小伙伴入群学习。
"""

二、多个复杂查询条件:

WHERE 的多个复杂条件是由二或多个简单条件通过 AND 或是 OR 的连接而成。一个 SQL 语句中可以有无限多个简单条件的存在。 复杂条件的语法如下:

SELECT "栏位名"
FROM "表格名"
WHERE "简单条件"
{[AND|OR] "简单条件"}+;

{}+ 代表 {} 之内的情况会发生一或多次。在这里的意思就是 AND 加简单条件及 OR 加简单条件的情况可以发生一或多次。另外,我们可以用 ( ) 来代表条件的先后次序。

三、为一个条件匹配多个可能的值:

在 SQL 中,在两个情况下会用到 IN 这个指令;这里先说 与 WHERE 有关的那一个情况。在这个用法下,我们事先已知道至少一个我们需要的值,而我们将这些知道的值都放入 IN 这个子句。 IN 指令的 语法为下:

SELECT "栏位名"
FROM "表格名"
WHERE "栏位名" IN ('值一', '值二', ...);

在括弧内可以有一或多个值,而不同值之间由逗点分开。值可以是数目或是文字。若在括弧内只有一个值,那这个子句就等于:

WHERE "栏位名" = '值一'

四、限制查询的范围:

IN 这个指令可以让我们依照一或数个不连续 (discrete) 的值的限制之内抓出数据库中的值,而 BETWEEN 则是让我们可以运用一个范围 (range) 内抓出数据库中的值。BETWEEN 这个子句的语法如下:

SELECT "栏位名"
FROM " 表格名"
WHERE "栏位名" BETWEEN '值一' AND '值二';

这将选出栏位值包含在值一及值二之间的记录。

五、模糊匹配的查询条件:

LIKE 是另一个在 WHERE 子句中会用到的指令。基本上,LIKE 能让我们依据一个套式 (pattern) 来找出我们要的资料。相对来说,在运用 IN 的时候,我们完全地知道我们需要的条件;在运用 BETWEEN 的时候,我们则是列出一个范围。 LIKE 的语法如下:

SELECT "栏位名"
FROM "表格名"
WHERE "栏位名" LIKE {套式};

{套式} 经常包括通配符 (wildcard). 以下是几个例子:

  • 'A_Z': 所有以 'A' 起头,另一个任何值的字原,且以 'Z' 为结尾的字串。 'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字原,而不是一个字原)。
  • 'ABC%': 所有以 'ABC' 起头的字串。举例来说,'ABCD' 和 'ABCABC' 都符合这个套式。
  • '%XYZ': 所有以 'XYZ' 结尾的字串。举例来说,'WXYZ' 和 'ZZXYZ' 都符合这个套式。
  • '%AN%': 所有含有 'AN' 这个套式的字串。举例来说, 'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个套式。

六、排序查询的记录:

ORDER BY 这个指令用来将查询的值由小往大 (ascending) 或是由大往小 (descending) 进行排序, ORDER BY 的语法如下:

SELECT "栏位名"
FROM "表格名"
[WHERE "条件"]
ORDER BY "栏位名" [ASC, DESC];

[ ] 代表 WHERE 语句是可选的。不过,如果 WHERE 子句存在的话,它是在 ORDER BY 子句之前。ASC 代表结果会以由小往大的顺序列出,而 DESC 代表结果会以由大往小的顺序列出。如果两者皆没有被写出的话,那我们就会用 ASC。

我们可以照好几个不同的栏位来排顺序。在这个情况下,ORDER BY 子句的语法如下(假设有两个栏位):

ORDER BY "栏位一" [ASC, DESC], "栏位二" [ASC, DESC]

若我们对这两个栏位都选择由小往大的话,那这个子句就会造成结果是依据 "栏位一" 由小往大排。若有好几笔资料 "栏位一" 的值相等,那这几笔资料就依据 "栏位二" 由小往大排。

七、使用函数:

既然数据库中有许多资料都是已数字的型态存在,一个很重要的用途就是要能够对这些数字做一些运算,例如将它们总合起来,或是找出它们的平均值。SQL 有提供一些这一类的函数。它们是:

  • AVG (平均)
  • COUNT (计数)
  • MAX (最大值)
  • MIN (最小值)
  • SUM (总合)

运用函数的语法是:

SELECT "函数名"("栏位名")
FROM "表格名";

由于 COUNT 的使用广泛,在这里特别提出来讨论。基本上,COUNT 让我们能够数出在表格中有多少笔资料被选出来。它的语法是:

SELECT COUNT("栏位名")
FROM "表格名";

八、GROUP BY 语句

GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。下面用一个实例来说明,以下为一个数据表:

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

现在,我们希望查找每个客户的总金额(总订单)。我们想要使用 GROUP BY 语句对客户进行组合。我们使用下列 SQL 语句:

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer

结果集类似这样:

Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000

九、HAVING 子句:

HAVING 语句允许指定条件来过滤将出现最终结果中的分组结果。 WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。HAVING 子句必须放在 GROUP BY 子句之后,必须放在 ORDER BY 子句之前。

HAVING 的语法如下:

SELECT "栏位1", SUM("栏位2")
FROM "表格名"
[WHERE "条件"]
GROUP BY "栏位1"
HAVING (函数条件);  
ORDER BY "栏位名" [ASC, DESC];

十、SQL 别名(alias):

SQL 可以对表或列进行重命名。使用表的别名,是指在一个特定的 SQL 语句重命名一个表。重命名是一个临时的变化,并在数据库中实际的表的名称不会改变。列的别名是用来重命名表中的列一个特定的 SQL 查询的目的。

表别名的基本语法如下:

SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];

列别名的基本语法如下:

SELECT column_name AS alias_name
FROM table_name
WHERE [condition];

其中,AS 可以省略,直接用空格代替,即可以用 “表名或者列名 别名” 的方式重命名。

十一、SQL Join 类型:

在 SQL 连接中有不同的类型可用:

  • INNER JOIN: 返回记录当两个表有匹配。
  • LEFT JOIN: 返回左表中所有的行,即使右表中没有匹配。
  • RIGHT JOIN: 返回右表中所有的行,即使有在左表中没有匹配。
  • FULL JOIN: 返回表中匹配的所有行。
  • SELF JOIN: 是用来连接表本身,如果表有两张表,暂时改名至少在一个表中的SQL语句。
  • CARTESIAN JOIN: 返回来自两个或更多个联接的表的记录的集合的笛卡尔乘积。

十二、子查询(Subquery):

我们可以在一个 SQL 语句中放入另一个 SQL 语句。当我们在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,我们就有一个 subquery 的架构。 Subquery 的作用是什么呢?第一,它可以被用来连接表格。另外,有的时候 subquery 是唯一能够连接两个表格的方式。

Subquery 的语法如下:

SELECT "栏位1"
FROM "表格"
WHERE "栏位2" [比较运算符]
(SELECT "栏位1"
FROM "表格"
WHERE "条件");

[比较运算符] 可以是相等的运算符,例如 =, >, <, >=, <=, 这也可以是一个对文字的运算符,例如 "LIKE"。

十三、UNION语句:

UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION 这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。

UNION 的语法如下:

[SQL 语句 1]
UNION
[SQL 语句 2];

UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。

UNION ALL 的语法如下:

[SQL 语句 1]
UNION ALL
[SQL 语句 2];

十四、INTERSECT 语句:

和 UNION 指令类似,INTERSECT 也是对两个 SQL 语句所产生的结果做处理的。不同的地方是, UNION 基本上是一个 OR (如果这个值存在于第一句或是第二句,它就会被选出),而 INTERSECT 则比较像 AND ( 这个值要存在于第一句和第二句才会被选出)。UNION 是联集,而 INTERSECT 是交集。

INTERSECT 的语法如下:

[SQL语句 1]
INTERSECT
[SQL语句 2];

十五、MINUS 语句:

MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所产生的结果并没有存在于第一个 SQL 语句所产生的结果内,那这笔资料就被抛弃。

MINUS 的语法如下:

[SQL 语句 1]
MINUS
[SQL 语句 2];

十六、CONCAT 函数:

有的时候,我们有需要将由不同栏位获得的资料串连在一起。每一种数据库都有提供方法来达到这个目的:

  • MySQL: CONCAT( )
  • Oracle: CONCAT( ), ||
  • SQL Server: +

CONCAT( ) 的语法如下:

CONCAT (字串1, 字串2, 字串3, ...)

将字串1、字串2、字串3,等字串连在一起。请注意,Oracle 的 CONCAT( ) 只允许两个参数;换言之,一次只能将两个字串串连起来。不过,在Oracle中,我们可以用 '||' 来一次串连多个字串。

来看几个例子。假设我们有以下的表格:

Geography 表格
region_name store_name
East Boston
East New York
West Los Angeles
West San Diego

例子1:

MySQL/Oracle:

SELECT CONCAT (Region_Name, Store_Name) FROM Geography
WHERE Store_Name = 'Boston';

结果:

'EastBoston'

例子2:

Oracle:

SELECT Region_Name || ' ' || Store_Name FROM Geography
WHERE Store_Name = 'Boston';

结果:

'East Boston'

例子3:

SQL Server:
SELECT Region_Name + ' ' + Store_Name FROM Geography
WHERE Store_Name = 'Boston';

结果:

'East Boston'

十七、SQL UNIQUE 约束

UNIQUE 约束唯一标识数据库表中的每条记录。UNIQUEPRIMARY KEY 约束均为列或列集合提供了唯一性的保证。PRIMARY KEY 拥有自动定义的 UNIQUE 约束。请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

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

推荐阅读更多精彩内容

  • 一、数据库的一些概念 数据库的概念: 数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗余度、与...
    __RY__阅读 659评论 0 1
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,714评论 0 44
  • 学习web安全足足有一个半月有余,之前学的是前端,也会一点python。。好吧差不多忘了。常规工具算是熟悉基本...
    一叶红尘哦哟阅读 3,370评论 4 92
  • 我们说健康的基本要素:适量的运动,充足的睡眠,良好的心情,还有均衡的膳食,那么在这四个当中运动、睡眠、心情,...
    XS金戈阅读 838评论 0 0
  • 直方图主要用在数据图表,作为对比数据,用柱体高度的高低,形象直观地表达出来,往往与折线图配合使用,而折线图便于从众...
    理想是试阅读 941评论 0 0