概述

定义

SQL ( Structured Query Language, 结构化查询语言)是一种对关系数据库进行访问的数据操作语言。

标准发展历史

应用情况

主流的关系型数据库管理系统均支持SQL标准语言实现数据库操作

拓展

  • Sybase ASE、Microsoft SQL Server ——Transaction-SQL语言;
  • Oracle Database——PL/SQL语言。

特点

  • 一体化
  • 使用方式灵活
  • 非过程化
  • 语言语句简单

SQL主要操作功能

  • 数据库对象创建、修改、删除
  • 数据库表的数据插入、修改、删除、查询、统计
  • 存储过程、触发器、函数等程序执行
  • 数据库权限、角色、用户等管理

语句类型

  • 数据定义语言(DDL)
  • 数据操作语言(DML)
  • 数据查询语言(DQL)
  • 数据控制语言(DCL)
  • 事务处理语言(TPL)
  • 游标1控制语言(CCL)

数据类型

基本数据类型

  • 字符: CHAR、VARCHAR、TEXT
  • 整数:SMALLINT、INT
  • 浮点数:NUMBER(n,d)、FLOAT(n,d)
  • 日期:DATE,DATETIME
  • 货币:MONEY

特殊数据(不同数据库支持的)

  • Postgre SQL(数据类型)
名字存储长度描述范围
smallint2 字节小范围整数-32768 到 +32767
integer4 字节常用的整数-2147483648 到 +2147483647
bigint8 字节大范围整数-9223372036854775808 到 +9223372036854775807
decimal可变长用户指定的精度,精确小数点前 131072 位;小数点后 16383 位
numeric可变长用户指定的精度,精确小数点前 131072 位;小数点后 16383 位
real4 字节可变精度,不精确6 位十进制数字精度
double precision8 字节可变精度,不精确15 位十进制数字精度
smallserial2 字节自增的小范围整数1 到 32767
serial4 字节自增整数1 到 2147483647
bigserial8 字节自增的大范围整数1 到 9223372036854775807
  • SQL server 数据类型(string类型)
数据类型描述存储
char(n)固定长度的字符串。最多 8,000 个字符。Defined width
varchar(n)可变长度的字符串。最多 8,000 个字符。2 bytes + number of chars
varchar(max)可变长度的字符串。最多 1,073,741,824 个字符。2 bytes + number of chars
text可变长度的字符串。最多 2GB 文本数据。4 bytes + number of chars
nchar固定长度的 Unicode 字符串。最多 4,000 个字符。Defined width x 2
nvarchar可变长度的 Unicode 字符串。最多 4,000 个字符。
nvarchar(max)可变长度的 Unicode 字符串。最多 536,870,912 个字符。
ntext可变长度的 Unicode 字符串。最多 2GB 文本数据。
bit允许 0、1 或 NULL
binary(n)固定长度的二进制字符串。最多 8,000 字节。
varbinary可变长度的二进制字符串。最多 8,000 字节。
varbinary(max)可变长度的二进制字符串。最多 2GB。
image可变长度的二进制字符串。最多 2GB。
  • MySQL数据类型()
数据类型描述
CHAR(size)保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。
VARCHAR(size)保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。注释:如果值的长度大于 255,则被转换为 TEXT 类型。
TINYTEXT存放最大长度为 255 个字符的字符串。
TEXT存放最大长度为 65,535 个字符的字符串。
BLOB用于 BLOBs(Binary Large OBjects)。存放最多 65,535 字节的数据。
MEDIUMTEXT存放最大长度为 16,777,215 个字符的字符串。
MEDIUMBLOB用于 BLOBs(Binary Large OBjects)。存放最多 16,777,215 字节的数据。
LONGTEXT存放最大长度为 4,294,967,295 个字符的字符串。
LONGBLOB用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
ENUM(x,y,z,etc.)允许您输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。

注释:这些值是按照您输入的顺序排序的。

可以按照此格式输入可能的值: ENUM('X','Y','Z')

SET与 ENUM 类似,不同的是,SET 最多只能包含 64 个列表项且 SET 可存储一个以上的选择。

更多数据类型详见菜鸟教程
以及Postgre SQL的更多数据类型

数据定义SQL语句

创建数据库

--创建  CREATE DATABASE <数据库名>;
CREATE DATABASE CourseDB;

修改

--修改 ALTER DATABASE <数据库名> <修改内容>;
ALTER DATABASE CourseDB RENAME TO CourseManageDB;

删除

--删除 DROP DATABASE <数据库名>
DROP DATABASE CourseManageDB;

创建数据库表

