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;

二、视图、存储过程、函数、触发器

  1. 视图(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 

波波鱼
4 声望3 粉丝