1. SQL简介
SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。
2. SQL是什么
SQL 指结构化查询语言,全称是 Structured Query Language。
SQL 让您可以访问和处理数据库,包括数据插入、查询、更新和删除。
SQL 在1986年成为 ANSI(American National Standards Institute 美国国家标准化组织)的一项标准,在 1987 年成为国际标准化组织(ISO)标准。
3. SQL能做什么
- SQL 面向数据库执行查询
- SQL 可从数据库取回数据
- SQL 可在数据库中插入新的记录
- SQL 可更新数据库中的数据
- SQL 可从数据库删除记录
- SQL 可创建新数据库
- SQL 可在数据库中创建新表
- SQL 可在数据库中创建存储过程
- SQL 可在数据库中创建视图
- SQL 可以设置表、存储过程和视图的权限
4. SQL语言的分类
- DDL语句:数据定义语句,负责定义数据库对象的,包括创建、修改、删除数据库对象。语句有:
create、 alter、drop - DML语句:数据操作语句,负责操作表中的数据的。包括新增、修改、删除数据。语句有:
insert、update、 delete、truncate - DQL语句:查询数据语句,语句有:select 。查询功能包括:条件查询、分组查询、多表连接查 询、子查询。
- DCL语句:数据控制语句,语句有:GRANT、REVOKE、COMMIT、ROLLBACK等语句,负责分配/收回用户的权限。
5. SQL语法
5.1. CREATE DATABASE语句
5.1.1. 概述
CREATE DATABASE 语句用于创建数据库。
5.1.2. CREATE DATABASE 语法CREATE DATABASE dbname;
5.1.3. 实例
下面的 SQL 语句创建一个名为 "my_db" 的数据库:CREATE DATABASE my_db;
5.2. 数据库表
5.2.1. 概述
CREATE TABLE 语句用于创建数据库中的表。
表由行和列组成,每个表都必须有个表名。
5.2.2. 语法
CREATE DATABASE 语句用于创建数据库。
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
column_name 参数规定表中列的名称。
data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。
size 参数规定表中列的最大长度。
5.2.4. SQL 约束(Constraints)
SQL 约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
5.2.4.1. CREATE TABLE + CONSTRAINT 语法
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
在 SQL 中,我们有如下约束:
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。
- DEFAULT - 规定没有给列赋值时的默认值。
5.2.4.2. PRIMARY KEY 约束
- PRIMARY KEY 约束唯一标识数据库表中的每条记录。
- 主键必须包含唯一的值。
- 主键列不能包含 NULL 值。
- 每个表都应该有一个主键,并且每个表只能有一个主键。
5.2.4.2.1. CREATE TABLE 时的 SQL PRIMARY KEY 约束
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如需命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束,请使用下面的 SQL 语法
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
5.2.4.2.2. ALTER TABLE 时的 SQL PRIMARY KEY 约束
当表已被创建时,如需在 "P_Id" 列创建 PRIMARY KEY 约束,请使用下面的 SQL:
ALTER TABLE Persons ADD PRIMARY KEY (P_Id)
如需命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束,请使用下面的 SQL 语法:
LTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
5.2.4.2.3. 撤销 PRIMARY KEY 约束
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:
ALTER TABLE Persons DROP CONSTRAINT pk_PersonID
5.2.4.3. FOREIGN KEY 约束
一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。
5.2.4.3.1. CREATE TABLE 时的 SQL FOREIGN KEY 约束
下面的 SQL 在 "Orders" 表创建时在 "P_Id" 列上创建 FOREIGN KEY 约束:
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)
5.2.4.3.2. ALTER TABLE 时的 SQL FOREIGN KEY 约束
当 "Orders" 表已被创建时,如需在 "P_Id" 列创建 FOREIGN KEY 约束,请使用下面的 SQL:
ALTER TABLE Orders ADD FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:
ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
5.2.4.3.3. 撤销 FOREIGN KEY 约束
如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
5.3. CREATE INDEX 索引
5.3.1. 概述
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
5.3.2. CREATE INDEX 语法
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name ON table_name (column_name)
index_name:索引名称
table_name:索引的表
column_name:索引的列
5.3.3. CREATE UNIQUE INDEX 语法
在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name ON table_name (column_name)
5.3.4. CREATE INDEX 实例
下面的 SQL 语句在 "Persons" 表的 "LastName" 列上创建一个名为 "PIndex" 的索引:
CREATE INDEX PIndex ON Persons (LastName)
如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX PIndex ON Persons (LastName, FirstName)
5.4. INSERT INTO 语句
5.4.1. 概述
INSERT INTO 语句用于向表中插入新记录。
5.4.2. INSERT INTO 语法
INSERT INTO 语句可以有两种编写形式。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,...);
第二种形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
5.5. UPDATE 语句
5.5.1. 概述
UPDATE 语句用于更新表中已存在的记录。
5.5.2. UPDATE 语法
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
请注意 SQL UPDATE 语句中的 WHERE 子句!
WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE 子句,所有的记录都将被更新!
5.6. DELETE 语句
5.6.1. 概述
DELETE 语句用于删除表中的行。
5.6.2. DELETE 语法
DELETE FROM table_name
WHERE some_column=some_value;
请注意 SQL DELETE 语句中的 WHERE 子句! WHERE 子句规定哪条记录或者哪些记录需要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!
5.7. SELECT
5.7.1. 概述
SELECT 语句用于从数据库中选取数据。
结果被存储在一个结果表中,称为结果集。
5.7.1.1. SELECT 语法
SELECT column_name,column_name FROM table_name;
与
SELECT * FROM table_name;
5.7.2. SELECT DISTINCT 语句
在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。
DISTINCT 关键词用于返回唯一不同的值。
5.7.2.1. SQL SELECT DISTINCT 语法
SELECT DISTINCT column_name,column_name FROM table_name;
二、视图、存储过程、函数、触发器
- 视图(Views)
1.1. 概述
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
您可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。
1.2. CREATE VIEW 语法
创建视图
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
注释:视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。
1.3. ALTER VIEW 语法
更新视图
ALTER VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
1.4. DROP VIEW 语法
撤销视图
DROP VIEW view_name
1.5. 视图的分类
标准视图:使用最频繁的视图,不存储任何数据,不占用任何存储空间
索引视图:拥有唯一群集索引的视图被称为索引视图,它存储真实索引数据,占用一定的存储空
间。
分区视图:现在用分区表进行替代
1.5.1. 标准视图
--创建带有部门编号的视图
if EXISTS (SELECT * FROM sys.views WHERE name='v_user')
drop view v_user
GO
CREATE view v_user
as
select a.id,a.userName,a.deptId,b.deptName from dbo.[user] a left join dept b
on a.deptId=b.deptId
go
--通过视图修改数据
update v_user set deptName='本部' where id=4
注意:
(1)可以修改基于两个或两个以上基表的视图,但是每次修改只能影响一个基表,不能同时修改。
(2)不能修改通过计算得到的列、有内置函数的列以及有聚合函数的列
1.5.2. 索引视图
--创建聚合索引
CREATE [UNIQUE|CLUSTERED] INDEX INDEX_NAME ON TABLE_NAME(PROPERTY_NAME)
其中UNIQUE和CLUSTERED为可选项,分别是建立唯一索引和聚簇索引,具体解释为: UNIQUE:表示此索引的每一个索引值只对应唯一的数据。 CLUSTERED:表示要建立的索引时聚簇索引,即索引项的顺序与表中记录的物理顺序一致的索引组织。
2.存储过程
2.1.语法
CREATE OR ALTER OR DROP { PROC | PROCEDURE }
[schema_name.] procedure_name
[ { @parameter [ type_schema_name. ] data_type }
[ OUTPUT ] ] [ ,...n ]
AS { <sql_statement> }
2.2. 存储过程的执行过程和重编译
存储过程在第 1 次执行时,要经过语法分析、解析、编译和执行共 4 个阶段,当添加了新的索引或更新:了某些列数值之后,存储过程将不自动执行优化,可以强制在下次启动服务器前重编译该存储过程,以更新原有的执行计划。
可以有三种方式实现:
--1使用sp_recompile系统存储过程
exec sp_recompile hh
--2创建存储过程时增加with recompile选项
ALTER procedure [dbo].[hh] with recompile
as
begin
select count(*) 'count'
from aa
end
--3 执行重新编译
exec hh with recompile
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。