SQL核心语句

SELECT

SELECT是SQL里当之无愧的王者,核心中的核心。
作用是从某数据库中根据客户要求搜索得到所需信息,按规定格式整理后,返回给客户端。
SELECT语句主要是从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。
SELECT语句完整语法非常复杂,如下

SELECT完整语法

核心内容归纳为

[WITH <common_table_expression>]
SELECT select_lish [INTO new_table_name]
[FROM table_source][WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC]]
SELECT参数说明

WITH 子句

指定临时命名的结果集,称为公用表表达式(CTE)。在单条SELECT、INSERT、UPDATE或DELETE语句执行范围内定义。

WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
--只有在查询定义中为所有结果列都提供了不同的名称时,列名称列表才是可选的。
--运行 CTE 的语句为:
SELECT <column_list> FROM expression_name;
WITH [table1 =] table2 [(col_A, col_B[,...n])]
AS
        (CTE_query_definition)

SELECT  [(col_A, col_B)]
FROM table2

INTO 子句

创建新表并将查询结果插入新表中。
INTO new_table
new_table中每列与选择列表中的相应表达式具有相同的名称、数据类型和值。

WHERE 子句

语法格式

GROUP BY 子句

按一个或多个列或表达式的值将一组选定行组合成一个摘要行集,针对每一组返回一行。
GROUP BY group_by_expression[,...n]

HAVING 子句

指定组或了聚合的搜索条件。HAVING通常在GROUP BY子句中使用,没有GROUP BY时,作用与WHERE一样。
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

例:查找订单总金额少于 2000 的客户。
我们使用如下 SQL 语句:

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000

GROUP BY

GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

我们也可以对一个以上的列应用 GROUP BY 语句,就像这样:

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

ORDER BY 子句

排序 ASC顺序增加,DESC顺序减少

COMPUTE 子句

作为附加的汇总列出现在结果集的最后。与BY一起用可以在结果集内生成控制中断。可在同一查询内指定COMPUTE BY和COMPUTE。

COMPUTE
    {{AVG | COUNT | MAX | MIN| STDEV | STDEVP | VAR | VARP | SUM}
    (experssion)} [,...n]
[BY expression[,...n]]
行聚合函数(自动忽略null)

如果是用COMPUTE子句指定的行聚合函数,不允许它们使用DISTINCT关键字。
COMPUTE不加BY里返回两个结果集,一个是详细记录集,另一个是聚合函数计算结果集。
COMPUTE BY会按BY划分的分组,对每个组分别返回上述两个结果集。

  • DISTINCT 关键字
    从SELECT语句的结果中去掉重复的记录。
    SELECT DISTINCT expression

  • TOP 关键字
    限制查询结果显示的行数
    SELECT TOP n [PERCENT]
    [PERCENT] 控制返回百分之n的内容。不加则返回n行。

UNION

将两个表的行合并到一个表中,要求两个表列数据同样多且类型相同,合并后的列名字或别名由第一个表决定。

注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
  1. UNION默认删除重复行,否则需指定ALL关键字。
  2. 如果合并操作的两个SELECT的INTO操作只能在第一个中
  3. 如果合并后的集使用ORDER BY子句,则必须放置在最后一个SELECT中,子句中列名必须使用第一个SELECT中的列名。
  4. 最多合并10个表。
  • UNION和JOIN的区别是,UNION是将新行合并到前一表行下面,列不变;JOIN是将列合并到前一表列一侧,行不变。
  • 需要将不同列数的两表合并时,需要向其中一个表源中添加列。
    可以使用SELECT a_col, b_col, null FROM table 这样的表达。
  • 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

子查询

子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其它子查询中的查询。

  1. 子查询的SELECT查询总使用圆括号括起来。
  • 不能包括COMPUTE或FOR BROWSE子句;
  • 若子查询中指定TOP关键字,则子句中只能使用ORDER BY;
  • 子查询最多嵌套32层;
  • 任何可以使用表达式的地方都可以使用子查询,但要求返回的是单个值;
  • 只在子查询中出现的表,其各列无法包含在输出中。

嵌套查询

