SQL

300 阅读11分钟

1.SQL语言的分类

SQL语言包含三部分:

数据定义语言DDL:创建表,创建视图,创建索引

数据操作语言DML: 增,删,改,查
数据控制语言DCL:分配权限

数据定义语言(DDL)关键词

操作对象          操作方式                 

                创建                      删除          修改
数据库       CREATE DATABASE       DROP DATABASE      
表           CREATE TABLE          DROP TABLE           ALTER  TABLE
索引         CREATE INDEX          DROP  INDEX
视图         CREATE VIEW           DROP  VIEW

数据操作语言(DML)关键词

操作对象         操作方式
 
                增加       删除         修改       查询
记录           insert     delete        update      select
                
SQL SELECT 语法
SELECT 列名称 FROM 表名称

以及:

SELECT * FROM 表名称
语法
INSERT INTO 表名称 VALUES (值1, 值2,....)
我们也可以指定所要插入数据的列:

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

例子:
插入新的行
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')

在指定的列中插入数据
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
语法:

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

更新某一行中的一个列
我们为 lastname 是 "Wilson" 的人添加 firstname:

UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' 

更新某一行中的若干列
我们会修改地址(address),并添加城市名称(city):

UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'
DELETE 语句
DELETE 语句用于删除表中的行。

语法
DELETE FROM 表名称 WHERE 列名称 = 值

删除某行
"Fred Wilson" 会被删除:

DELETE FROM Person WHERE LastName = 'Wilson' 

删除所有行
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:

DELETE FROM table_name
或者:

DELETE * FROM table_name

数据控制语言(DCL)关键词

操作对象         操作方式

                    增加权限           删除权限
     数据库         grant               revoke



使用order by 排序

 order by       默认升序排序
 order by desc  实现降序排列   
 order by 年龄,成绩
 order by 作用于空值NULL  默认升序排序
 order by +desc 作用于空值NULL   实现降序排列 

使用TOP关键字

top 3 返回前三行
top 50%   返回前50%的行

3.函数查询

sum()函数

sum()函数  返回该列数据之和

average()函数

average()返回该列数据的平均值

left()函数

abcd  Left('字符串',2)  ab
返回字符串左边2个字符

4.连接查询

连接查询的种类

连接查询的种类 包括 内连接           外连接               交叉连接
            (inner join)

内连接

inner join    只返回两张表匹配的记录

左外连接(left join)

left join  返回两张表匹配的记录,以及左表多余的记录

右外连接(right join)

right join  返回两张表匹配的记录,以及右表多余的记录

全外连接(Full Join)

full join  返回两张表匹配的记录,以及左右两表多余的记录

交叉连接(cross join)

cross join 左表和右表,两两连接

5.专门的关系运算

例1

1.选择学生表(student)中性别为男的同学
σ Sdept=‘男’(Student)

例2

2.查询学生关系Student中都有哪些系
π Sdept(Student)

例三

3查询Student关系学生姓名和所在系两个属性上的投影
π Sname,Sdept(Student)

6.数据控制语言(DCL)关键词

使用insert插入单行数据

语法:  insert[into]<表名>[列名]values<列名>

案例:insert into Students(姓名,性别,出生日期)values('王伟华''男','1983/6/15'

使用insert,select语句将现有表的数据添加到已有的新表中

语法:  insert into <已有的新表><列名>
select <原表列名> from <原表名>

案例:insert into addressList('姓名','地址','电子邮件')select name,address,email from Students

使用delete删除表中某行数据

语法: delete from <表名>[where <删除条件>]
案例: delete from a where name="王伟华"
(删除表a中列值为王伟华的行)

使用 truncate table删除整个表的数据

语法:truncate table <表名>

案例: truncate table addressList

使用update更新修改数据

语法: update<表名>set<列名=更新值> [where<更新条件>]

案例:update addressList set 年龄=18 where 姓名="王伟华"
(修改王伟华的年龄为18岁)

** 使用select查询数据**

语法:select <列名> from <表名>

案例:SELETE city FROM students
(查询学生表中学生所在的城市)

SQL高级教程

SQL TOP 子句

SQL TOP 实例
现在,我们希望从上面的 "Persons" 表中选取头两条记录。

我们可以使用下面的 SELECT 语句:

SELECT TOP 2 * FROM Persons


SQL TOP PERCENT 实例
现在,我们希望从上面的 "Persons" 表中选取 50% 的记录。

我们可以使用下面的 SELECT 语句:

SELECT TOP 50 PERCENT * FROM Persons

SQL LIKE 操作符

例子 1
现在,我们希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE 'N%'

例子 2
接下来,我们希望从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE '%g'


例子 3
接下来,我们希望从 "Persons" 表中选取居住在包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City LIKE '%lon%'



例子 4
通过使用 NOT 关键字,我们可以从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE City NOT LIKE '%lon%'

SQL 通配符

使用 % 通配符
例子 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]%'

