sql 学习笔记 档
从下面的内容 3c school
17:SQL UNION 和 UNION ALL 操作符 24
l SQL SELECT INTO 实例 - 制作备份复件 26
l SQL SELECT INTO 实例 - 带有 WHERE 子句 27
l SQL SELECT INTO 实例 - 被连接的表 27
l SQL UNIQUE Constraint on CREATE TABLE 30
SQL Server / Oracle / MS Access: 30
MySQL / SQL Server / Oracle / MS Access: 31
SQL UNIQUE Constraint on ALTER TABLE 31
MySQL / SQL Server / Oracle / MS Access: 31
MySQL / SQL Server / Oracle / MS Access: 31
SQL Server / Oracle / MS Access: 32
SQL PRIMARY KEY Constraint on CREATE TABLE 32
SQL Server / Oracle / MS Access: 32
MySQL / SQL Server / Oracle / MS Access: 33
SQL PRIMARY KEY Constraint on ALTER TABLE 33
MySQL / SQL Server / Oracle / MS Access: 33
MySQL / SQL Server / Oracle / MS Access: 33
SQL Server / Oracle / MS Access: 34
SQL FOREIGN KEY Constraint on CREATE TABLE 34
SQL Server / Oracle / MS Access: 35
MySQL / SQL Server / Oracle / MS Access: 35
SQL FOREIGN KEY Constraint on ALTER TABLE 35
MySQL / SQL Server / Oracle / MS Access: 35
MySQL / SQL Server / Oracle / MS Access: 36
SQL Server / Oracle / MS Access: 36
SQL CHECK Constraint on CREATE TABLE 36
SQL Server / Oracle / MS Access: 37
MySQL / SQL Server / Oracle / MS Access: 37
SQL CHECK Constraint on ALTER TABLE 37
MySQL / SQL Server / Oracle / MS Access: 37
MySQL / SQL Server / Oracle / MS Access: 38
SQL Server / Oracle / MS Access: 38
SQL DEFAULT Constraint on CREATE TABLE 38
My SQL / SQL Server / Oracle / MS Access: 38
SQL DEFAULT Constraint on ALTER TABLE 39
SQL Server / Oracle / MS Access: 39
SQL Server / Oracle / MS Access: 39
用于 Microsoft SQLJet (以及 Microsoft Access) 的语法: 41
我们希望在表 "Persons" 中加入一个名为 "Birthday" 的新列。
43
SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数 52
"Persons" table (在大部分的样例中使用过) 59
SQL COUNT(DISTINCT column_name) 语法 63
SQL COUNT(DISTINCT column_name) 实例 64
1:Sql 分为两个部分:
l 数据操作语言 DML:
SELECT 查询
UPDATE 更新
DELETE 删除
INSERT INTO 插入
l 数据定义语言 DDL
CREATE DATABASE 创建数据库
ALTER DATABASE 改动数据库结构
CREATE TABLE 创建表
DROP TABLE 删除表
CREATE INDEX 创建索引
DROP INDEX 删除索引
2:查询
v 查询指定的列信息:
SELECT 列名,列名... FROM 表名
v 查询表中全部信息:
SELECT * FROM 表名
v 假设不希望查询出的某列中包括反复的值则使用 DISTINCT keyword
SELECTL DISTINCT列名 FROM 表名
v 指定条件查询 使用keyword WHERE
SELECT 列名 FROM 表名 WHERE 列 运算符 值
Eg:
SELECT * FROM Persons WHERE City='Beijing'
SELECT * FROM Persons WHERE Year>1965
(注意 文本值 使用单引號, 数值不用)
v AND 和 OR 运算符
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
假设第一个条件和第二个条件都成立。则 AND 运算符显示一条记录。
假设第一个条件和第二个条件中仅仅要有一个成立,则 OR 运算符显示一条记录。
Eg:
使用AND:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
使用OR:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
组合使用 AND OR:
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'
v 使用ORDER BY 对结果集进行排序
ORDER BY 默认对结果集进行升序排序,假设要是採用降序:使用DESC keyword
① SELECT Company, OrderNumber FROM Orders ORDER BY Company
以字母顺序显示公司名称:
② SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
③ SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
以逆字母顺序显示公司名称:
④ SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
以逆字母顺序显示公司名称。并以数字顺序显示顺序号:
备注:
升序 : ascending order
降序: descending order
3:插入:
l INSERT INTO 语句用于向表格中插入新的行。
语法: INSERT INTO 表名 VALUES (值1,值2.。
。。
)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
l 我们也能够指定所要插入数据的列:
INSERT INTO table_name (列1。列2,...) VALUES (值1,值2,...)
INSERT INTO Persons (LastName, Address) VALUES ('Wilson','Champs-Elysees')
4:数据库更新 UPDATE
Update 语句用于改动表中的数据。
UPDATE 表名 SET 列名=新值 WHERE 列名 = 某值
l 我们为 lastname 是 "Wilson" 的人加入 firstname:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
l 我们会改动地址(address)。并加入城市名称(city):
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'WHERE LastName = 'Wilson'
5:删除 DELETE
DELETE 语句用于删除表中的行
l DELETE FROM 表名 WHERE 列名= 值
DELETE FROM Person WHERE LastName = 'Wilson'
l 删除全部行。表的结构、属性和索引 都是完整的
① DELETE FROM table_name
② DELETE * FROM table_name
6:Sql TOP 子句:
TOP 子句用于规定要返回的记录的数目
SELETE TOP number| percent colum_name(s) FROM table
Eg:
1) SELECT TOP 2 * FROM Persons
我们希望从上面的 "Persons" 表中选取 50% 的记录。
2) SELECT TOP 50 PERCENT * FROM Persons
7: SQL LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中指定模式
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
l Eg1:
l Eg:2
l Eg:3
l Eg:4
8:SQL 通配符
Ø 在搜索数据库中的数据时,SQL 通配符能够替代一个或多个字符。
Ø SQL 通配符必须与 LIKE 运算符一起使用。
Eg:
² 使用 % 通配符
比如1:
如今。我们希望从上面的 "Persons" 表中选取居住在以 "Ne" 開始的城市里的人:
我们能够使用以下的 SELECT 语句:
SELECT * FROM Persons WHERE City LIKE 'Ne%'
比如2:
接下来,我们希望从 "Persons" 表中选取居住在包括 "lond" 的城市里的人:
我们能够使用以下的 SELECT 语句:
SELECT * FROM Persons WHERE City LIKE '%lond%'
² 使用 _ 通配符
样例 1
如今,我们希望从上面的 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人:
我们能够使用以下的 SELECT 语句:
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
样例 2
接下来,我们希望从 "Persons" 表中选取的这条记录的姓氏以 "C" 开头,然后是一个随意字符,然后是 "r",然后是随意字符,然后是 "er":
我们能够使用以下的 SELECT 语句:
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'
² 使用 [charlist] 通配符
样例 1
如今。我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:
我们能够使用以下的 SELECT 语句:
SELECT * FROM Persons WHERE City LIKE '[ALN]%'
样例 2
如今,我们希望从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:
我们能够使用以下的 SELECT 语句:
SELECT * FROM Persons WHERE City LIKE '[!ALN]%'
9:IN 操作符
IN 操作符同意我们再WHERE 子句中规定多值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
如今,我们希望从上表中选取姓氏为 Adams 和 Carter 的人:
我们能够使用以下的 SELECT 语句:
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
10: BETWEEN 操作符
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。
这些值能够是数值、文本或者日期。
l 如需以字母顺序显示介于 "Adams"(包含)和 "Carter"(不包含)之间的人,请使用以下的 SQL:
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
重要事项:不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。某些数据库会列出介于 "Adams" 和 "Carter" 之间的人。但不包含 "Adams" 和 "Carter" 。某些数据库会列出介于 "Adams" 和 "Carter" 之间并包含 "Adams" 和 "Carter" 的人。而还有一些数据库会列出介于 "Adams" 和 "Carter" 之间的人,包含 "Adams" ,但不包含 "Carter" 。
所以,请检查你的数据库是怎样处理 BETWEEN....AND 操作符的!
l 如需使用上面的样例显示范围之外的人。请使用 NOT 操作符:
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
11:Alias (别名)
通过使用 SQL,能够为列名称和表名称指定别名(Alias)。
表的语法:
SELECT column_name(s) FROM table_name AS alias_name
列的语法:
SELECT column_name AS alias_name FROM table_name
l Alias 实例: 使用表名称别名
如果我们有两个表各自是:"Persons" 和 "Product_Orders"。
我们分别为它们指定别名 "p" 和 "po"。
如今,我们希望列出 "John Adams" 的全部定单。
我们能够使用以下的 SELECT 语句:
SELECT po.OrderID, p.LastName, p.FirstNameFROM Persons AS p, Product_Orders AS poWHERE p.LastName='Adams' AND p.FirstName='John'
不使用别名的 SELECT 语句:
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstNameFROM Persons, Product_OrdersWHERE Persons.LastName='Adams' AND Persons.FirstName='John'
从上面两条 SELECT 语句您能够看到,别名使查询程序更易阅读和书写。
l Alias 实例: 使用一个列名别名
SELECT LastName AS Family, FirstName AS Name FROM Persons
12: JOIN
SQL join 用于依据两个或多个表中的列之间的关系,从这些表中查询数据
Join 和 Key
有时为了得到完整的结果,我们须要从两个或很多其它的表中获取结果。我们就须要运行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。
在表中,每一个主键的值都是唯一的。这样做的目的是在不反复每一个表中的全部数据的情况下,把表间的数据交叉捆绑在一起。
请注意,"Id_P" 列是 Persons 表中的的主键。
这意味着没有两行可以拥有同样的 Id_P。即使两个人的姓名全然同样,Id_P 也可以区分他们。
接下来请看 "Orders" 表:
请注意,"Id_O" 列是 Orders 表中的的主键,同一时候,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。
请留意。"Id_P" 列把上面的两个表联系了起来。
l 引用两个表
我们能够通过引用两个表的方式。从两个表中获取数据:
谁订购了产品,而且他们订购了什么产品?
① SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM Persons, OrdersWHERE Persons.Id_P = Orders.Id_P
除了上面的方法,我们也能够使用关键词 JOIN 来从两个表中获取数据。
假设我们希望列出全部人的定购,能够使用以下的 SELECT 语句:
② SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM Persons
INNER JOIN OrdersON Persons.Id_P = Orders.Id_PORDER BY Persons.LastName
² 不同的 SQL JOIN
除了我们在上面的样例中使用的 INNER JOIN(内连接),我们还能够使用其它几种连接。
以下列出了您能够使用的 JOIN 类型。以及它们之间的差异。
· JOIN: 假设表中有至少一个匹配,则返回行
· LEFT JOIN: 即使右表中没有匹配,也从左表返回全部的行
· RIGHT JOIN: 即使左表中没有匹配,也从右表返回全部的行
· FULL JOIN: 仅仅要当中一个表中存在匹配,就返回行
13:SQL INNER JOIN keyword
在表中存在至少一个匹配时,INNER JOIN keyword返回行。
INNER JOIN keyword语法
SELECT column_name(s)FROM table_name1INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name
凝视:INNER JOIN 与 JOIN 是同样的。
内连接(INNER JOIN)实例
如今,我们希望列出全部人的定购。
l 您能够使用以下的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsINNER JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
14:SQL LEFT JOIN keyword
LEFT JOIN keyword会从左表 (table_name1) 那里返回全部的行,即使在右表 (table_name2) 中没有匹配的行。
LEFT JOIN keyword语法
SELECT column_name(s)FROM table_name1LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
凝视:在某些数据库中。 LEFT JOIN 称为 LEFT OUTER JOIN。
l 左连接(LEFT JOIN)实例
如今,我们希望列出全部的人。以及他们的定购 - 假设有的话。
您能够使用以下的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsLEFT JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
15:SQL RIGHT JOIN keyword
RIGHT JOIN keyword会右表 (table_name2) 那里返回全部的行,即使在左表 (table_name1) 中没有匹配的行。
RIGHT JOIN keyword语法
SELECT column_name(s)FROM table_name1RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
凝视:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。
l 右连接(RIGHT JOIN)实例
如今,我们希望列出全部的定单。以及定购它们的人 - 假设有的话。
您能够使用以下的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsRIGHT JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
16:SQL FULL JOIN keyword
仅仅要当中某个表存在匹配,FULL JOIN keyword就会返回行。
FULL JOIN keyword语法
SELECT column_name(s)FROM table_name1FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name
凝视:在某些数据库中。 FULL JOIN 称为 FULL OUTER JOIN。
如今。我们希望列出全部的人。以及他们的定单,以及全部的定单,以及定购它们的人。
您能够使用以下的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsFULL JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
17:SQL UNION 和 UNION ALL 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意。UNION 内部的 SELECT 语句必须拥有同样数量的列。列也必须拥有相似的数据类型。
同一时候,每条 SELECT 语句中的列的顺序必须同样。
SQL UNION 语法
SELECT column_name(s) FROM table_name1UNIONSELECT column_name(s) FROM table_name2
凝视:默认地。UNION 操作符选取不同的值。
假设同意反复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1UNION ALLSELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
l 实例
列出全部在中国和美国的不同的雇员名:
SELECT E_Name FROM Employees_ChinaUNIONSELECT E_Name FROM Employees_USA
凝视:这个命令无法列出在中国和美国的全部雇员。
在上面的样例中,我们有两个名字同样的雇员,他们其中仅仅有一个人被列出来了。
UNION 命令仅仅会选取不同的值。
l 使用 UNION ALL 命令
实例:
列出在中国和美国的全部的雇员:
SELECT E_Name FROM Employees_ChinaUNION ALLSELECT E_Name FROM Employees_USA
18:SQL SELECT INTO 语句
SELECT INTO 语句从一个表中选取数据,然后把数据插入还有一个表中。
SELECT INTO 语句经常使用于创建表的备份复件或者用于对记录进行存档。
SQL SELECT INTO 语法
您能够把全部的列插入新表:
SELECT *INTO new_table_name [IN externaldatabase] FROM old_tablename
或者仅仅把希望的列插入新表:
SELECT column_name(s)INTO new_table_name [IN externaldatabase] FROM old_tablename
l SQL SELECT INTO 实例 - 制作备份复件
以下的样例会制作 "Persons" 表的备份复件:
SELECT *INTO Persons_backupFROM Persons
IN 子句可用于向还有一个数据库中拷贝表:
SELECT *INTO Persons IN 'Backup.mdb'FROM Persons
假设我们希望拷贝某些域,能够在 SELECT 语句后列出这些域:
SELECT LastName,FirstNameINTO Persons_backupFROM Persons
l SQL SELECT INTO 实例 - 带有 WHERE 子句
我们也能够加入 WHERE 子句。
以下的样例通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表:
SELECT LastName,FirstnameINTO Persons_backupFROM PersonsWHERE City='Beijing'
l SQL SELECT INTO 实例 - 被连接的表
从一个以上的表中选取数据也是能够做到的。
以下的样例会创建一个名为 "Persons_Order_Backup" 的新表,当中包括了从 Persons 和 Orders 两个表中取得的信息:
SELECT Persons.LastName,Orders.OrderNoINTO Persons_Order_BackupFROM PersonsINNER JOIN OrdersON Persons.Id_P=Orders.Id_P
19:SQL CREATE DATABASE 语句
CREATE DATABASE 用于创建数据库。
SQL CREATE DATABASE 语法
CREATE DATABASE database_name
20:SQL CREATE DATABASE 实例
如今我们希望创建一个名为 "my_db" 的数据库。
我们使用以下的 CREATE DATABASE 语句:
CREATE DATABASE my_db
能够通过 CREATE TABLE 来加入数据库表。
21:CREATE TABLE 语句
CREATE TABLE 语句用于创建数据库中的表。
SQL CREATE TABLE 语法
CREATE TABLE 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....)
数据类型(data_type)规定了列可容纳何种数据类型。
以下的表格包括了SQL中最经常使用的数据类型:
数据类型 |
描写叙述 |
· integer(size) · int(size) · smallint(size) · tinyint(size) |
仅容纳整数。在括号内规定数字的最大位数。 |
· decimal(size,d) · numeric(size,d) |
容纳带有小数的数字。 "size" 规定数字的最大位数。 "d" 规定小数点右側的最大位数。 |
char(size) |
容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。 在括号里规定字符串的长度。 |
varchar(size) |
容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。 在括号里规定字符串的最大长度。 |
date(yyyymmdd) |
容纳日期。 |
SQL CREATE TABLE 实例
本例演示怎样创建名为 "Person" 的表。
该表包括 5 个列。列名各自是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City":
CREATE TABLE Persons(Id_P int,LastName varchar(255),FirstName varchar(255),Address varchar(255),City varchar(255))
Id_P 列的数据类型是 int,包括整数。其余 4 列的数据类型是 varchar,最大长度为 255 个字符。
22:SQL 约束
约束用于限制增加表的数据的类型。
能够在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也能够(通过 ALTER TABLE 语句)。
我们将主要探讨下面几种约束:
· NOT NULL
· UNIQUE
· PRIMARY KEY
· FOREIGN KEY
· CHECK
· DEFAULT
SQL NOT NULL 约束
l NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包括值。
这意味着。假设不向字段加入值。就无法插入新记录或者更新记录。
以下的 SQL 语句强制 "Id_P" 列和 "LastName" 列不接受 NULL 值:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
l SQL UNIQUE 约束
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自己主动定义的 UNIQUE 约束。
请注意,每一个表能够有多个 UNIQUE 约束,可是每一个表仅仅能有一个 PRIMARY KEY 约束。
l SQL UNIQUE Constraint on CREATE TABLE
以下的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束:
MySQL:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),UNIQUE (Id_P))
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL UNIQUE,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
假设须要命名 UNIQUE 约束。以及为多个列定义 UNIQUE 约束。请使用以下的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName))
SQL UNIQUE Constraint on ALTER TABLE
当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD UNIQUE (Id_P)
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用以下的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
撤销 UNIQUE 约束
如需撤销 UNIQUE 约束,请使用以下的 SQL:
MySQL:
ALTER TABLE PersonsDROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT uc_PersonID
l SQL PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包括唯一的值。
主键列不能包括 NULL 值。
每一个表都应该有一个主键,而且每一个表仅仅能有一个主键。
SQL PRIMARY KEY Constraint on CREATE TABLE
以下的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束:
MySQL:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),PRIMARY KEY (Id_P))
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL PRIMARY KEY,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
假设须要命名 PRIMARY KEY 约束。以及为多个列定义 PRIMARY KEY 约束。请使用以下的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName))
SQL PRIMARY KEY Constraint on ALTER TABLE
假设在表已存在的情况下为 "Id_P" 列创建 PRIMARY KEY 约束,请使用以下的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD PRIMARY KEY (Id_P)
假设须要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用以下的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
凝视:假设您使用 ALTER TABLE 语句加入主键,必须把主键列声明为不包括 NULL 值(在表首次创建时)。
撤销 PRIMARY KEY 约束
如需撤销 PRIMARY KEY 约束,请使用以下的 SQL:
MySQL:
ALTER TABLE PersonsDROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT pk_PersonID
l SQL FOREIGN KEY 约束
一个表中的 FOREIGN KEY 指向还有一个表中的 PRIMARY KEY。
让我们通过一个样例来解释外键。请看以下两个表:
SQL FOREIGN KEY Constraint on CREATE TABLE
以下的 SQL 在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY:
MySQL:
CREATE TABLE Orders(Id_O int NOT NULL,OrderNo int NOT NULL,Id_P int,PRIMARY KEY (Id_O),FOREIGN KEY (Id_P) REFERENCES Persons(Id_P))
SQL Server / Oracle / MS Access:
CREATE TABLE Orders(Id_O int NOT NULL PRIMARY KEY,OrderNo int NOT NULL,Id_P int FOREIGN KEY REFERENCES Persons(Id_P))
假设须要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束。请使用以下的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders(Id_O int NOT NULL,OrderNo int NOT NULL,Id_P int,PRIMARY KEY (Id_O),CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)REFERENCES Persons(Id_P))
SQL FOREIGN KEY Constraint on ALTER TABLE
假设在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束,请使用以下的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE OrdersADD FOREIGN KEY (Id_P)REFERENCES Persons(Id_P)
假设须要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束。请使用以下的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE OrdersADD CONSTRAINT fk_PerOrdersFOREIGN KEY (Id_P)REFERENCES Persons(Id_P)
撤销 FOREIGN KEY 约束
如需撤销 FOREIGN KEY 约束。请使用以下的 SQL:
MySQL:
ALTER TABLE OrdersDROP FOREIGN KEY fk_PerOrders
SQL Server / Oracle / MS Access:
ALTER TABLE OrdersDROP CONSTRAINT fk_PerOrders
l SQL CHECK 约束
CHECK 约束用于限制列中的值的范围。
假设对单个列定义 CHECK 约束,那么该列仅仅同意特定的值。
假设对一个表定义 CHECK 约束。那么此约束会在特定的列中对值进行限制。
SQL CHECK Constraint on CREATE TABLE
以下的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须仅仅包括大于 0 的整数。
My SQL:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CHECK (Id_P>0))
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL CHECK (Id_P>0),LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
假设须要命名 CHECK 约束。以及为多个列定义 CHECK 约束,请使用以下的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes'))
SQL CHECK Constraint on ALTER TABLE
假设在表已存在的情况下为 "Id_P" 列创建 CHECK 约束。请使用以下的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CHECK (Id_P>0)
假设须要命名 CHECK 约束,以及为多个列定义 CHECK 约束。请使用以下的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
撤销 CHECK 约束
如需撤销 CHECK 约束。请使用以下的 SQL:
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT chk_Person
MySQL:
ALTER TABLE PersonsDROP CHECK chk_Perso
l SQL DEFAULT 约束
DEFAULT 约束用于向列中插入默认值。
假设没有规定其它的值,那么会将默认值加入到全部的新记录。
SQL DEFAULT Constraint on CREATE TABLE
以下的 SQL 在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束:
My SQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255) DEFAULT 'Sandnes')
通过使用类似 GETDATE() 这种函数。DEFAULT 约束也能够用于插入系统值:
CREATE TABLE Orders(Id_O int NOT NULL,OrderNo int NOT NULL,Id_P int,OrderDate date DEFAULT GETDATE())
SQL DEFAULT Constraint on ALTER TABLE
假设在表已存在的情况下为 "City" 列创建 DEFAULT 约束。请使用以下的 SQL:
MySQL:
ALTER TABLE PersonsALTER City SET DEFAULT 'SANDNES'
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsALTER COLUMN City SET DEFAULT 'SANDNES'
撤销 DEFAULT 约束
如需撤销 DEFAULT 约束,请使用以下的 SQL:
MySQL:
ALTER TABLE PersonsALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsALTER COLUMN City DROP DEFAULT
23:SQL CREATE INDEX 语句
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序能够更快地查找数据。
索引
您能够在表中创建索引。以便更加高速高效地查询数据。
用户无法看到索引,它们仅仅能被用来加速搜索/查询。
凝视:更新一个包括索引的表须要比更新一个没有索引的表很多其它的时间,这是因为索引本身也须要更新。
因此,理想的做法是只在经常被搜索的列(以及表)上面创建索引。
SQL CREATE INDEX 语法
在表上创建一个简单的索引。
同意使用反复的值:
CREATE INDEX index_nameON table_name (column_name)
凝视:"column_name" 规定须要索引的列。
SQL CREATE UNIQUE INDEX 语法
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有同样的索引值。
CREATE UNIQUE INDEX index_nameON table_name (column_name)
CREATE INDEX 实例
本例会创建一个简单的索引。名为 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndexON Person (LastName)
假设您希望以降序索引某个列中的值,您能够在列名称之后加入保留字 DESC:
CREATE INDEX PersonIndexON Person (LastName DESC)
假如您希望索引不止一个列。您能够在括号里列出这些列的名称。用逗号隔开:
CREATE INDEX PersonIndexON Person (LastName, FirstName)
24:SQL 撤销索引、表以及数据库
通过使用 DROP 语句,能够轻松地删除索引、表和数据库。
SQL DROP INDEX 语句
我们能够使用 DROP INDEX 命令删除表格中的索引。
用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:
DROP INDEX index_name ON table_name
用于 MS SQL Server 的语法:
DROP INDEX table_name.index_name
用于 IBM DB2 和 Oracle 语法:
DROP INDEX index_name
用于 MySQL 的语法:
ALTER TABLE table_name DROP INDEX index_name
SQL DROP TABLE 语句
DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):
DROP TABLE 表名称
SQL DROP DATABASE 语句
DROP DATABASE 语句用于删除数据库:
DROP DATABASE 数据库名称
SQL TRUNCATE TABLE 语句
假设我们只须要除去表内的数据,但并不删除表本身,那么我们该怎样做呢?
请使用 TRUNCATE TABLE 命令(只删除表格中的数据):
TRUNCATE TABLE 表名称
25:SQL ALTER TABLE 语句
ALTER TABLE 语句
ALTER TABLE 语句用于在已有的表中加入、改动或删除列。
SQL ALTER TABLE 语法
如需在表中加入列,请使用下列语法:
ALTER TABLE table_nameADD column_name datatype
要删除表中的列。请使用下列语法:
ALTER TABLE table_name DROP COLUMN column_name
凝视:某些数据库系统不同意这样的在数据库表中删除列的方式 (DROP COLUMN column_name)。
要改变表中列的数据类型,请使用下列语法:
ALTER TABLE table_nameALTER COLUMN column_name datatype
Eg:
我们希望在表 "Persons" 中加入一个名为 "Birthday" 的新列。
l ALTER TABLE PersonsADD Birthday date
如今我们希望改变 "Persons" 表中 "Birthday" 列的数据类型。
l ALTER TABLE PersonsALTER COLUMN Birthday year
请注意,"Birthday" 列的数据类型是 year,能够存放 2 位或 4 位格式的年份。
接下来。我们删除 "Person" 表中的 "Birthday" 列:
l ALTER TABLE PersonDROP COLUMN Birthday
26:SQL AUTO INCREMENT 字段
Auto-increment 会在新记录插入表中时生成一个唯一的数字。
AUTO INCREMENT 字段
我们通常希望在每次插入新记录时,自己主动地创建主键字段的值。
我们能够在表中创建一个 auto-increment 字段。
l 用于 MySQL 的语法
下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:
CREATE TABLE Persons(P_Id int NOT NULL AUTO_INCREMENT,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),PRIMARY KEY (P_Id))
MySQL 使用 AUTO_INCREMENT keyword来运行 auto-increment 任务。
默认地,AUTO_INCREMENT 的開始值是 1,每条新记录递增 1。
要让 AUTO_INCREMENT 序列以其它的值起始,请使用下列 SQL 语法:
ALTER TABLE Persons AUTO_INCREMENT=100
要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自己主动加入一个唯一的值):
INSERT INTO Persons (FirstName,LastName)VALUES ('Bill','Gates')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。
l 用于 SQL Server 的语法
下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:
CREATE TABLE Persons(P_Id int PRIMARY KEY IDENTITY,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
MS SQL 使用 IDENTITY keyword来运行 auto-increment 任务。
默认地,IDENTITY 的開始值是 1。每条新记录递增 1。
要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10)
要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自己主动加入一个唯一的值):
INSERT INTO Persons (FirstName,LastName)VALUES ('Bill','Gates')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。
"P_Id" 会被赋予一个唯一的值。
"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。
l 用于 Access 的语法
下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:
CREATE TABLE Persons(P_Id int PRIMARY KEY AUTOINCREMENT,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
MS Access 使用 AUTOINCREMENT keyword来运行 auto-increment 任务。
默认地,AUTOINCREMENT 的開始值是 1,每条新记录递增 1。
要规定 "P_Id" 列以 20 起始且递增 10,请把 autoincrement 改为 AUTOINCREMENT(20,10)
要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自己主动加入一个唯一的值):
INSERT INTO Persons (FirstName,LastName)VALUES ('Bill','Gates')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。
"P_Id" 会被赋予一个唯一的值。
"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。
l 用于 Oracle 的语法
在 Oracle 中,代码略微复杂一点。
您必须通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。
请使用以下的 CREATE SEQUENCE 语法:
CREATE SEQUENCE seq_personMINVALUE 1START WITH 1INCREMENT BY 1CACHE 10
上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增。
该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高訪问速度要存储多少个序列值。
要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):
INSERT INTO Persons (P_Id,FirstName,LastName)VALUES (seq_person.nextval,'Lars','Monsen')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 的赋值是来自 seq_person 序列的下一个数字。
"FirstName" 会被设置为 "Bill"。"LastName" 列会被设置为 "Gates"。
27:SQL VIEW(视图)
视图是可视化的表。
SQL CREATE VIEW 语句
什么是视图?
在 SQL 中。视图是基于 SQL 语句的结果集的可视化的表。
视图包括行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
我们能够向视图加入 SQL 函数、WHERE 以及 JOIN 语句,我们也能够提交数据,就像这些来自于某个单一的表。
凝视:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
SQL CREATE VIEW 语法
CREATE VIEW view_name ASSELECT column_name(s)FROM table_nameWHERE condition
凝视:视图总是显示近期的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
SQL CREATE VIEW 实例
能够从某个查询内部、某个存储过程内部,或者从还有一个视图内部来使用视图。通过向视图加入函数、join 等等。我们能够向用户精确地提交我们希望提交的数据。
样本数据库 Northwind 拥有一些被默认安装的视图。
视图 "Current Product List" 会从 Products 表列出全部正在使用的产品。这个视图使用下列 SQL 创建:
CREATE VIEW [Current Product List] ASSELECT ProductID,ProductNameFROM ProductsWHERE Discontinued=No
我们能够查询上面这个视图:
SELECT * FROM [Current Product List]
Northwind 样本数据库的还有一个视图会选取 Products 表中全部单位价格高于平均单位价格的产品:
CREATE VIEW [Products Above Average Price] ASSELECT ProductName,UnitPriceFROM ProductsWHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
我们能够像这样查询上面这个视图:
SELECT * FROM [Products Above Average Price]
还有一个来自 Northwind 数据库的视图实例会计算在 1997 年每一个种类的销售总数。
请注意。这个视图会从还有一个名为 "Product Sales for 1997" 的视图那里选取数据:
CREATE VIEW [Category Sales For 1997] ASSELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySalesFROM [Product Sales for 1997]GROUP BY CategoryName
我们能够像这样查询上面这个视图:
SELECT * FROM [Category Sales For 1997]
我们也能够向查询加入条件。如今,我们只须要查看 "Beverages" 类的所有销量:
SELECT * FROM [Category Sales For 1997]WHERE CategoryName='Beverages'
SQL 更新视图
您能够使用以下的语法来更新视图:
SQL CREATE OR REPLACE VIEW SyntaxCREATE OR REPLACE VIEW view_name ASSELECT column_name(s)FROM table_nameWHERE condition
如今,我们希望向 "Current Product List" 视图加入 "Category" 列。我们将通过下列 SQL 更新视图:
CREATE VIEW [Current Product List] ASSELECT ProductID,ProductName,CategoryFROM ProductsWHERE Discontinued=No
SQL 撤销视图
您能够通过 DROP VIEW 命令来删除视图。
SQL DROP VIEW SyntaxDROP VIEW view_name
28:SQL Date 函数
当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
仅仅要数据包括的仅仅是日期部分,执行查询就不会出问题。可是,假设涉及时间。情况就有点复杂了。
MySQL Date 函数
以下的表格列出了 MySQL 中最重要的内建日期函数:
函数 |
描写叙述 |
返回当前的日期和时间 |
|
返回当前的日期 |
|
返回当前的时间 |
|
提取日期或日期/时间表达式的日期部分 |
|
返回日期/时间按的单独部分 |
|
给日期加入指定的时间间隔 |
|
从日期减去指定的时间间隔 |
|
返回两个日期之间的天数 |
|
用不同的格式显示日期/时间 |
SQL Server Date 函数
以下的表格列出了 SQL Server 中最重要的内建日期函数:
函数 |
描写叙述 |
返回当前日期和时间 |
|
返回日期/时间的单独部分 |
|
在日期中加入或减去指定的时间间隔 |
|
返回两个日期之间的时间 |
|
用不同的格式显示日期/时间 |
SQL Date 数据类型
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
· DATE - 格式 YYYY-MM-DD
· DATETIME - 格式: YYYY-MM-DD HH:MM:SS
· TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
· YEAR - 格式 YYYY 或 YY
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
· DATE - 格式 YYYY-MM-DD
· DATETIME - 格式: YYYY-MM-DD HH:MM:SS
· SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
· TIMESTAMP - 格式: 唯一的数字
SQL 日期处理
假设不涉及时间部分,那么我们能够轻松地比較两个日期!
如果我们有以下这个 "Orders" 表:
OrderId |
ProductName |
OrderDate |
1 |
computer |
2008-12-26 |
2 |
printer |
2008-12-26 |
3 |
electrograph |
2008-11-12 |
4 |
telephone |
2008-10-19 |
如今,我们希望从上表中选取 OrderDate 为 "2008-12-26" 的记录。
我们使用例如以下 SELECT 语句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
结果集:
OrderId |
ProductName |
OrderDate |
1 |
computer |
2008-12-26 |
3 |
electrograph |
2008-12-26 |
如今如果 "Orders" 类似这样(请注意 "OrderDate" 列中的时间部分):
OrderId |
ProductName |
OrderDate |
1 |
computer |
2008-12-26 16:23:55 |
2 |
printer |
2008-12-26 10:45:26 |
3 |
electrograph |
2008-11-12 14:12:08 |
4 |
telephone |
2008-10-19 12:56:10 |
假设我们使用上面的 SELECT 语句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
那么我们得不到结果。这是因为该查询不含有时间部分的日期。
提示:假设您希望使查询简单且更易维护,那么请不要在日期中使用时间部分!
29:SQL NULL 值
NULL 值是遗漏的未知数据。
默认地。表的列能够存放 NULL 值。
SQL NULL 值
假设表中的某个列是可选的,那么我们能够在不向该列加入值的情况下插入新记录或更新已有的记录。
这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其它值不同。
NULL 用作未知的或不适用的值的占位符。
凝视:无法比較 NULL 和 0;它们是不等价的。
SQL 的 NULL 值处理
请看以下的 "Persons" 表:
Id |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
London |
|
2 |
Bush |
George |
Fifth Avenue |
New York |
3 |
Carter |
Thomas |
Beijing |
假如 "Persons" 表中的 "Address" 列是可选的。
这意味着假设在 "Address" 列插入一条不带值的记录,"Address" 列会使用 NULL 值保存。
那么我们怎样測试 NULL 值呢?
无法使用比較运算符来測试 NULL 值,比方 =, <, 或者 <>。
我们必须使用 IS NULL 和 IS NOT NULL 操作符。
SQL IS NULL
我们怎样只选取在 "Address" 列中带有 NULL 值的记录呢?
我们必须使用 IS NULL 操作符:
SELECT LastName,FirstName,Address FROM PersonsWHERE Address IS NULL
结果集:
LastName |
FirstName |
Address |
Adams |
John |
|
Carter |
Thomas |
提示:请始终使用 IS NULL 来查找 NULL 值。
SQL IS NOT NULL
我们怎样选取在 "Address" 列中不带有 NULL 值的记录呢?
我们必须使用 IS NOT NULL 操作符:
SELECT LastName,FirstName,Address FROM PersonsWHERE Address IS NOT NULL
结果集:
LastName |
FirstName |
Address |
Bush |
George |
Fifth Avenue |
30:SQL NULL 函数
SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
请看以下的 "Products" 表:
P_Id |
ProductName |
UnitPrice |
UnitsInStock |
UnitsOnOrder |
1 |
computer |
699 |
25 |
15 |
2 |
printer |
365 |
36 |
|
3 |
telephone |
280 |
159 |
57 |
假如 "UnitsOnOrder" 是可选的。并且能够包括 NULL 值。
我们使用例如以下 SELECT 语句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)FROM Products
在上面的样例中。假设有 "UnitsOnOrder" 值是 NULL,那么结果是 NULL。
微软的 ISNULL() 函数用于规定怎样处理 NULL 值。
NVL(), IFNULL() 和 COALESCE() 函数也能够达到同样的结果。
在这里,我们希望 NULL 值为 0。
以下,假设 "UnitsOnOrder" 是 NULL,则不利于计算,因此假设值是 NULL 则 ISNULL() 返回 0。
SQL Server / MS Access
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))FROM Products
Oracle
Oracle 没有 ISNULL() 函数。
只是。我们能够使用 NVL() 函数达到同样的结果:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))FROM Products
MySQL
MySQL 也拥有类似 ISNULL() 的函数。
只是它的工作方式与微软的 ISNULL() 函数有点不同。
在 MySQL 中。我们能够使用 IFNULL() 函数。就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))FROM Products
或者我们能够使用 COALESCE() 函数,就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))FROM Products
31:SQL 数据类型
Microsoft Access、MySQL 以及 SQL Server 所使用的数据类型和范围。
Microsoft Access 数据类型
数据类型 |
描写叙述 |
存储 |
Text |
用于文本或文本与数字的组合。 最多 255 个字符。 |
|
Memo |
Memo 用于更大数量的文本。 最多存储 65,536 个字符。 凝视:无法对 memo 字段进行排序。只是它们是可搜索的。 |
|
Byte |
同意 0 到 255 的数字。 |
1 字节 |
Integer |
同意介于 -32,768 到 32,767 之间的数字。 |
2 字节 |
Long |
同意介于 -2,147,483,648 与 2,147,483,647 之间的所有数字 |
4 字节 |
Single |
单精度浮点。处理大多数小数。 |
4 字节 |
Double |
双精度浮点。处理大多数小数。 |
8 字节 |
Currency |
用于货币。支持 15 位的元。外加 4 位小数。 提示:您能够选择使用哪个国家的货币。 |
8 字节 |
AutoNumber |
AutoNumber 字段自己主动为每条记录分配数字。通常从 1 開始。 |
4 字节 |
Date/Time |
用于日期和时间 |
8 字节 |
Yes/No |
逻辑字段。能够显示为 Yes/No、True/False 或 On/Off。 在代码中,使用常量 True 和 False (等价于 1 和 0) 凝视:Yes/No 字段中不同意 Null 值 |
1 比特 |
Ole Object |
能够存储图片、音频、视频或其它 BLOBs (Binary Large OBjects) |
最多 1GB |
Hyperlink |
包括指向其它文件的链接。包括网页。 |
|
Lookup Wizard |
同意你创建一个可从下列列表中进行选择的选项列表。 |
4 字节 |
MySQL 数据类型
在 MySQL 中。有三种基本的类型:文本、数字和日期/时间类型。
Text 类型:
数据类型 |
描写叙述 |
CHAR(size) |
保存固定长度的字符串(可包括字母、数字以及特殊字符)。在括号里指定字符串的长度。 最多 255 个字符。 |
VARCHAR(size) |
保存可变长度的字符串(可包括字母、数字以及特殊字符)。 在括号里指定字符串的最大长度。 最多 255 个字符。 凝视:假设值的长度大于 255,则被转换为 TEXT 类型。 |
TINYTEXT |
存放最大长度为 255 个字符的字符串。 |
TEXT |
存放最大长度为 65,535 个字符的字符串。 |
BLOB |
用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。 |
MEDIUMTEXT |
存放最大长度为 16,777,215 个字符的字符串。 |
MEDIUMBLOB |
用于 BLOBs (Binary Large OBjects)。 存放最多 16,777,215 字节的数据。 |
LONGTEXT |
存放最大长度为 4,294,967,295 个字符的字符串。 |
LONGBLOB |
用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。 |
ENUM(x,y,z,etc.) |
同意你输入可能值的列表。能够在 ENUM 列表中列出最大 65535 个值。假设列表中不存在插入的值,则插入空值。 凝视:这些值是依照你输入的顺序存储的。 能够依照此格式输入可能的值:ENUM('X','Y','Z') |
SET |
与 ENUM 类似,SET 最多仅仅能包括 64 个列表项,只是 SET 可存储一个以上的值。 |
Number 类型:
数据类型 |
描写叙述 |
TINYINT(size) |
-128 到 127 常规。 0 到 255 无符号*。在括号里规定最大位数。 |
SMALLINT(size) |
-32768 到 32767 常规。0 到 65535 无符号*。在括号里规定最大位数。 |
MEDIUMINT(size) |
-8388608 到 8388607 普通。 0 to 16777215 无符号*。 在括号里规定最大位数。 |
INT(size) |
-2147483648 到 2147483647 常规。 0 到 4294967295 无符号*。在括号里规定最大位数。 |
BIGINT(size) |
-9223372036854775808 到 9223372036854775807 常规。 0 到 18446744073709551615 无符号*。 在括号里规定最大位数。 |
FLOAT(size,d) |
带有浮动小数点的小数字。在括号里规定最大位数。在 d 參数中规定小数点右側的最大位数。 |
DOUBLE(size,d) |
带有浮动小数点的大数字。在括号里规定最大位数。 在 d 參数中规定小数点右側的最大位数。 |
DECIMAL(size,d) |
作为字符串存储的 DOUBLE 类型。同意固定的小数点。 |
* 这些整数类型拥有额外的选项 UNSIGNED。通常。整数能够是负数或正数。假设加入 UNSIGNED 属性,那么范围将从 0 開始,而不是某个负数。
Date 类型:
数据类型 |
描写叙述 |
DATE() |
日期。 格式:YYYY-MM-DD 凝视:支持的范围是从 '1000-01-01' 到 '9999-12-31' |
DATETIME() |
*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS 凝视:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' |
TIMESTAMP() |
*时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描写叙述来存储。格式:YYYY-MM-DD HH:MM:SS 凝视:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC |
TIME() |
时间。格式:HH:MM:SS 凝视:支持的范围是从 '-838:59:59' 到 '838:59:59' |
YEAR() |
2 位或 4 位格式的年。 凝视:4 位格式所同意的值:1901 到 2155。 2 位格式所同意的值:70 到 69,表示从 1970 到 2069。 |
* 即便 DATETIME 和 TIMESTAMP 返回同样的格式,它们的工作方式非常不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自己主动把自身设置为当前的日期和时间。
TIMESTAMP 也接受不同的格式。比方 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。
SQL Server 数据类型
Character 字符串:
数据类型 |
描写叙述 |
存储 |
char(n) |
固定长度的字符串。 最多 8,000 个字符。 |
n |
varchar(n) |
可变长度的字符串。最多 8,000 个字符。 |
|
varchar(max) |
可变长度的字符串。最多 1,073,741,824 个字符。 |
|
text |
可变长度的字符串。最多 2GB 字符数据。 |
Unicode 字符串:
数据类型 |
描写叙述 |
存储 |
nchar(n) |
固定长度的 Unicode 数据。 最多 4,000 个字符。 |
|
nvarchar(n) |
可变长度的 Unicode 数据。最多 4,000 个字符。 |
|
nvarchar(max) |
可变长度的 Unicode 数据。 最多 536,870,912 个字符。 |
|
ntext |
可变长度的 Unicode 数据。最多 2GB 字符数据。 |
Binary 类型:
数据类型 |
描写叙述 |
存储 |
bit |
同意 0、1 或 NULL |
|
binary(n) |
固定长度的二进制数据。最多 8,000 字节。 |
|
varbinary(n) |
可变长度的二进制数据。 最多 8,000 字节。 |
|
varbinary(max) |
可变长度的二进制数据。最多 2GB 字节。 |
|
image |
可变长度的二进制数据。最多 2GB。 |
Number 类型:
数据类型 |
描写叙述 |
存储 |
tinyint |
同意从 0 到 255 的全部数字。 |
1 字节 |
smallint |
同意从 -32,768 到 32,767 的全部数字。 |
2 字节 |
int |
同意从 -2,147,483,648 到 2,147,483,647 的全部数字。 |
4 字节 |
bigint |
同意介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的全部数字。 |
8 字节 |
decimal(p,s) |
固定精度和比例的数字。 同意从 -10^38 +1 到 10^38 -1 之间的数字。 p 參数指示能够存储的最大位数(小数点左側和右側)。 p 必须是 1 到 38 之间的值。默认是 18。 s 參数指示小数点右側存储的最大位数。s 必须是 0 到 p 之间的值。 默认是 0。 |
5-17 字节 |
numeric(p,s) |
固定精度和比例的数字。同意从 -10^38 +1 到 10^38 -1 之间的数字。 p 參数指示能够存储的最大位数(小数点左側和右側)。 p 必须是 1 到 38 之间的值。 默认是 18。 s 參数指示小数点右側存储的最大位数。 s 必须是 0 到 p 之间的值。 默认是 0。 |
5-17 字节 |
smallmoney |
介于 -214,748.3648 和 214,748.3647 之间的货币数据。 |
4 字节 |
money |
介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。 |
8 字节 |
float(n) |
从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 參数 n 指示该字段保存 4 字节还是 8 字节。 float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 |
4 或 8 字节 |
real |
从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 |
4 字节 |
Date 类型:
数据类型 |
描写叙述 |
存储 |
datetime |
从 1753 年 1 月 1 日 到 9999 年 12 月 31 日。精度为 3.33 毫秒。 |
8 bytes |
datetime2 |
从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 |
6-8 bytes |
smalldatetime |
从 1900 年 1 月 1 日 到 2079 年 6 月 6 日。精度为 1 分钟。 |
4 bytes |
date |
仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 |
3 bytes |
time |
仅存储时间。精度为 100 纳秒。 |
3-5 bytes |
datetimeoffset |
与 datetime2 同样。外加时区偏移。 |
8-10 bytes |
timestamp |
存储唯一的数字,每当创建或改动某行时,该数字会更新。timestamp 基于内部时钟,不正确应真实时间。 每一个表仅仅能有一个 timestamp 变量。 |
其它数据类型:
数据类型 |
描写叙述 |
sql_variant |
存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。 |
uniqueidentifier |
存储全局标识符 (GUID)。 |
xml |
存储 XML 格式化数据。 最多 2GB。 |
cursor |
存储对用于数据库操作的指针的引用。 |
table |
存储结果集。供稍后处理。 |
Sql 函数
SQL 拥有非常多可用于计数和计算的内建函数。
31:函数的语法
内建 SQL 函数的语法是:
SELECT function(列) FROM 表
函数的类型
在 SQL 中,主要的函数类型和种类有若干种。函数的基本类型是:
· Aggregate 函数
· Scalar 函数
合计函数(Aggregate functions)
Aggregate 函数的操作面向一系列的值,并返回一个单一的值。
凝视:假设在 SELECT 语句的项目列表中的众多其他表达式中使用 SELECT 语句,则这个 SELECT 必须使用 GROUP BY 语句!
"Persons" table (在大部分的样例中使用过)
Name |
Age |
Adams, John |
38 |
Bush, George |
33 |
Carter, Thomas |
28 |
MS Access 中的合计函数
函数 |
描写叙述 |
返回某列的平均值 |
|
返回某列的行数(不包含 NULL 值) |
|
返回被选行数 |
|
FIRST(column) |
返回在指定的域中第一个记录的值 |
LAST(column) |
返回在指定的域中最后一个记录的值 |
返回某列的最高值 |
|
返回某列的最低值 |
|
STDEV(column) |
|
STDEVP(column) |
|
返回某列的总和 |
|
VAR(column) |
|
VARP(column) |
在 SQL Server 中的合计函数
函数 |
描写叙述 |
返回某列的平均值 |
|
BINARY_CHECKSUM |
|
CHECKSUM |
|
CHECKSUM_AGG |
|
返回某列的行数(不包含NULL值) |
|
返回被选行数 |
|
返回相异结果的数目 |
|
返回在指定的域中第一个记录的值(SQLServer2000 不支持) |
|
返回在指定的域中最后一个记录的值(SQLServer2000 不支持) |
|
返回某列的最高值 |
|
返回某列的最低值 |
|
STDEV(column) |
|
STDEVP(column) |
|
返回某列的总和 |
|
VAR(column) |
|
VARP(column) |
Scalar 函数
Scalar 函数的操作面向某个单一的值,并返回基于输入值的一个单一的值。
MS Access 中的 Scalar 函数
函数 |
描写叙述 |
UCASE(c) |
将某个域转换为大写 |
LCASE(c) |
将某个域转换为小写 |
MID(c,start[,end]) |
从某个文本域提取字符 |
LEN(c) |
返回某个文本域的长度 |
INSTR(c,char) |
返回在某个文本域中指定字符的数值位置 |
LEFT(c,number_of_char) |
返回某个被请求的文本域的左側部分 |
RIGHT(c,number_of_char) |
返回某个被请求的文本域的右側部分 |
ROUND(c,decimals) |
对某个数值域进行指定小数位数的四舍五入 |
MOD(x,y) |
返回除法操作的余数 |
NOW() |
返回当前的系统日期 |
FORMAT(c,format) |
改变某个域的显示方式 |
DATEDIFF(d,date1,date2) |
用于运行日期计算 |
32:SQL AVG 函数
定义和使用方法
AVG 函数返回数值列的平均值。NULL 值不包含在计算中。
SQL AVG() 语法
SELECT AVG(column_name) FROM table_name
SQL AVG() 实例
我们拥有以下这个 "Orders" 表:
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 |
样例 1
如今。我们希望计算 "OrderPrice" 字段的平均值。
我们使用例如以下 SQL 语句:
SELECT AVG(OrderPrice) AS OrderAverage FROM Orders
结果集类似这样:
OrderAverage |
950 |
样例 2
如今。我们希望找到 OrderPrice 值高于 OrderPrice 平均值的客户。
我们使用例如以下 SQL 语句:
SELECT Customer FROM OrdersWHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
结果集类似这样:
Customer |
Bush |
Carter |
Adams |
33:SQL COUNT() 函数
COUNT() 函数返回匹配指定条件的行数。
SQL COUNT() 语法
SQL COUNT(column_name) 语法
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT(column_name) FROM table_name
SQL COUNT(*) 语法
COUNT(*) 函数返回表中的记录数:
SELECT COUNT(*) FROM table_name
SQL COUNT(DISTINCT column_name) 语法
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:
SELECT COUNT(DISTINCT column_name) FROM table_name
凝视:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,可是无法用于 Microsoft Access。
SQL COUNT(column_name) 实例
我们拥有下列 "Orders" 表:
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 |
如今,我们希望计算客户 "Carter" 的订单数。
我们使用例如以下 SQL 语句:
SELECT COUNT(Customer) AS CustomerNilsen FROM OrdersWHERE Customer='Carter'
以上 SQL 语句的结果是 2,由于客户 Carter 共同拥有 2 个订单:
CustomerNilsen |
2 |
SQL COUNT(*) 实例
假设我们省略 WHERE 子句。比方这样:
SELECT COUNT(*) AS NumberOfOrders FROM Orders
结果集类似这样:
NumberOfOrders |
6 |
这是表中的总行数。
SQL COUNT(DISTINCT column_name) 实例
如今。我们希望计算 "Orders" 表中不同客户的数目。
我们使用例如以下 SQL 语句:
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders
结果集类似这样:
NumberOfCustomers |
3 |
这是 "Orders" 表中不同客户(Bush, Carter 和 Adams)的数目。
34:SQL FIRST() 函数
FIRST() 函数
FIRST() 函数返回指定的字段中第一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
SQL FIRST() 语法
SELECT FIRST(column_name) FROM table_name
SQL FIRST() 实例
我们拥有以下这个 "Orders" 表:
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 |
如今,我们希望查找 "OrderPrice" 列的第一个值。
我们使用例如以下 SQL 语句:
SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders
结果集类似这样:
FirstOrderPrice |
1000 |
35:SQL LAST() 函数
LAST() 函数
LAST() 函数返回指定的字段中最后一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
SQL LAST() 语法
SELECT LAST(column_name) FROM table_name
SQL LAST() 实例
我们拥有以下这个 "Orders" 表:
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 |
如今,我们希望查找 "OrderPrice" 列的最后一个值。
我们使用例如以下 SQL 语句:
SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders
结果集类似这样:
LastOrderPrice |
100 |
36:SQL MAX() 函数
MAX() 函数
MAX 函数返回一列中的最大值。NULL 值不包含在计算中。
SQL MAX() 语法
SELECT MAX(column_name) FROM table_name
凝视:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
SQL MAX() 实例
我们拥有以下这个 "Orders" 表:
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 |
如今,我们希望查找 "OrderPrice" 列的最大值。
我们使用例如以下 SQL 语句:
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
结果集类似这样:
LargestOrderPrice |
2000 |
37:SQL MIN() 函数
MIN() 函数
MIN 函数返回一列中的最小值。NULL 值不包含在计算中。
SQL MIN() 语法
SELECT MIN(column_name) FROM table_name
凝视:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
SQL MIN() 实例
我们拥有以下这个 "Orders" 表:
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 |
如今,我们希望查找 "OrderPrice" 列的最小值。
我们使用例如以下 SQL 语句:
SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders
结果集类似这样:
SmallestOrderPrice |
100 |
38:SQL SUM() 函数
SUM() 函数
SUM 函数返回数值列的总数(总额)。
SQL SUM() 语法
SELECT SUM(column_name) FROM table_name
SQL SUM() 实例
我们拥有以下这个 "Orders" 表:
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 |
如今。我们希望查找 "OrderPrice" 字段的总数。
我们使用例如以下 SQL 语句:
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
结果集类似这样:
OrderTotal |
5700 |
39:SQL GROUP BY 语句
合计函数 (比方 SUM) 经常须要加入 GROUP BY 语句。
GROUP BY 语句
GROUP BY 语句用于结合合计函数,依据一个或多个列对结果集进行分组。
SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name)FROM table_nameWHERE column_name operator valueGROUP BY column_name
SQL GROUP BY 实例
我们拥有以下这个 "Orders" 表:
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 OrdersGROUP BY Customer
结果集类似这样:
Customer |
SUM(OrderPrice) |
Bush |
2000 |
Carter |
1700 |
Adams |
2000 |
非常棒吧。对不正确?
让我们看一下假设省略 GROUP BY 会出现什么情况:
SELECT Customer,SUM(OrderPrice) FROM Orders
结果集类似这样:
Customer |
SUM(OrderPrice) |
Bush |
5700 |
Carter |
5700 |
Bush |
5700 |
Bush |
5700 |
Adams |
5700 |
Carter |
5700 |
上面的结果集不是我们须要的。
那么为什么不能使用上面这条 SELECT 语句呢?解释例如以下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。"SUM(OrderPrice)" 返回一个单独的值("OrderPrice" 列的总计)。而 "Customer" 返回 6 个值(每一个值相应 "Orders" 表中的每一行)。因此,我们得不到正确的结果。只是,您已经看到了,GROUP BY 语句攻克了这个问题。
GROUP BY 一个以上的列
我们也能够对一个以上的列应用 GROUP BY 语句。就像这样:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM OrdersGROUP BY Customer,OrderDate
40:SQL HAVING 子句
HAVING 子句
在 SQL 中添加 HAVING 子句原因是。WHERE keyword无法与合计函数一起使用。
SQL HAVING 语法
SELECT column_name, aggregate_function(column_name)FROM table_nameWHERE column_name operator valueGROUP BY column_nameHAVING aggregate_function(column_name) operator value
SQL HAVING 实例
我们拥有以下这个 "Orders" 表:
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 |
如今,我们希望查找订单总金额少于 2000 的客户。
我们使用例如以下 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM OrdersGROUP BY CustomerHAVING SUM(OrderPrice)<2000
结果集类似:
Customer |
SUM(OrderPrice) |
Carter |
1700 |
如今我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。
我们在 SQL 语句中添加了一个普通的 WHERE 子句:
SELECT Customer,SUM(OrderPrice) FROM OrdersWHERE Customer='Bush' OR Customer='Adams'GROUP BY CustomerHAVING SUM(OrderPrice)>1500
结果集:
Customer |
SUM(OrderPrice) |
Bush |
2000 |
Adams |
2000 |
41:SQL UCASE() 函数
UCASE() 函数
UCASE 函数把字段的值转换为大写。
SQL UCASE() 语法
SELECT UCASE(column_name) FROM table_name
SQL UCASE() 实例
我们拥有以下这个 "Persons" 表:
Id |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
Oxford Street |
London |
2 |
Bush |
George |
Fifth Avenue |
New York |
3 |
Carter |
Thomas |
Changan Street |
Beijing |
如今。我们希望选取 "LastName" 和 "FirstName" 列的内容。然后把 "LastName" 列转换为大写。
我们使用例如以下 SQL 语句:
SELECT UCASE(LastName) as LastName,FirstName FROM Persons
结果集类似这样:
LastName |
FirstName |
ADAMS |
John |
BUSH |
George |
CARTER |
Thomas |
42:SQL LCASE() 函数
LCASE() 函数
LCASE 函数把字段的值转换为小写。
SQL LCASE() 语法
SELECT LCASE(column_name) FROM table_name
SQL LCASE() 实例
我们拥有以下这个 "Persons" 表:
Id |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
Oxford Street |
London |
2 |
Bush |
George |
Fifth Avenue |
New York |
3 |
Carter |
Thomas |
Changan Street |
Beijing |
如今,我们希望选取 "LastName" 和 "FirstName" 列的内容。然后把 "LastName" 列转换为小写。
我们使用例如以下 SQL 语句:
SELECT LCASE(LastName) as LastName,FirstName FROM Persons
结果集类似这样:
LastName |
FirstName |
adams |
John |
bush |
George |
carter |
Thomas |
43:SQL MID() 函数
MID() 函数
MID 函数用于从文本字段中提取字符。
SQL MID() 语法
SELECT MID(column_name,start[,length]) FROM table_name
參数 |
描写叙述 |
column_name |
必需。要提取字符的字段。 |
start |
必需。 规定開始位置(起始值是 1)。 |
length |
可选。 要返回的字符数。 假设省略。则 MID() 函数返回剩余文本。 |
SQL MID() 实例
我们拥有以下这个 "Persons" 表:
Id |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
Oxford Street |
London |
2 |
Bush |
George |
Fifth Avenue |
New York |
3 |
Carter |
Thomas |
Changan Street |
Beijing |
如今,我们希望从 "City" 列中提取前 3 个字符。
我们使用例如以下 SQL 语句:
SELECT MID(City,1,3) as SmallCity FROM Persons
结果集类似这样:
SmallCity |
Lon |
New |
Bei |
44:SQL LEN() 函数
LEN() 函数
LEN 函数返回文本字段中值的长度。
SQL LEN() 语法
SELECT LEN(column_name) FROM table_name
SQL LEN() 实例
我们拥有以下这个 "Persons" 表:
Id |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
Oxford Street |
London |
2 |
Bush |
George |
Fifth Avenue |
New York |
3 |
Carter |
Thomas |
Changan Street |
Beijing |
如今,我们希望取得 "City" 列中值的长度。
我们使用例如以下 SQL 语句:
SELECT LEN(City) as LengthOfCity FROM Persons
结果集类似这样:
LengthOfCity |
6 |
8 |
7 |
45:SQL ROUND() 函数
ROUND() 函数
ROUND 函数用于把数值字段舍入为指定的小数位数。
SQL ROUND() 语法
SELECT ROUND(column_name,decimals) FROM table_name
參数 |
描写叙述 |
column_name |
必需。要舍入的字段。 |
decimals |
必需。 规定要返回的小数位数。 |
SQL ROUND() 实例
我们拥有以下这个 "Products" 表:
Prod_Id |
ProductName |
Unit |
UnitPrice |
1 |
gold |
1000 g |
32.35 |
2 |
silver |
1000 g |
11.56 |
3 |
copper |
1000 g |
6.85 |
如今,我们希望把名称和价格舍入为最接近的整数。
我们使用例如以下 SQL 语句:
SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products
结果集类似这样:
ProductName |
UnitPrice |
gold |
32 |
silver |
12 |
copper |
7 |
45:SQL NOW() 函数
NOW() 函数
NOW 函数返回当前的日期和时间。
提示:假设您在使用 Sql Server 数据库,请使用 getdate() 函数来获得当前的日期时间。
SQL NOW() 语法
SELECT NOW() FROM table_name
SQL NOW() 实例
我们拥有以下这个 "Products" 表:
Prod_Id |
ProductName |
Unit |
UnitPrice |
1 |
gold |
1000 g |
32.35 |
2 |
silver |
1000 g |
11.56 |
3 |
copper |
1000 g |
6.85 |
如今,我们希望显示当天的日期所相应的名称和价格。
我们使用例如以下 SQL 语句:
SELECT ProductName, UnitPrice, Now() as PerDate FROM Products
结果集类似这样:
ProductName |
UnitPrice |
PerDate |
gold |
32.35 |
12/29/2008 11:36:05 AM |
silver |
11.56 |
12/29/2008 11:36:05 AM |
copper |
6.85 |
12/29/2008 11:36:05 A |
46:SQL FORMAT() 函数
· SQL 高速參考
FORMAT() 函数
FORMAT 函数用于对字段的显示进行格式化。
SQL FORMAT() 语法
SELECT FORMAT(column_name,format) FROM table_name
參数 |
描写叙述 |
column_name |
必需。 要格式化的字段。 |
format |
必需。规定格式。 |
SQL FORMAT() 实例
我们拥有以下这个 "Products" 表:
Prod_Id |
ProductName |
Unit |
UnitPrice |
1 |
gold |
1000 g |
32.35 |
2 |
silver |
1000 g |
11.56 |
3 |
copper |
1000 g |
6.85 |
如今,我们希望显示每天日期所相应的名称和价格(日期的显示格式是 "YYYY-MM-DD")。
我们使用例如以下 SQL 语句:
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDateFROM Products
结果集类似这样:
ProductName |
UnitPrice |
PerDate |
gold |
32.35 |
12/29/2008 |
silver |
11.56 |
12/29/2008 |
copper |
6.85 |
12/29/2008 |
47:SQL 高速參考
· SQL 教程总结
来自 W3School 的 SQL 高速參考。
能够打印它,以备日常使用。
SQL 语句
语句 |
语法 |
AND / OR |
SELECT column_name(s) |
ALTER TABLE (add column) |
ALTER TABLE table_name |
ALTER TABLE (drop column) |
ALTER TABLE table_name |
AS (alias for column) |
SELECT column_name AS column_alias |
AS (alias for table) |
SELECT column_name |
BETWEEN |
SELECT column_name(s) |
CREATE DATABASE |
CREATE DATABASE database_name |
CREATE INDEX |
CREATE INDEX index_name |
CREATE TABLE |
CREATE TABLE table_name |
CREATE UNIQUE INDEX |
CREATE UNIQUE INDEX index_name |
CREATE VIEW |
CREATE VIEW view_name AS |
DELETE FROM |
DELETE FROM table_name or DELETE FROM table_name |
DROP DATABASE |
DROP DATABASE database_name |
DROP INDEX |
DROP INDEX table_name.index_name |
DROP TABLE |
DROP TABLE table_name |
GROUP BY |
SELECT column_name1,SUM(column_name2) |
HAVING |
SELECT column_name1,SUM(column_name2) |
IN |
SELECT column_name(s) |
INSERT INTO |
INSERT INTO table_name or INSERT INTO table_name |
LIKE |
SELECT column_name(s) |
ORDER BY |
SELECT column_name(s) |
SELECT |
SELECT column_name(s) |
SELECT * |
SELECT * |
SELECT DISTINCT |
SELECT DISTINCT column_name(s) |
SELECT INTO |
SELECT * or SELECT column_name(s) |
TRUNCATE TABLE |
TRUNCATE TABLE table_name |
UPDATE |
UPDATE table_name |
WHERE |
SELECT column_name(s) |
版权声明:本文博主原创文章。博客,未经同意不得转载。
sql 学习笔记 档的更多相关文章
- ORALCE PL/SQL学习笔记
ORALCE PL/SQL学习笔记 详情见自己电脑的备份数据资料
- Oracle之PL/SQL学习笔记
自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...
- SQL学习笔记
SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...
- [SQL学习笔记][用exists代替全称量词 ]
学习sql的必经问题. 学生表student (id学号 Sname姓名 Sdept所在系) 课程表Course (crscode课程号 name课程名) 学生选课表transcript (studi ...
- SQL学习笔记——SQL初入门,Ubuntu下MySQL的安装
刚开始接触sql,于是准备在Ubuntu下学习sql,就跟着itercast的sql教程开始入门了. 下面只是我个人的记录,高手请绕道: 一. 在安装之前,我们可以用下面这个命令通过开放端 ...
- pl/sql学习笔记---马士兵教程38-48
Procedure Language/Structure query Language 一.关于语言学习 1.数据类型 2.语法 通过例子来学习很快就能明白 set serverputout on ...
- SQL学习笔记之项目中常用的19条MySQL优化
在写文章之前,首先感谢 飞友科技 陆老师提供的文档.. 声明一下:下面的优化方案都是基于 “ Mysql-索引-BTree类型 ” 的 0x00 EXPLAIN 做MySQL优化,我们要善用 EXPL ...
- SQL学习笔记之SQL查询练习题1
(网络搜集) 0x00 表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id ...
- SQL学习笔记之MySQL索引知识点
0x00 概述 之前写过一篇Mysql B+树学习,简单的介绍了B+数以及MySql使用B+树的原因, 有了这些基础知识点,对MySql索引的类型以及索引使用的一些技巧,就比较容易理解了. 0x01 ...
随机推荐
- 搭建ganglia集群而且监视hadoop CDH4.6
前言 近期在研究云监控的相关工具,感觉ganglia颇有亮点,能从一个集群总体的角度来展现数据. 但是安装过程稍过复杂,相关依赖稍多,故写此文章与大家分享下. 本文不解说相关原理,若想了解请參考其它资 ...
- HTML 5最终确定,八年后,我们再谈谈如何改变世界
从原:http://www.36kr.com/p/216655.html 我们第一次谈论HTML5要改变世界大概是由于乔布斯,他坚持在iOS上不兼容Flash,在Adobe统治多媒体开发的那个年代.这 ...
- 项目构建之maven篇:2.HelloWorld项目构建过程
文件结构说明: 项目构建生命周期: 清理 编译 測试 打包 执行 部署 清理与编译 hello\pom.xml POM:Project Object Model,项目对象模型 pom.xml与ant的 ...
- Oracle外键(Foreign Key)使用详细的说明(一)
Oracle外键(Foreign Key)使用详细的说明(一) 1.目标 演示如何Oracle使用外键数据库 2.什么是外键? 1)在Oracle数据库中,外键是用来实现參照完整性的方法之中的一个.打 ...
- Eclipse with C++: "Launch failed. Binary not found."
Eclipse with C++: "Launch failed. Binary not found." (windows 7) 用Eclipse创建一个Hello world ...
- 解决Ubuntu和Windows该文件乱码问题
1.转换文件内容编码 Windows在自然纯文本文件.当中国作为编码GBK,在Ubuntu下乱码,可以使用iconv命令转换: iconv -f gbk -t utf8 source_fi ...
- 超人学院Hadoop大数据资源共享
超人学院Hadoop大数据资源共享-----数据结构与算法(java解密版) http://yunpan.cn/cw5avckz8fByJ 訪问password b0f8 很多其它精彩内容请关注: ...
- 令人无限遐想的各种PCIe加速板卡
声明 本文不涉及不论什么特定API,也不针对不论什么特定的厂商,可是仍然值得透露一点的是,某些加速板卡厂商的成功点和失败点恰恰都是在于其通用性,在这个人们依旧依赖专业板卡的时代,依旧将板卡视为解决专业 ...
- win32加载图片获得像素值
在写光栅渲染器时,需要加载图片获得像素以便进行纹理插值,试了几种方法发现下面这种比价简单,效率也可以接受 Texture2D是我自己定义的类,其中m_pixelBuffer是一个动态二维数组,每个元素 ...
- js阻止冒泡
js阻止冒泡 (ev || event).cancelBubble = true; 标签切换 <script type="text/javascript"> windo ...