将一个查询块嵌套在另一个查询块的WHERE或HAVING子句中。

  • 上层查询称为外查询或父查询,下层称为内查询或子查询。可以多层嵌套,但ORDER BY只能出现在最外层。
  • 嵌套查询通常实现方法是在WHERE或HAVING语句中由IN,NOT IN, ANY, SOME(和ANY一样), ALL,EXSITS引导的子查询。
  • 不是由EXSITS引导的子查询中,只能查询一列。

联接查询

联接是在水平方向上合并两个数据集合,并产生一个新结果集。过程首先对两数据集采用笛卡尔乘积运算,之后对结果集进行选取,以提取来自两个数据集且具有重叠部分的行合并到一起。

  • 内联接 [INNER] JOIN
    结果集不包含两数据集中不重叠的行,所以可能会丢失数据。
SELECT expression
FROM table1 [INNER] JOIN table2
ON table1.col_a = table2. col_b
  • 外部联接
    左联接(LEFT JOIN)或右联接(RIGHT JOIN),分别包括左表所有行或右表所有行。未匹配行则自动增加Null填充。
SELECT expression
FROM table1 LEFT JOIN|RIGHT JOIN table2
ON table1.col_a = table2. col_b

完整外联接(FULL JOIN)会保留左右表中所有行,未匹配处自动填充Null。

SELECT expression
FROM table1 FULL JOIN table2
ON table1.col_a = table2. col_b
  • 交叉联接(CROSS JOIN)
SELECT expression
FROM table1 CROSS JOIN table2

结果集列数 = table1列数+table2列数
结果集行数 = table1行数*table2行数

联接多个表

  • 在WHERE子句中联接多个表
    在FROM中写要联接的多个表的名称,在WHERE中写所有的联接条件
SELECT expression
FROM table1, table2, table3...
WHERE table1.col_a = table2. col_b
AND table2.col_c=table3.col_d AND...
  • 在FROM子句中联接多表
SELECT expression
FROM talbe1
JOIN table2
JOIN table3
ON table1.col_a=table2.col_b
AND table2.col_c = table3.col_d
[ON new search_condition]

JOIN... ON
INNER JOIN(= JOIN): 在表中存在至少一个匹配时,则返回行。
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行,组合后右表没有匹配处为空
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行,组合后左表没有匹配处为空
FULL JOIN: 只要其中一个表中存在匹配,就返回行,组合后任意一侧表没有匹配处均为空
在使用left jion时,on和where条件的区别如下(详细解释见此链接):
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

递归表达式

WITH <common_table_expression> [ ,n ] ]
<common_table_expression>::=
        expression_name [ ( column_name [ ,n ] ) ]
    AS (
       CTE_query_definition1  --  定位点成员(也就是初始值或第一个结果集) 
       union all
       CTE_query_definition2  --  递归成员
    )

以下博客讲解非常好
http://www.cnblogs.com/nokiaguy/archive/2009/02/01/1382207.html
http://www.cnblogs.com/CareySon/archive/2011/12/12/2284740.html
http://www.cnblogs.com/sheng-jie/p/6347835.html

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

推荐阅读更多精彩内容

  • MySQL技术内幕:SQL编程 姜承尧 第1章 SQL编程 >> B是由MySQL创始人之一Monty分支的一个版...
    沉默剑士阅读 2,418评论 0 3
  • 2017/3/14 RDBMS:关系型数据库管理系统 关系模型独立于语言 SQL有几种不同类型的语言:数据定义语言...
    ancherl阅读 1,615评论 0 6
  • SQL与MySQL简介 数据库基础 从SQL的角度来看,数据库就是一个以某种有组织的方式存储的数据集合。我们可以采...
    heming阅读 3,074评论 1 8
  • 一、源文件位置 备份并替换/etc/apt/sources.list的源内容: 二、更改源文件内容 搜狐的源:
    二号潜水艇阅读 2,570评论 0 1
  • 他说,他说他遇到她,是他人生中最幸福的事情,她说她遇到他,是他最不幸的事情。每一次的相遇,每一次的邂逅,也只不过是...
    千杯末阅读 182评论 0 0