SQL IN 操作符

IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值。

IN 操作符实例
现在,我们希望从上表中选取姓氏为 Adams 和 Carter 的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')

SQL BETWEEN 操作符

BETWEEN 操作符实例
如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,请使用下面的 SQL:

SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'



实例 2
如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:

SELECT * FROM Persons
WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter'

SQL Alias(别名)

Alias 实例: 使用表名称别名
假设我们有两个表分别是:"Persons""Product_Orders"。我们分别为它们指定别名 "p""po"。

现在,我们希望列出 "John Adams" 的所有定单。

我们可以使用下面的 SELECT 语句:

SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
不使用别名的 SELECT 语句:

SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM Persons, Product_Orders
WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
从上面两条 SELECT 语句您可以看到,别名使查询程序更易阅读和书写。
Alias 实例: 使用一个列名别名

SELECT LastName AS Family, FirstName AS Name
FROM Persons

SQL JOIN

SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

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

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

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P 
SQL JOIN - 使用 Join
除了上面的方法,我们也可以使用关键词 JOIN 来从两个表中获取数据。

如果我们希望列出所有人的定购,可以使用下面的 SELECT 语句:

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 类型,以及它们之间的差异。

JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行

SQL INNER JOIN 关键字

INNER JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name
内连接(INNER JOIN)实例
现在,我们希望列出所有人的定购。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。

SQL LEFT JOIN 关键字

左连接(LEFT JOIN)实例
现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

SQL RIGHT JOIN 关键字

右连接(RIGHT JOIN)实例
现在,我们希望列出所有的定单,以及定购它们的人 - 如果有的话。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。

SQL FULL JOIN 关键字

全连接(FULL JOIN)实例
现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。

SQL UNION 和 UNION ALL 操作符

使用 UNION 命令
实例
列出所有在中国和美国的不同的雇员名:

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA

注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。

UNION ALL
UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。

SQL Statement 1
UNION ALL
SQL Statement 2

SQL SELECT INTO 语句

SQL SELECT INTO 语句可用于创建表的备份复件。

SQL SELECT INTO 实例 - 制作备份复件
下面的例子会制作 "Persons" 表的备份复件:

SELECT *
INTO Persons_backup
FROM Persons
IN 子句可用于向另一个数据库中拷贝表:

SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons
如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:

SELECT LastName,FirstName
INTO Persons_backup
FROM Persons
SQL SELECT INTO 实例 - 带有 WHERE 子句
我们也可以添加 WHERE 子句。

下面的例子通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表:

SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'
SQL SELECT INTO 实例 - 被连接的表
从一个以上的表中选取数据也是可以做到的。

下面的例子会创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:

SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P

SQL CREATE DATABASE 语句

CREATE DATABASE 语句
CREATE DATABASE 用于创建数据库。

SQL CREATE DATABASE 语法
CREATE DATABASE database_name
SQL CREATE DATABASE 实例
现在我们希望创建一个名为 "my_db" 的数据库。

我们使用下面的 CREATE DATABASE 语句:

CREATE DATABASE my_db
可以通过 CREATE TABLE 来添加数据库表。

SQL CREATE TABLE 语句

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

SQL 约束 (Constraints)

SQL 约束
约束用于限制加入表的数据的类型。

可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。

我们将主要探讨以下几种约束:

NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT

SQL NOT NULL 约束

SQL NOT NULL 约束
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)
)

SQL UNIQUE 约束

SQL PRIMARY KEY 约束

SQL FOREIGN KEY 约束

SQL CHECK 约束

SQL DEFAULT 约束

SQL CREATE INDEX 语句