【SQL高级教程】数据库学习笔记

1、SQL TOP子句

由于规定要返回的记录的数目
   SELECT TOP number percent column_name(s) (列的名字)FROM table_name
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
TOP举例:返回头两条记录
   SELECT TOP 2 * FROM Persons
TOP PERCENT举例:选取50%
    SELECT TOP 50 PERCENT * FROM Persons

2、SQL LIKE 操作符

用于在where字句中搜索列中的指定模式
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
举例:
SELECT * FROM Persons  WHERE City LIKE 'N%'  以"N"开头的城市
SELECT * FROM Persons WHERE City LIKE '%g'  以"g"结尾的城市
SELECT * FROM Persons WHERE CityNOT LIKE  ' %lon% ' 包含"lon"的城市,使用NOT关键字来处理

3、SQL通配符

在搜索数据库的数据时使用。可以代替一个或多个字符,必须要和LIKE关键字一起使用。
主要有:
% 替代一个或者多个字符
- 仅替代一个字符
[charlist] 字符列中任何单一字符
[^charlist] 不在字符列中的任何单一字符
举例:
选取的这条记录的姓氏以 "C" 开头,然后是一个任意字符,然后是 "r",然后是任意字符,然后是 "er":
SELECT * FROM Persons  WHERE LastName LIKE'C_r_er'

选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:
SELECT * FROM Persons  WHERE City LIKE'[ALN]%'
SELECT * FROM Persons  WHERE City LIKE'[!ALN]%' (不以A或L或N开头)

4、SQL IN 操作符

允许我们再WHERE字句中 规定多个值,就可以得到多条结果。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
选取姓氏为 Adams 和 Carter 的人:
SELECT * FROM Persons  WHERE LastNameIN ('Adams','Carter')

5、SQL BETWEEN 操作符

选取介于两个值之间的数据范围(有的包含边界,有的不包含)

SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2(搭配NOT关键字使用)

6、SQL Alias(别名)

可以为列名称和表名称指定别名(Alias)
指定表的别名:
SELECT column_name(s)
FROM table_name
AS alias_name
指定列的别名:
SELECTcolumn_name AS alias_name
FROM table_name
使用别名,让查询程序更容易写

7、SQL JOIN

根据两个或多个表中的列之间的关系,从表中查询数据
join和key:
有时候为了得到完整的结果,需要从两个或更多的表中获取结果,就需要执行join
数据库中的表可通过键将彼此联系起来,主键是一个列,该列中每一行的值都是唯一的。

(1)引用两个表

我们可以通过引用两个表的方式,从两个表中获取数据:

谁订购了产品,并且他们订购了什么产品?

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P #(通过Id_P来将两个表连接在一起)

(2)使用Join

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
补充:
不同的SQL JOIN:
INNER JOIN(内连接)
  • JOIN: 如果表中有至少一个匹配,则返
  • INNER JOIN:内连接,只返回两表中连接字段相等的行
  • LEFT JOIN: 返回左表中所有记录及其右表中连接字段相等的记录。(即使右表中没有匹配,也从左表返回所有的行)
  • RIGHT JOIN: 返回右表中所有记录及其左表中连接字段相等的记录。即使左表中没有匹配,也从右表返回所有的行)
  • FULL JOIN: 外连接,返回两表中的行。(只要其中一个表中存在匹配,就返回行)

8、SQL INNER JOIN 关键字

在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
注意:INNER JOIN与JOIN是一样的。
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

9、SQL LEFT JOIN 关键字

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name
希望列出所有的人以及他们的订购-如果有的话。
所以用LEFT JOIN 悉数列出左表,如果右表有匹配的话,也列出。

10、SQL RIGHT JOIN 关键字

列出所有的定单,以及定购它们的人 - 如果有的话。

11、SQL FULL JOIN 关键字

列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。
会先返回所有的左表、右表的行,如果有匹配,会进一步再返回匹配的行。

12、SQL UNION 操作符

用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA

13、SQL SELECT INTO 语句

用于创建表的备份复件。

SELECT INTO 语句从一个表中选取数据(可以是所有列* 也可以是指定的列),然后把数据插入另一个表中。

SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。

举例:
制作表的备份复件                     SELECT * INTO Persons_backup FROM Persons

向另一个数据库中拷贝表          SELECT * INTO Persons IN 'Backup.mdb' FROM Persons

14、SQL CREATE DATABASE 语句

用于创建数据库
举例:创建一个名为“my_db"的数据库
CREATE DATABASE my_db

15、SQL CREATE TABLE 语句

用于创建数据库中的表
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
举例:
创建一个名为”person"的表
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
其中,
int整数
char容纳固定长度
varchar容纳可变长度
date日期

16、SQL 约束

用于限制加入表的数据的类型。
  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • DEFAULT

17、SQL NOT NULL约束

约束强制列不接受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)
)

18、SQL UNIQUE 约束

唯一标识数据库表中的每条记录

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 拥有自动定义的 UNIQUE 约束

请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

举例:
(1)创建“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)
)

(2)当表已经被创建好,要在其中一个列创建UNIQUE约束:
ALTER TABLE Persons
ADD UNIQUE (Id_P)
如果需要命名UNIQUE约束,并定义多个列的UNIQUE约束:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

撤销UNIQUE约束:
ALTER TABLE Persons
DROP INDEX uc_PersonID  (MySQL)
DROP CONSTRAINT uc_PersonID  (SQL)

