加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

SQL select 语法

发布时间:2018-08-20 17:52:33 所属栏目:电商 来源:站长网
导读:SQL 内里最常用的呼吁是 SELECT 语句,用于检索数据。语法是: SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [, ...] [ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ] [ FROM from_item [, ...] ] [ W

SQL 内里最常用的呼吁是 SELECT 语句,用于检索数据。语法是:

SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [, ...] [ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ] [ HAVING condition [, ...] ] [ { UNION | INTERSECT | EXCEPT [ ALL ] } select ] [ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ] [ FOR UPDATE [ OF class_name [, ...] ] ] [ LIMIT { count | ALL } [ { OFFSET | , } start ]]



此刻我们将通过差异的例子演示 SELECT 语句伟大的语法。用于这些例子的表在 供给商和部件数据库 里界说。
1.4.1.1. 简朴的 Select
这里是一些行使 SELECT 语句的简朴例子:

Example 1-4. 带有前提的简朴查询

要从表 PART 内里把字段 PRICE 大于 10 的全部记录找出来, 我们写出下面查询:

SELECT * FROM PART WHERE PRICE > 10;
然后获得表:
PNO | PNAME | PRICE-----+---------+-------- 3 | Bolt | 15 4 | Cam | 25



在 SELECT语句里行使 "*" 将检索出表中的全部属性。 假如我们只但愿从表 PART 中检索出属性 PNAME 和 PRICE, 我们行使下面的语句:

SELECT PNAME, PRICE FROM PART WHERE PRICE > 10;
这回我们的功效是:
PNAME | PRICE --------+-------- Bolt | 15 Cam | 25
请留意 SQL 的 SELECT 语句对应相关演算内里的 "projection" (映射),而不是 "selection"(选择)(参阅 相关演算 获取具体信息)。


WHERE 子句里的前提也可以用要害字 OR,AND,和 NOT 逻辑地毗连起来:

SELECT PNAME, PRICE FROM PART WHERE PNAME = 'Bolt' AND (PRICE = 0 OR PRICE <= 15);
这样将天生下面的功效:
PNAME | PRICE--------+-------- Bolt | 15



方针列表和 WHERE 子句里可以行使算术操纵。譬喻, 假如我们想知道假如我们买两个部件的话要几多钱, 我们可以用下面的查询:

SELECT PNAME, PRICE * 2 AS DOUBLE FROM PART WHERE PRICE * 2 < 50;
这样我们获得:
PNAME | DOUBLE--------+--------- Screw | 20 Nut | 16 Bolt | 30
请留意在要害字 AS 后头的 DOUBLE 是第二个列的新名字。 这个能力可以用于方针列内外的每个元素, 给它们赋予一个在功效列中表现的新的问题。 这个新的问题凡是称为别名。这个体名不能在该查询的其他处所行使。



1.4.1.2. Joins(毗连)
下面的例子表现了 SQL 里是怎样实现毗连的。

要在配合的属性上毗连三个表 SUPPLIER,PART 和 SELLS, 我们凡是行使下面的语句:

SELECT S.SNAME, P.PNAME FROM SUPPLIER S, PART P, SELLS SE WHERE S.SNO = SE.SNO AND P.PNO = SE.PNO;
而我们获得的功效是:
SNAME | PNAME-------+------- Smith | Screw Smith | Nut Jones | Cam Adams | Screw Adams | Bolt Blake | Nut Blake | Bolt Blake | Cam



在 FROM 子句里,我们为每个相关行使了一个体名, 由于在这些相关间有着民众的定名属性(SNO 和 PNO)。 此刻我们可以区分差异表的民众定名属性, 只必要简朴的用每个相关的别名加上个点做前缀就行了。 连系是用与 一个内部联接 里表现的同样的要领计较的。起首算出笛卡儿积 SUPPLIER × PART × SELLS 。然后选出那些满意 WHERE 子句里给出的前提的记录 (也就是说,民众定名属性的值必需相称)。 最后我们映射出除 S.SNAME 和 P.PNAME 外的全部属性。

其它一个举办毗连的要领是行使下面这样的 SQL JOIN 语法:

select sname, pname from supplierJOIN sells USING (sno)JOIN part USING (pno);
giving again:
sname | pname-------+------- Smith | Screw Adams | Screw Smith | Nut Blake | Nut Adams | Bolt Blake | Bolt Jones | Cam Blake | Cam(8 rows)



一个用 JOIN 语法建设的毗连表,是一个呈此刻 FROM 子句里的, 在任何 WHERE,GROUP BY 或 HAVING 子句之前的表引用列表项. 其余表引用,包罗表名字可能其余 JOIN 子句,假如用逗号脱离的话, 可以包括在 FROM 子句里. 毗连天生的表逻辑上和任何其余在 FROM 子句里列出的表都一样.

SQL JOIN 有两种首要范例,CROSS JOIN (无前提毗连) 和前提毗连.前提毗连还可以按照声明的 毗连前提(ON,USING,或 NATURAL)和它 应用的方法(INNER 或 OUTER 毗连)进一步细分.



毗连范例
CROSS JOIN
{ T1 } CROSS JOIN { T2 }

一个交错毗连(cross join)吸取两个体离有 N 行和 M 行 的表 T1 和 T2,然后返回一个包括交错乘积 NxM 笔记录的 毗连表. 对付 T1 的每行 R1,T2 的每行 R2 都与 R1 毗连天生 毗连的表行 JR,JR 包括全部 R1 和 R2 的字段. CROSS JOIN 现实上就是一个 INNER JOIN ON TRUE.
前提 JOIN
{ T1 } [ NATURAL ] [ INNER | { LEFT | RIGHT | FULL } [ OUTER ] ] JOIN { T2 } { ON search condition | USING ( join column list ) }

一个前提 JOIN 必需通过提供一个(而且只能有一个) NATURAL,ON,可能 USING 这样的要害字来声明它的 毗连前提. ON 子句 接管一个 search condition, 它与一个 WHERE 子句沟通.USING 子句接管一个用逗号脱离的 字段名列表,毗连表中必需都有这些字段, 而且用那些字段毗连这些表,天生的毗连表包括每个共有字段 和两个表的全部其余字段. NATURAL 是 USING 子句的缩写,它列出两个表中全部民众 的字段名字.行使 USING 和 NATURAL 的副浸染是 每个毗连的字段都只有一份拷贝呈此刻功效表中 (与前面界说的相关演算的 JOIN 对较量).



[ INNER ] JOIN

对付 T1 的每行 R1,毗连成的表在 T2 里都有一行满 足与 R1 一路的毗连前提.

对付全部 JOIN 而言,INNER 和 OUTER 都是可选的.INNER 是缺省. LEFT,RIGHT,和 FULL 只用于 OUTER JOIN.

LEFT [ OUTER ] JOIN

起首,执行一次 INNER JOIN. 然后,假如 T1 里有一行对任何 T2 的行都不满意 毗连前提,那么返回一个毗连行,该行的 T2 的字段 为 null.

小能力: 毗连成的表无前提地包括 T1 里的全部行.

RIGHT [ OUTER ] JOIN

起首,执行一次 INNER JOIN. 然后,假如 T2 里有一行对任何 T1 的行都不满意 毗连前提,那么返回一个毗连行,该行的 T1 的字段 为 null.

小能力: 毗连成的表无前提地包括 T2 里的全部行.

FULL [ OUTER ] JOIN

起首,执行一次 INNER JOIN. 然后,假如 T1 里有一行对任何 T2 的行都不满意 毗连前提,那么返回一个毗连行,该行的 T1 的字段 为 null. 同样,假如 T2 里有一行对任何 T1 的行都不满意 毗连前提,那么返回一个毗连行,该行的 T2 的字段 为 null.

小能力: 毗连成的表无前提地拥有来自 T1 的每 一行和来自 T2 的每一行.

全部 范例的 JOIN 都可以链接在一路可能嵌套在一路, 这时 T1 和 T2 都可所以毗连天生的表.我们可以行使圆括弧节制 JOIN 的次序,假如我们不主动节制,那么毗连次序是从左到右.
1.4.1.3. 聚积操纵符
SQL 提供以一些聚积操纵符(如, AVG,COUNT,SUM,MIN,MAX),这些聚积操纵符以一个表达式为参数。 只要是满意 WHERE 子句的行,就管帐算这个表达式, 然后聚积操纵符对这个输入数值的荟萃举办计较. 凡是,一个聚积对整个 SELECT 语句计较的功效是 天生一个功效.但假如在一个查询内里声明白分组, 那么数据库将对每个组举办一次独立的计较,而且 聚积功效是凭证各个组呈现的(见下节).

Example 1-5. 聚积

果我们想知道表 PART 内里全部部件的均匀价值,我们可以行使下面查询:

SELECT AVG(PRICE) AS AVG_PRICE FROM PART;



功效是:

AVG_PRICE----------- 14.5



假如我们想知道在表 PART 内里存储了几多部件,我们可以行使语句:

SELECT COUNT(PNO) FROM PART;
获得:
COUNT------- 4




1.4.1.4. 分组聚积
SQL 应承我们把一个表内里的记录分成组。 然后上面描写的聚积操纵符可以应用于这些组上 (也就是说,聚积操纵符的值不再是对全部声明的列的值举办操纵, 而是对一个组的全部值举办操纵。这样聚积函数是为每个组独立地举办计较的。)

对记录的分组是通过要害字 GROUP BY 实现的,GROUP BY 后头随着一个界说组的组成的属性列表。 假如我们行使语句 GROUP BY A1, ⃛, Ak 我们就把相关分成了组,这样当且仅当两笔记录在全部属性 A1, ⃛, Ak 上告竣同等,它们才是统一组的。

Example 1-6. 聚积

假如我们想知道每个供给商贩卖几多个部件,我们可以这样写查询:

SELECT S.SNO, S.SNAME, COUNT(SE.PNO) FROM SUPPLIER S, SELLS SE WHERE S.SNO = SE.SNO GROUP BY S.SNO, S.SNAME;
获得:
SNO | SNAME | COUNT-----+-------+------- 1 | Smith | 2 2 | Jones | 1 3 | Adams | 2 4 | Blake | 3



然后我们看一看产生了什么工作。起首天生表 SUPPLIER 和 SELLS 的毗连:

S.SNO | S.SNAME | SE.PNO-------+---------+-------- 1 | Smith | 1 1 | Smith | 2 2 | Jones | 4 3 | Adams | 1 3 | Adams | 3 4 | Blake | 2 4 | Blake | 3 4 | Blake | 4



然后我们把那些属性 S.SNO 和 S.SNAME 沟通的记录放在组中:

S.SNO | S.SNAME | SE.PNO-------+---------+-------- 1 | Smith | 1 | 2-------------------------- 2 | Jones | 4-------------------------- 3 | Adams | 1 | 3-------------------------- 4 | Blake | 2 | 3 | 4



在我们的例子里,我们有四个组而且此刻我们可以对每个组应用聚积操纵符 COUNT,天生上面给出的查询的最终功效。



请留意假如要让一个行使 GROUP BY 和聚积操纵符的查询的功效故意义, 那么用于分组的属性也必需呈此刻方针列表中。 全部没有在 GROUP BY 子句内里呈现的属性都只能通过行使聚积函数来选择。 不然就不会有独一的数值与其余字段关联.

还要留意的是在聚积上聚积是没故意义的,好比,AVG(MAX(sno)), 由于 SELECT 只做一个回合的分组和聚积.你可以得到这样的功效, 要领是行使姑且表可能在 FROM 子句中行使一个子 SELECT 做第一个条理的聚积.
1.4.1.5. Having
HAVING 子句运做起来很是象 WHERE 子句, 只用于对那些满意 HAVING 子句内里给出的前提的组举办计较。 着实,WHERE 在分组和聚积之前过滤掉我们不必要的输入行, 而 HAVING 在 GROUP 之后那些不必要的组. 因此,WHERE 无法行使一个聚积函数的功效. 而另一方面,我们也没有来由写一个不涉及聚积函数的 HAVING. 假如你的前提不包括聚积,那么你也可以把它写在 WHERE 内里, 这样就可以停止对那些你筹备丢弃的行举办的聚积运算.

Example 1-7. Having

假如我们想知道那些贩卖高出一个部件的供给商,行使下面查询:

SELECT S.SNO, S.SNAME, COUNT(SE.PNO) FROM SUPPLIER S, SELLS SE WHERE S.SNO = SE.SNO GROUP BY S.SNO, S.SNAME HAVING COUNT(SE.PNO) > 1;
and get:
SNO | SNAME | COUNT-----+-------+------- 1 | Smith | 2 3 | Adams | 2 4 | Blake | 3




1.4.1.6. 子查询
在 WHERE 和 HAVING 子句里,应承在任何要发生数值的处所行使子查询 (子选择)。 这种环境下,该值必需起首来自对子查询的计较。子查询的行使扩展了 SQL 的表达手段。

Example 1-8. 子查询

假如我们想知道全部比名为 'Screw' 的部件贵的部件,我们可以用下面的查询:

SELECT * FROM PART WHERE PRICE > (SELECT PRICE FROM PART WHERE PNAME='Screw');



功效是:

PNO | PNAME | PRICE-----+---------+-------- 3 | Bolt | 15 4 | Cam | 25



当我们搜查上面的查询时会发明呈现了两次 SELECT 要害字。 第一个在查询的开头 - 我们将称之为外层 SELECT - 而另一个在 WHERE 子句内里,成为一个嵌入的查询 - 我们将称之为内层 SELECT。 对外层 SELECT 的每笔记录都必需先计较内层 SELECT。在完成全部计较之后, 我们得知名为 'Screw' 部件的记录的价值, 然后我们就可以搜查那些价值更贵的记录了。 (现实上,在本例中,内层查询只必要执行一次, 由于它不依靠于外层查询高档状态.)

假如我们想知道那些不贩卖任何部件的供给商 (好比说,我们想把这些供给商从数据库中删除),我们用:

SELECT * FROM SUPPLIER S WHERE NOT EXISTS (SELECT * FROM SELLS SE WHERE SE.SNO = S.SNO);



在我们的例子里,功效列将是空的,由于每个供给商至少贩卖一个部件。 请留意我们在 WHERE 子句的内层 SELECT 里行使了来自外层 SELECT 的 S.SNO。 正如前面所说的,子查询为每个外层查询计较一次,也就是说, S.SNO 的值老是从外层 SELECT 的现实记录中取得的。


1.4.1.7. 在 FROM 内里的子查询
一种有些出格的子查询的用法是把它们放在 FROM 子句里. 这个特征很有效,由于这样的子查询可以输出多列和多行, 而在表达式里行使的子查询必需天生一个功效. FROM 里的子查询还可以让我们得到多于一个回合的分组/聚积特征, 而不必要告急于姑且表.

Example 1-9. FROM 内里的子查询

假如我们想知道在全部我们的供给商中的最高均匀部件价值的那家, 我们不能用 MAX(AVG(PRICE)),但我们可以这么写:

SELECT MAX(subtable.avgprice) FROM (SELECT AVG(P.PRICE) AS avgprice FROM SUPPLIER S, PART P, SELLS SE WHERE S.SNO = SE.SNO AND P.PNO = SE.PNO GROUP BY S.SNO) subtable;
这个子查询为每个供给商返回一行(由于它的 GROUP BY) 然后我们在外层查询对全部行举办聚积.



1.4.1.8. Union, Intersect, Except(连系,相交,相异)
这些操纵符别离计较两个子查询发生的元组的连系,相交和集公道论里的相异。

Example 1-10. Union, Intersect, Except

下面的例子是 UNION 的例子:

SELECT S.SNO, S.SNAME, S.CITY FROM SUPPLIER S WHERE S.SNAME = 'Jones'UNION SELECT S.SNO, S.SNAME, S.CITY FROM SUPPLIER S WHERE S.SNAME = 'Adams';
发生功效:
SNO | SNAME | CITY-----+-------+-------- 2 | Jones | Paris 3 | Adams | Vienna



下面是相交( INTERSECT)的例子:

SELECT S.SNO, S.SNAME, S.CITY FROM SUPPLIER S WHERE S.SNO > 1INTERSECT SELECT S.SNO, S.SNAME, S.CITY FROM SUPPLIER S WHERE S.SNO < 3;
发生功效:
SNO | SNAME | CITY-----+-------+-------- 2 | Jones | Paris
两个查询城市返回的元组是那条 SNO=2 的


最后是一个 EXCEPT 的例子:

SELECT S.SNO, S.SNAME, S.CITY FROM SUPPLIER S WHERE S.SNO > 1EXCEPT SELECT S.SNO, S.SNAME, S.CITY FROM SUPPLIER S WHERE S.SNO > 3;
功效是:
SNO | SNAME | CITY-----+-------+-------- 2 | Jones | Paris 3 | Adams | Vienna

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读