【摘】《SQL必知必会》


Chapter1:了解SQL

数据类型兼容

数据类型及其名称是SQL不兼容的一个主要原因。虽然大多数基本数据类型得到了一致的支持,但是很多高级的数据类型却没有。更糟的是,偶尔会有相同的数据类型在不同的DBMS中具有不同的名称。对此用户毫无办法,重要的是在创建表结构时要记住这些差异。

主键(primary key)

主键用来表示一个特定的列。表中的任何一列都可以成为主键,只要它具有以下条件:

  • 任意两行都不具有相同的主键值;
  • 每一行必须具有一个主键值(主键列不允许NULL值);
  • 主键列中的值不允许修改或更新
  • 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)

Chapter2:检索数据

SELECT DISTINCT vend_id, prod_price
FROM Products
LIMIT 3 OFFSET 4;

SQL语句和大小写

SQL语句不区分大小写,因此SELECT与select是相同的。同样,写成Select也没有关系。许多SQL开发人员喜欢对SQL关键字使用大写,而对列名和表名使用小写,这样做使得代码更易于阅读和调试。不过,一定要认识到,SQL不区分大小写,但是表名、列名和值可能有所不同(这依赖于具体的DBMS及其设置)。

当心逗号

在选择多列时,一定要在列名之间加上逗号,但最后一个列名后不加。如果在最后一个列名之后加了逗号,就会出现错误。

数据表示

SQL语句一般返回原始的、无格式的数据。数据的格式化是表示问题,而不是检索问题。因此,表示一般在显示数据的应用程序中规定。通常很少直接使用实际检索出的数据。

使用通配符

一般而言,除非你确实需要表中的每一列,否则最好别使用*通配符,因为检索不需要的列会降低检索的性能。

检所不同的值

DISTINCT关键字必须直接放在列名前面,而且不能部分使用DISTICT,DISTINCT关键字作用与所有列,不仅仅是跟在其后的那一列。

限制结果

LIMIT 3 OFFSET 4   --返回从第3行起的四个数据
LIMIT 3,4  --同上
LIMIT 0 OFFSET 1      --返回从第0行

第一个被检索的行是第0行,而不是第1行。

注释

-- 行内注释
# 单行注释
/* 多行注释 */ 

Chapter3:排序检索数据

SELECT prod_name
FROM Products
ORDER BY prod_name DESC;
/*等价于*/
SELECT prod_name
FROM Products
ORDER BY 1;

注意:
在指定 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一条子句。如果它不是最后的子句,将会出现错误信息。通常, ORDER BY 子句中使用的列将是为现实而选择的列。但是,实际上用非检索列排序数据是完全合法的。ORDER BY 子句还可以通过多列进行排序。此外, ORDER BY 还支持按相对位置进行排序。这种排序方法的好处是不用重新输入列名,但它也有缺点。首先,不明确给出列名有可能造成错用列名排序。其次,在对SELECT 清单进行更改时容易错误地对数据进行排序(忘记ORDER BY 子句做相应的改动)。最后,如果进行排序的列不在 SELECT 清单中,显然不能使用这项技术。

DESC 关键字用于指定降序排列。 这个关键字只应用于直接位于其前面的列名,如果想在多个列上进行降序排列,必须对对每一列指定 DESC 关键字。


Chapter4:过滤数据

WHERE 子句操作符
操作符 说明 操作符 说明
= 等于 > 大于
<> 不等于 >= 大于等于
!= 不等于 !> 不大于
< 小于 BETWEEN 在指定的两个值之间
<= 小于等于 IS NULL 为NULL值
!< 不小于

字符串比较

SELECT vend_id, prod_name
FROM Products
WHERE vennd_id != 'DLL01'

提示:WHERE 子句中,单引号用来限定字符串。如果将值与字符串类型的列比较,就需要限定引号。而用来与数值列比较的值不用引号。

数值比较

SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10

提示:在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括开始值和结束值。

空值检查

在创建表时,表的设计人员可以指定其中的列能否不包含值。在一个列不包含值时,成其包含空值NULL。
确定值是否为空值不能简单的检查是否=NULL。SELECT语句中有一个特殊的WHERE子句,可用来检查具有NULL值得列。这个WHERE子句时IS NULL子句。

SELECT cust_name
FROM Customers
WHERE cust_email IS NULL

注意:NULL和非匹配
通过过滤选择不包含指定值的所有行时,你可能希望返回含有NULL值的列。但是,这做不到。因为unknown有特殊的含义,数据库不知道它们是否匹配,所以在进行匹配过滤时不会返回这些结果。
过滤数据时,一定要验证被过滤列中含NULL的行的确出现在返回数据中。


Chapter5:高级数据过滤

AND

用在WHERE子句中的关键字,用来检索满足所有给定条件的行。

OR

用在WHERE子句中的关键字,用来检索匹配任意给定条件的行。

IN

IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配 。IN 取一组由逗号分隔、括在圆括号中的合法值。
IN 操作符的优点:

  • 在有很多合法项时, IN 操作符的语法更清楚,更直观。
  • 在与其他AND 和 OR 操作符组合使用 IN 时求值顺序更容易管理。
  • IN 操作符一般比一组OR操作符执行的更快。
  • IN 操作符可以包含其它 SELECT 语句,能够更动态地建立WHERE子句。

NOT

WHERE 子句中用来否定其后条件的关键字。
分析:为什么使用 NOT ?
在与 IN 操作符联合使用时, NOT 可以非常简单的找出与条件列表不匹配的行。


Chapter6:用通配符进行过滤

通配符只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。

%

%表示任何字符出现任意次数。%看起来好像可以匹配任何东西i,但是有个例外,那就是NULL。子句WHERE prod_name LIKE '%' 不会匹配NULL的行。

_

_刚好匹配一个字符,不能多也不能少。

[]

[]用来指定一个字符集,它必须匹配指定位置的一个字符。

通配符使用技巧

  • 不要过度使用通配符。在其他操作符可以达到相同目的时,应使用其他操作符。
  • 确定需要使用操作符时,尽量不要把它们用在搜索模式的开始处。把通配符放在开始处,搜索起来最慢。

Chapter7:创建计算字段

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

推荐阅读更多精彩内容