--数据库表创建 
CREATE TABLE <表明>(
<列名1> <数据类型> [列完成性约束],
<列名2> <数据类型> [列完成性约束],
...
);
/*
列完整性约束关键词 : 
PRIMARY KEY——主键
NOT NULL一 非空值
NULL-- 空值
UNIQUE一值唯一
CHECK——有效性检查 (限定范围)
DEFAULT-缺省值
*/
-- 若要定义复合主键,要使用  表约束定义主键
CREATE TABLE <表明>(
<列名1> <数据类型> [列完成性约束],
<列名2> <数据类型> [列完成性约束],
...
CONSTRAINT <约束名> PRIMARY Key (主键列)--constraint :约束
);

--表约束定义代理键
CONSTRAINT <约束名> PRIMARY Key (代理键列);

CONSTRAINT CrousePlan_PK PRIMARY Key(CrouseID,TeacherID);
-- 表约束定义外键
CONSTRAINT <约束名> FOREIGN Key (外键列)

--例子
CREATE TABLE Register
(	CourseRegID serial NOT NULL,--序列数据类型,作代理键
	CoursePlanID Int NOT NULL,
	Student ID char (13),
	Note varchar (30),
	CONSTRAINT CourseRegID_PK PRIMARY Key (CourseReglD) ,--主键
	CONSTRAINT CoursePlanID_FK FOREIGN Key (CoursePlanID)--外键
		REFERENCES Plan(CoursePlanID)--参照Plan表的CoursePlanID主键
	  ON DELETE CASCADE,--在列上附加级联删除的操作
	  --级联删除:如果父表中的记录被删除,则子表中对应的记录自动被删除
	CONSTRAINT StudentID_FK FOREIGN KEY (Student ID)
		REFERENCES Student (Student ID)
	  ON DELETE CASCADE

外键定义操作是重点(上机和期末考)

  • 使用表约束定义主键的优点:
    • 便于定义复合主键
    • 可命名主键约束
    • 便于定义代理键

修改表结构

--修改表结构
ALTER TABLE <表名><修改方式>;
--1)ADD,增加新列或列完整性约束 
ALTER TABLE <表名> ADD <新列名称><数据类型 >|[完整性约束]
--2)DROP,删除列或列完整性约束条件 
ALTER TABLE<表名> DROP COLUMN <列名>;
ALTER TABLE<表名> DROP CONSTRAINT<完整性约束>
--3)RENAME,修改表名称,列名称
ALTER TABLE <表名> RENAME <新表名>
ALTER TABLE <表名> RENAME <原列名> TO <新列名>
--4)ALTER,修改列数据类型

删除表结构

删除表的所有数据和结构

-- DROP TABLE <表名>;
DROP TABLE Register;

索引

索引( Index)是一种按照关系表中指定取值顺序组织元组数据存储的数据结构.使用它可以加快表中数据的查询访问。(使用B树)

  • 作用:快速查找
  • 优点:提高数据检索速度;可快速连接关联表;减少分组和排序的时间
  • 开销:创建和维护索引都需要较大开销;索引会占用额外存储空间;数据操纵因维护索引带来系统性能开销
-- 创建
CREATE INDEX <索引表> on <表明> <(列名)>;
-- 修改
ALTER INDEX <索引名> <修改项>;
-- 删除
DROP INDEX <索引名>

数据操作SQL语句

