什么是 SQL
0|0 什么是 SQL?
- SQL 指结构化查询语言
- SQL 使我们有能力访问数据库
- SQL 是用于访问和处理数据库的标准的计算机语言。
SQL 是一种标准 - 但是…不幸地是,存在着很多不同版本的 SQL 语言
比如 MS SQL Server、Oracle 以及其他数据库系统为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)大多拥有它们自己的私有扩展!
在您的网站中使用 SQL
要创建发布数据库中数据的网站,您需要以下要素:
- RDBMS 数据库程序(比如 SQL Server, MySQL)
- 服务器端脚本语言(比如 PHP 或 ASP)
- SQL
- HTML / CSS
RDBMS
RDBMS 指的是关系型数据库
管理系统。
RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access。
RDBMS 中的数据
存储在被称为表
(tables)的数据库对象
中。
表是相关的数据项的集合,它由列
和行
组成。
数据库表
一个数据库通常包含一个
或多
个表。每个表由一个名字标识(例如“客户”或者“订单”)。表包含带有数据的记录(行
)。
下面的例子是一个名为 “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 |
上面的表包含三条记录(每一条对应一个人)和五个列(Id、姓、名、地址和城市)。
SQL 语句
在数据库上执行的大部分工作都由 SQL 语句完成。
下面的语句从表中选取 LastName 列的数据:
SELECT LastName FROM Persons
结果集类似这样:
LastName |
---|
Adams |
Bush |
Carter |
在本教程中,我们将为您讲解各种不同的 SQL 语句。
重要事项
一定要记住,SQL 对大小写不敏感!
SQL 语句后面的分号?
如果您使用的是 MS Access 和 SQL Server 2000,则不必在每条 SQL 语句之后使用分号,不过某些数据库软件要求必须使用分号。
0|1 SQL DML 和 DDL
可以把 SQL 分为两个部分:数据操作
语言 (DML) 和 数据定义
语言 (DDL)。
1|1 SQL (结构化查询语言)是用于执行查询的语法。
但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML 部分:
- SELECT - 从数据库表中
获取
数据 - UPDATE -
更新
数据库表中的数据 - DELETE - 从数据库表中
删除
数据 - INSERT INTO - 向数据库表中
插入数据
2|0 SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。
我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
2|1
- CREATE DATABASE - 创建新数据库
例如我要创建一个名为 “my_db“ 的数据库:
1 | CREATE DATABASE my_db; |
2|2
- ALTER DATABASE - 修改数据库
ALTER TABLE 语句用于在已有的表中添加、删除或修改列。
表中添加列,请使用下面的语法:
1 | ALTER TABLE table_name |
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
1 | ALTER TABLE table_name |
要改变表中列的数据类型,请使用下面的语法:
SQL Server / MS Access:
1 | ALTER TABLE table_name |
My SQL / Oracle:
1 | ALTER TABLE table_name |
Oracle 10G 之后版本:
1 | ALTER TABLE table_name |
SQL ALTER TABLE 实例
请看 “Persons“ 表:
P_Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes |
2 | Svendson | Tove | Borgvn 23 | Sandnes |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
现在,我们想在 “Persons“ 表中添加一个名为 “DateOfBirth” 的列。
我们使用下面的 SQL 语句:
1 | ALTER TABLE Persons |
请注意,新列 “DateOfBirth” 的类型是 date,可以存放日期。数据类型规定列中可以存放的数据的类型。
现在,”Persons“ 表将如下所示:
P_Id | LastName | FirstName | Address | City | DateOfBirth |
---|---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes | |
2 | Svendson | Tove | Borgvn 23 | Sandnes | |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
改变数据类型实例
现在,我们想要改变 “Persons“ 表中 “DateOfBirth” 列的数据类型。
可以使用下面的 SQL 语句:
1 | ALTER TABLE Persons |
请注意,现在 “DateOfBirth” 列的类型是 year,可以存放 2 位或 4 位格式的年份。
DROP COLUMN 实例
接下来,我们想要删除 “Person“ 表中的 “DateOfBirth” 列。
我们使用下面的 SQL 语句:
1 | ALTER TABLE Persons |
现在,”Persons“ 表将如下所示:
P_Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes |
2 | Svendson | Tove | Borgvn 23 | Sandnes |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
- CREATE TABLE - 创建新表
2|3
SQL CREATE TABLE 语法
1 | CREATE TABLE 表名称 |
数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型:
数据类型 | 描述 |
---|---|
|
仅容纳整数。在括号内规定数字的最大位数。 |
|
容纳带有小数的数字。 “size” 规定数字的最大位数。”d” 规定小数点右侧的最大位数。 |
char(size) | 容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。 在括号中规定字符串的长度。 |
varchar(size) | 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。 在括号中规定字符串的最大长度。 |
date(yyyymmdd) | 容纳日期。 |
SQL CREATE TABLE 实例
本例演示如何创建名为 “Person“ 的表。
该表包含 5 个列,列名分别是:”Id_P”、”LastName”、”FirstName”、”Address” 以及 “City”:
1 | CREATE TABLE Persons |
Id_P 列的数据类型是 int,包含整数。其余 4 列的数据类型是 varchar,最大长度为 255 个字符。
空的 “Persons“ 表类似这样:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
可使用 INSERT INTO 语句向空表写入数据。
2|4
- ALTER TABLE - 变更(改变)数据库表
2|5
- DROP TABLE - 删除表
2|6
- CREATE INDEX - 创建索引(搜索键)
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
索引
您可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
SQL CREATE INDEX 语法
在表上创建一个简单的索引。允许使用重复的值:
1 | CREATE INDEX index_name |
注释:”column_name” 规定需要索引的列。
SQL CREATE UNIQUE INDEX 语法
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
1 | CREATE UNIQUE INDEX index_name |
CREATE INDEX 实例
本例会创建一个简单的索引,名为 “Index_Pers”,在 Person 表的 LastName 列:
1 | CREATE INDEX Index_Pers |
如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:
1 | CREATE INDEX Index_Pers |
假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
1 | CREATE INDEX Index_Pers |
2|7
- DROP INDEX - 删除索引
SQL 撤销索引、撤销表以及撤销数据库
通过使用 DROP 语句,可以轻松地删除索引、表和数据库。
DROP INDEX 语句
DROP INDEX 语句用于删除表中的索引。
用于 MS Access 的 DROP INDEX 语法:
1 | DROP INDEX index_name ON table_name |
用于 MS SQL Server 的 DROP INDEX 语法:
1 | DROP INDEX table_name.index_name |
用于 DB2/Oracle 的 DROP INDEX 语法:
1 | DROP INDEX index_name |
用于 MySQL 的 DROP INDEX 语法:
1 | ALTER TABLE table_name DROP INDEX index_name |
DROP TABLE 语句
DROP TABLE 语句用于删除表。
1 | DROP TABLE table_name |
DROP DATABASE 语句
DROP DATABASE 语句用于删除数据库。
1 | DROP DATABASE database_name |
TRUNCATE TABLE 语句
如果我们仅仅需要删除表内的数据,但并不删除表本身,那么我们该如何做呢?
请使用 TRUNCATE TABLE 语句:
1 | TRUNCATE TABLE table_name |