SQL
SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)
查询和更新指令构成了 SQL 的 DML 部分:
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据
SQL 中最重要的 DDL 语句:
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
SQL基本语句
1、SELECT
SELECT 列名称或者* FROM 表名称
SELECT DISTINCT 列名称 FROM 表名称 返回唯一不同的值
SELECT LastName,FirstName FROM Persons
2、WHERE 筛选条件
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
SELECT * FROM Persons WHERE City='Beijing'
文本条件值周围用单引号!
3、AND/OR
SELECT * FROM Persons WHERE FirstName='Thomas' AND/OR LastName='Carter'
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'
4、ORDER BY 排序
SELECT Company, OrderNumber FROM Orders ORDER BY Company 以字母顺序显示公司名称
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC 以逆字母顺序显示公司名称,并以数字顺序显示顺序号
5、INSERT INTO 插入值
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') 在指定的列中插入数据
6、UPDATE 更新修改数据
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson' 为 lastname 是 "Wilson" 的人修改地址,添加城市
7、DELETE
DELETE FROM Person WHERE LastName = 'Wilson'
DELETE * FROM table_name
SQL高级功能
1、TOP 限定前几个
SELECT column_name(s) FROM table_name LIMIT number
SELECT * FROM Persons LIMIT 5
SELECT TOP 2 * FROM Persons
SELECT TOP 50 PERCENT * FROM Persons
2、LIKE
SELECT * FROM Persons WHERE City LIKE 'N%'
希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人
注意:"%" 可用于定义通配符(模式中缺少的字母)
SELECT * FROM Persons WHERE City LIKE '%g' 以 "g" 结尾的城市
SELECT * FROM Persons WHERE City NOT LIKE '%lon%' 不包含 "lon" 的城市
3、通配符介绍
SQL 通配符必须与 LIKE 运算符一起使用!
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er' 姓氏以 "C" 开头,然后是一个任意字符,然后是 "r",然后是任意字符,然后是 "er"
SELECT * FROM Persons WHERE City LIKE '[ALN]%' 城市以 "A" 或 "L" 或 "N" 开头
4、IN / BETWEEN 选取多个值
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter') 选取姓氏为 Adams 和 Carter
SELECT * FROM Persons WHERE LastName (NOT)BETWEEN 'Adams' AND 'Carter' 字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)
5、AS 别名
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
两个表分别是:"Persons" 和 "Product_Orders"。我们分别为它们指定别名 "p" 和 "po"
6、各种JOIN
JOIN = INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN
INNER JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。
FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。
FULL OUTER JOIN
7、UNION / UNION ALL 合并两个结果集
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
SELECT E_Name FROM Employees_China
UNION (ALL)
SELECT E_Name FROM Employees_USA
8、SELECT INTO 创建表的备份复件
SELECT LastName,FirstName INTO Persons_backup FROM Persons
SELECT * INTO Persons IN 'Backup.mdb' FROM Persons 向另一个数据库中拷贝
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P 创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息
9、CREATE DATABASE / TABLE
CREATE DATABASE my_db
CREATE TABLE Persons 创建数据库中的表
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
) Id_P 列是 int,包含整数。其余 4 列的数据类型是 varchar,最大长度为 255 个字符
10、约束: 限制加入表的数据的类型
写在创建表的数据类型之后。primary key中暗含unique约束。一个表格只能有一个primary key约束,但可以有多个unique约束。
SQL Server格式:列名称 数据类型 约束;MySQL会单列一行命令
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录
CREATE TABLE Persons
(
Id_P int NOT NULL, UNIQUE 这是SQL Server的写法
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P) 这是MySQL的写法
)
如果是当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束:
ALTER TABLE Persons ADD UNIQUE (Id_P)
ALTER TABLE Persons DROP INDEX uc_PersonID (撤销)
11、PRIMARY / FOREIGN KEY
PRIMARY KEY 约束唯一标识数据库表中的每条记录。每个表都应该有一个主键,并且每个表只能有一个主键。
MySQL 与Server的用法同UNIQUE,同理ADD和DROP:
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) 这是MySQL的用法
)
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
例子:"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。
"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。
"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。
这是MySQL用法,在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY:
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
12、CHECK约束
CHECK (Id_P>0) CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数
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')
)
13、DEFAULT 插入默认值
City varchar(255) DEFAULT 'Sandnes'
OrderDate date DEFAULT GETDATE() 通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值
14、CREATE INDEX 创建索引
CREATE UNIQUE INDEX PersonIndex ON Person (LastName DESC)
创建一个唯一索引,名为 "PersonIndex",在 Person 表的 LastName 列,并降序索引
CREATE INDEX PersonIndex ON Person (LastName, FirstName)
删除索引(MySQL的用法):ALTER TABLE table_name DROP INDEX index_name
15、DROP 与 ALTER
DROP TABLE 表名称 / DATABASE db
ALTER TABLE Persons ADD Birthday date 添加新列Birthday
ALTER TABLE Persons ALTER COLUMN Birthday year 修改Birthday 类型
ALTER TABLE Person DROP COLUMN Birthday
16、VIEW 可视化
视图 "Current Product List" 会从 Products 表列出所有正在使用的产品:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
SELECT * FROM [Current Product List] 查询命令:可以查询上面这个视图
计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 "Product Sales for 1997" 的视图那里选取数据:
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName
17、Isnull() 和 Ifnull()
由于Null本身和0不等价,所以,我们需要处理null值,比如设置其等于0。
SQL Server的用法:
SELECT ProductName,UnitPrice(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products
MySQL的用法:
SELECT ProductName,UnitPrice(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products
18、RDBMS 关系数据库管理系统
RDBMS是SQL的基础!
首先,数据库管理系统是一种可以访问数据库中数据的计算机程序。DBMS 使我们有能力在数据库中提取、修改或者存贮信息。不同的 DBMS 提供不同的函数供查询、提交以及修改数据。关系数据库管理系统 (RDBMS) 也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。