--插入
INSERT INTO <表名|视图名>[<列表名>] VALUES (列值表);
INSERT INTO Student VALUES(' 2017220101105','柳因','女', '1999-04-23', '软件工程’,'liuyin@163. com');

--更新
UPDATE <表名|视图名>
SET <列名1>=<表达式1> [,<列名2>=<表达式2>...]
[WHERE <条件表达式>];

--删除
DELETE
FROM <表名|视图名>
[WHERE <条件表达式>];

数据查询SQL语句

--基本格式
SELECT [ALL|DISTINCT] <目标列>[,<目标列>...]
[INTO <新表>]
FROM <表名|视图名>[<表名|视图名...] 
[ WHERE <条件表达式> ] 
[ GROUP BY <列名> [HAVING <条件表达式> ]]
[ ORDER BY <列名> [ ASC | DESC] ];
--从单个表读取指定列
SELECT <目标列>[<目标列...]
FROM <关系表>;

--单个表读取指定行
SELECT *
FROM <关系表> 
WHERE <条件表达式>;

--单个表指定行和列
SELECT <目 标列>[<目标列>...]
FROM <关系表>
WHERE <条件表达式>;

--对结果集排序
SELECT *
FROME STUDENT
ORDER BY BirthDay DESC,StudentName ASC;--DESC降序 ASC升序

--分组统计
SELECT 统计函数(目标列)
FROM <表名>
[WHERE 条件]
GROUP BY <目标列>
[Having 条件];

--子查询和多表关联
SELECT TeacherID ,TeacherName,TeacherTitle
FROM Teacher
WHERE CollegeID IN
	(SELECT CollegeID
	FROM College
	WHERE CollegeName='计算机学院'
	)

--关联多表查询
SELECT <目标列>[,<目标列>...]
FROM <表名1>,<表名2>,...,<表名n>
WHERE <关系表之间的连接关联条件>

--两表连接关联查询
SELECT <目标列>[,<目标列>...]
FROM <表名1> JOIN <表名2> ON <连接条件>

--外部连接(以上介绍的多表连接方式称为 ** 内部连接 ** )
LEFT JOIN --左外连接,  即使没有与右表关联列值匹配,也从左表返回所有的行
RIGHT JOIN --右外连接,  即使没有与左表关联列值匹配,也从又表返回所有的行
FULL JOIN --全连接,  同时进行左连接和右连接,就返回所有行


WHERE语句

用于指定范围数据
BETWEEN...AND来限定列范围(还有OR,NOT逻辑符)
LIKE与通配符来限定查询条件: _用于表示一个未指定的字符; %表示一个或多个未指定的字符

SELECT *
FROM STUEDENT
WHERE BirthDay BETWEEN '2000-01-01' AND '2000-12-30';

SQL内置函数

  • 聚合函数----数据属性列进行计算并返回一个结果数值
    • AVG(),COUNT(),MIN(),MAX(),SUM()
  • 算术函数
  • 字符串函数
  • 日期时间函数
  • 数据类型转换函数

数据控制SQL语句

对用户数据访问权进行控制 控制用户对数据表,视图,存储过程,触发器数据库对象的访问权

GRANT授权语句

GRANT <权限列表> ON <数据库对象> TO <用户或角色> [ WITH GRANT OPTION];
--例子
GRANT SELECTINSERTUPDATEDELETE ON REGISTER TO RoleS;

REVOKE收权语句

REVOKE <权限列表> ON <数据库对象> FROM <用户或角色>;
--例子
REVOKE DELETE ON REGISTER FROM RoleS;

DENY拒绝权限语句

拒绝当前数据库内的用户或角色授予权限,并防止用户或角色通过其他组或角色成员继承权限

DENY <权限列表> ON <数据库对象> TO <用户或角色>;
--例子
DENY DELETE ON TEACHER TO RoleT;

视图SQL语句——类比EXCEL的过滤

视图 ----视图一是一种通过基础表其它视图构建的虚拟表。它本身没有自己的数据,而是使用了存储在基础表中的数据。

如果视图选择了对象的所有列可以:select、insert into、delete(因为有主键)
但是选择了部分列可以进行的操作:select(没有主键,不能插入、删除)

创建

CREATE VIEW <视图名>[(列名1),(列名2),...] AS <SELECT查询>
--例子
CREATE VIEW BasicCourseView AS
SELECT CourseName, CourseCredit,CoursePeriod, TestMethod
FROM COURSE
WHERE CourseType=‘基础课’;

--可以像访问关系表一样操作视图

删除

DROP VIEW <视图名>;
DROP VIEW BasicCrouseView;

应用

  • 简化复杂SQL查询操作
  • 提高数据访问安全——不能直接访问完整数据,敏感数据隐藏
  • 提供一定程度程度的数据逻辑独立性
  • 集中展示用户所感兴趣的数据

本章节课堂习题,重点问题统合

B.关系型
B.SQL是数据操作语言,不会进行逻辑判断 ,高级语言才有逻辑判断
B. Char是固定长度的字符串,没有String
D.作为代理键,自动生成的字符串,不能是可变长字符串,Numebr是带小数的数字
D.没有String

1.一种对关系数据库进行访问的数据操作语言. C/Java 是高级语言,可以实现逻辑判断
2.DDL数据定义 ;DML数据操作

1.主键非空且唯一 ----设置not noll
2.使用serial数据类型,并设置为主键primary key
3.CONSTRAINT CoursePlanID_FK FOREIGN Key (CoursePlanID)–定义外键
REFERENCES Plan(CoursePlanID)–参照Plan表的CoursePlanID主键
ON DELETE CASCADE,–在列上附加级联删除的操作
4.经常需要查找的情况

1.D
2.C
3.B 先插入主表

1.INSERT INTO
[表名] ([列名],[列名])
VALUES
([列值],[列值])),
([列值],[列值])),
([列值],[列值]));
2.先插入主表再插入子表
3.在子表增加参照完整性约束,然后
4.子表添加级联删除

B

1.sum()
2.where语句中嵌入
3.join in和多表的等值关联连接
4.选择左表所有元组,包块不匹配的行

1.包含主键列
2.将数据表中敏感数据隐藏起来,外部用户无法得知数据表的完整数据

1.管理员或者被授权的用户
2.通过scanmer


  1. 游标: ↩︎

更多推荐

数据库第三章——SQL语言