可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。DML 主要用于查询和更新;DDL 使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
查询和更新指令构成了 SQL 的 DML 部分:
- SELECT – 从数据库表中获取数据
- UPDATE – 更新数据库表中的数据
- DELETE – 从数据库表中删除数据
- INSERT INTO – 向数据库表中插入数据
DDL 语句:
- CREATE DATABASE – 创建新数据库
- CREATE TABLE – 创建新表
- CREATE INDEX – 创建索引(搜索键)
- ALTER DATABASE – 修改数据库
- ALTER TABLE – 变更(改变)数据库表
- DROP TABLE – 删除表
- DROP INDEX – 删除索引
|ID|Lastname|Firstname|Address|City |
|–|
|01|Adams| John| Oxford Street| London
|02|Bush| George| Fifth Avenue| New York
|03|Carter| Thomas| Changan Street| Beijing
|04|Carter| William| Xuanwumen 10| Beijing
数据操作指令 DML
Select
- distinct 返回不同的值
SELECT DISTINCT Firstname FROM Person #选中Firstname中的不同的值
- Top子句,用来限制返回的数据条数,对于与表中数据行数很多的时候特别有用
SELECT TOP 2 * FROM Person #返回表中的前两行数据
SELECT TOP 30 PERCENT * FROM Person #返回表中前30%的数据行
- select into 复制表
SELECT * INTO Persons_backup FROM Persons
SELECT * INTO Persons IN 'Backup.mdb' FROM Persons
- WHERE
|操作符|描述|
|–|
|= |等于|
|<>或者!= |不等于
|> |大于
|< |小于
|>=| 大于等于
|<= |小于等于
|BETWEEN| 在某个范围内
|LIKE| 搜索某种模式
SELEECT * FROM Person WHERE City LIKE '%lon%' #City列里包含字符串lon的行
SELEECT * FROM Person WHERE City LIKE 'lon%' #City列里最前面是字符串lon的行
SELEECT * FROM Person WHERE City NOT LIKE 'lon%' #City列里没有字符串lon的行
通配符不止有%
(通配一个或多个字符)还有_
(一个字符),[charlist]
(在charlist字符列中的任一单字),[^charlist]或者[!charlist]
(不在字符列中的任一单字),参看正则表达式。
SELEECT * FROM Person WHERE City LIKE 'londo_' #City列里除最后一个字符以外是londo的行
SELEECT * FROM Person WHERE City LIKE '[lnb]%' #City列里以l或n或b开头的行
SELEECT * FROM Person WHERE City LIKE '[^lnb]%' #City列里不以l或n或b开头的行
- WHERE…IN (,)操作符|筛选出WHERE指定的列中IN中含有的值
SELEECT * FROM Person WHERE City IN ('london','new york') #City列里的值为london或者new york的行
- WHERE…BETWEEN value1 AND value2 操作符|筛选出WHERE指定的列中从value1(包含)到value2(不包含)的行
不同的数据库这种包含关系是不一样的,具体要看使用哪种数据库
SELEECT * FROM Person WHERE City BETWEEN london AND beijing #返回下表
|ID|Lastname|Firstname|Address|City |
|–|
|01|Adams| John| Oxford Street| London
|02|Bush| George| Fifth Avenue| New York
- as
别名,select lastname as la from table_a
INSERT INTO…VALUES…
INSERT INTO Person (Lastname,Firstname) VALUES (value1,value2)
UPDATE…SET…
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
DELETE
DELETE FROM Person WHERE LastName = 'Wilson'
结构指令DDL:
- CREATE DATABASE
- CREATE TABLE
- ALTER DATABASE
- ALTER TABLE
ALTER TABLE 用于更改原有表的结构。例如,您可以增加或删减列,创建或取消索引,更改原有列的类型,或重新命名列或表。您还可以更改表的评注和表的类型。您可以在一个ALTER TABLE语句里写入多个ADD, ALTER, DROP和CHANGE子句,中间用逗号分开。这是MySQL相对于标准SQL的扩展。在标准SQL中,每个ALTER TABLE语句中每个子句只允许使用一次。 要使用ALTER TABLE,您需要获得表的ALTER, INSERT和CREATE权限。
/*在表Persons中添加Birthday列,数据类型为int,date,str;改变Birthday列的数据类型为year*/
ALTER TABLE Persons ADD Birthday datatype(int,date,str),ALTER COLUMN Birthday year;
改变一个表的默认字符集:
ALTER TABLE tbl_name DEFAULT CHARACTER SET utf-8;
- DROP TABLE
- CREATE INDEX
- DROP INDEX
join 链接
用于将两个表链接显示多个表的结果
现在有另外一个表Order:
Id_O | OrderNo | ID |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
5 | 34764 | 65 |
ID是外键,链接了两个表。现找出谁订购了产品,订购了哪些产品
SELECT Person.Lastname,Person.Firstname,Order.OrderNO FROM Person,Order WHERE Person.ID=Order.ID
返回结果:
LastName| FirstName| OrderNo
—-|
Adams| John| 22456
Adams| John| 24562
Carter| Thomas |77895
Carter| Thomas| 44678
- .JOIN: 如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
上述返回还可以通过下面的JOIN表示法表示:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders(FULL JOIN Orders,LEFT JOIN Orders,RIGHT JOIN Orders)
ON Persons.ID = Orders.ID
ORDER BY Persons.LastName
union
返回多个表的值
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
函数
- group by
- having 跟 group by 配套使用,代替 where 用法
- ucase 大写
- lcase 小写
- mid 提取部分字符串
索引 (index)
索引是表中一列或多列数据和指向这些数据页的逻辑指针清单。创建索引时,将这些数据这些排序,用关联的指针直接定位要查找的值,从而提升了查询速度。 所以索引的创建是为数据库的执行速度和性能服务的,他具体的好处有:
- 加速数据的检索速度
- 创建唯一性索引能保证数据库表中每一行数据的唯一性
- 加速表之间的连接速度
- 加快分组和排序的速度
由于索引的创建要消耗物理空间,所以过多的索引会引出如下问题:
- 占据空间
- 反而会降低增删改查的速度,同时数据改变的时候,因为他要更新关联的索引,也会影响性能
CREATE INDEX PersonIndex #在person表的LastName,Fistname列创建索引,以Lastname降序排序
ON Person (Lastname DESC,Firstname)
DROP INDEX Person.PersonIndex #删除索引
视图(views)
视图就是一个虚拟的表,其内容由查询定义。对表能够进行的一般操作(增删改查)都可以应用于视图。 视图内其实没有存储任何数据,它只是对表的一个查询。
优点:
- 安全,提供了另外一种级别的表安全性
- 虚拟,隐藏的数据的复杂性
- 简化,简化的用户的SQL命令
- 重命名,通过重命名列,从另一个角度提供数据
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
存储过程(Stored Procedure)
是一组为了完成特定功能的SQL语句集,由流控制和SQL语句书写构成。
优点:
- 加快执行速度。存储过程只在创建时编译,而sql语句每次执行都要编译
- 可以重复使用
- 安全性高,可设定使用权。