19、SQL PRIMARY KEY 约束

PRIMARY KEY 约束唯一标识数据库表中的每条记录。

主键必须包含唯一的值。

主键列不能包含 NULL 值。

每个表都应该有一个主键,并且每个表只能有一个主键。


 (1)在 "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 约束:
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

(2)表已经存在,为“Id_P"列创建PRIMARY KEY约束:
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)

如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

注意:如果使用ALETR TABLE添加主键,需要把主键声明为不包含NULL值(在首次创建的时候)。

撤销PRIMARY KEY约束:
ALTER TABLE Persons
DROP PRIMARY KEY (MYSQL)
DROP CONSTRAINT pk_PersonID (SQL)

20、SQL FOREIGN KEY约束

一个表中的foreign key 指向另一个表中的 PRIMARY KEY

"Persons" 表:

Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

"Orders" 表:

Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1

请注意,"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。

"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY 主键

"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY 外键

FOREIGN KEY 约束用于预防破坏表之间连接的动作。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

(1)创建表的时候创建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 约束

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)
)

(2)表已经存在:
如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)

撤销FOREIGN KEY约束:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders (MySQL)
DROP CONSTRAINT fk_PerOrders (SQL)

21、SQL CHECK约束

用于限制列中的值的范围。
(1)"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约束:
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')
)

(2) 如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束:
ALTER TABLE Persons
ADD CHECK (Id_P>0) (MySQL)
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')  (SQL)
撤销CHECK约束:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person (SQL)
DROP CHECK chk_Person (MYSQL)

22、SQL DEFAULT约束

用于向列中插入默认值。如果没有规定其他的值,就会将默认值添加到所有的新纪录。
在表创建的时候为”city"列创建DEFAULT约束
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
如果表已存在的情况下为“city”创建DEFAULT约束
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES' (MySQL)
ALTER COLUMN City SET DEFAULT 'SANDNES'(SQL)

撤销:
ALTER TABLE Persons
ALTER City DROP DEFAULT (Mysql)
ALTER CULUMN City DROP DEFAULT (sql)

23、SQL CREATE INDEX语句

用于在表中创建索引,在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
可以在表中创建索引,以便加快查询效率,用户无法看到索引,只能加速查询。
更新一个有索引的表比更新一个没有的慢,所以理想的做法是仅在常常被搜索的列(以及表)上创建索引。
创建一个简单索引:
CREATE INDEX index_name
ON table_name (column_name)
创建一个不重复的简单索引:
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
举例:
降序索引某个列的值,添加保留字DESC
CREATE INDEX PersonIndex
ON Person (LastName DESC) 

24、SQL DROP

删除索引、表、数据库。
DROP TABLE 表名称
DROP DATABASE 数据库名称
如果只需要删除表内数据,不删除表本身:
TRUNCATE TABLE 表名称

25、SQL ALTER TABLE语句

用于在已有的表中添加、修改或删除列。
添加列:
ALTER TABLE table_name
ADD column_name datatype
删除列:
ALTER TABLE table_name 
DROP COLUMN column_name
修改列的数据类型:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
举例:
ALTER TABLE Persons
ALTER Birthday date  (添加名为“Birthday”的新列)
ALTER TABLE Persons
ALTER COLUMN Birthday year  (修改名为“Birthday”列的数据类型)
ALTER TABLE Persons
DROP COLUMN Birthday  (删除名为“Birthday”的新列)

26、SQL AUTO INCREMENT 字段

会在新纪录插入表中时生成一个唯一的数字。即如果希望在每次插入新纪录时,自动地创建主键字段的值,可以在表中创建一个auto-increment字段。

27、SQL VIEW(视图)

视图是可视化的表,总是基于最近的数据。
SQL CREATE VIEW实例:

样本数据库 Northwind 拥有一些被默认安装的视图。视图 "Current Product List" 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No#正在使用的产品
SQL更新视图:

SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
SQL撤销视图:

您可以通过 DROP VIEW 命令来删除视图。

SQL DROP VIEW Syntax
DROP VIEW view_name

28、SQL Date函数

SQL Server Date 函数

下面的表格列出了 SQL Server 中最重要的内建日期函数:

函数 描述
GETDATE() 返回当前日期和时间
DATEPART() 返回日期/时间的单独部分
DATEADD() 在日期中添加或减去指定的时间间隔
DATEDIFF() 返回两个日期之间的时间
CONVERT() 用不同的格式显示日期/时间

SQL Date 数据类型

MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:

  • DATE - 格式 YYYY-MM-DD
  • DATETIME - 格式: YYYY-MM-DD HH:MM:SS
  • TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
  • YEAR - 格式 YYYY 或 YY
当查询不含有时间,只有日期的时候,就比较容易处理和解决。
SELECT * FROM Orders WHERE OrderDate='2008-12-26'

29、SQL NULL值

NULL 值是遗漏的未知数据。

默认地,表的列可以存放 NULL 值。如果向表中插入一条不带值的记录,该列会使用NULL值保存。使用IS NULL和IS NOT NULL操作符来区别。

选取“Address”列中带有NULL值的记录:

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

30、SQL ISNULL函数

如果 "UnitsOnOrder" 是 NULL,则不利于计算,因此如果值是 NULL 则 ISNULL() 返回 0。

SQL Server / MS Access

SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products


31、SQL 数据类型

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高级教程】数据库学习笔记)