数据库作为一堆躺在硬件里面的数据的集合,必须要通过一定的规则来和它打交道,如果使用传统的高级语言如C、Python等来调用则失去了数据库本身的意义,为了便捷的调用大量的数据,数据库有其自身的一套标准语言--SQL(Structual Query Language)结构化查询语言,其包含有DDL、DML、DCL(数据库定义、操作、控制)语言,这些语言是我们与数据库沟通所必须要学习和掌握的对象。其具体引擎与内部算法和实现则是进阶内容,本文只讲述SQL本身。(建议阅读前面的博客关系代数的内容、以便于理解本文)
一、概述:
SQL(结构化查询语言),有DDL\DML\DCL三类语言9个关键词,它们分别如下:
DDL:create(创建)、alter(修改)、drop(取消)
DML(核心):Insert、Delete、Uptate、Select(核心中的核心)
DCL:grant(授权)、revoke(取消授权)
SQL语言有三大应用场景:
DBA通过DBMS来使用,此时为交互式SQL
通过高级语言嵌入SQL,此时为嵌入式SQL(与交互SQL基本一致)
设计一些高级抽象数据操作,此时为动态SQL(最难)
二、DDL(括号表示说明内容,中括号表示可选选项,下同)
①、create database 库名; (创建一个库)
②、create Table 表面(列名 数据类型 [Primary key | Unique](是否为主键\候选键) [Not Null](是否可以为空))
③、drop database 库名 \ drop Table 表面 (删除数据库、表)
④、alter Table 表名 [drop {完整性约束名}] [add {colname datatype}] [modify {colname datatype}] (修改表约束、增加属性、修改属性)
⑤、use/close 库名; (打开/关闭库)
三、DML
①、S-F-W基本形式
Select 列名 [,列名。。。。](后文忽略该中括号,此处表示可以多选列名)
From 表名[,列名。。。。](后文忽略该中括号,此处表示可以多选表名,实质是表的笛卡尔积)
[Where 选择条件]
以上为最经典的S-F-W查询模式,后续会对其进行一系列的扩展以满足复杂的需求。
②、From的扩展
实际上,Select命令相当于我们在关系代数中的投影命令,可以选择指定的属性并提取出来。
而From命令相当于表的连接命令,可以将多个表按需要连接起来,连接方式默认为全外连接,如下操作可指定其他连接方式:
From 表1 [Natural](自然连接) [INNER (内连接)| {LEFT | RIGHT | FULL} [OUTER] JOIN 表名2] {ON 连接条件 | Using (colname [,....])}
③、对结果的扩展
a.去除重复结果
在Select 后 属性前 加上符号DISTINCT
b.结果排序命令order by [ASC/Desc](升序or降序)
eg:
Select S# from Student order by s# desc;
③、对Select扩展
a.计算结果表达式与聚类函数
select后面跟随的除了是列名还可以是计算表达式和聚类函数,eg:
Select S.S#,S.Sname, 2018-S.Sage+1 as Syear From Student S;
聚类函数:Count(*) Sum Avg Max/,Min,eg:
Select Sum(salary) From Teacher T;
③、对where扩展
b.模糊查询(类似Linux中的通配符)
where 列名 [Not] like '字符串'
字符串中可出现%匹配若干字符; _ 匹配一个字符 ;\ 转义字符,用于%和_ ; eg:
select S#,Sname From Student
where Sname like '张%'
④、子查询扩展
对where 后的条件中可以添加子查询来进行公式验证,典型的3类子查询为 [Not] In,[<>]theta-some, /[<>]theta-all 和 [Not] Exists:
in 为验证是否在子查询结果中,等价于= some, not in 等价于 <>all, eg:
select S#,Sname From Student
Where S# in (Select S# From SC Where C# = '001';
eg:
Select Tname From Teacher
where salary <= all (select Salary From Teacher);
⑤、分组查询与过滤
SQL可以通过group by将检索结果按一定条件对元组进行分组,同时处理多个组和集合的聚集运算。eg:
Select S#, AVG(Score) From SC
Group by S#;(返回每个学生的平均成绩)
过滤:在group by 后加having 表示限制条件,eg:
Select S# From SC Where Score<60
Group by S# Having Count(*)>2;
⑥、用SQL实现并差交集合运算
基本语法:
子查询 {Union [all] | Intersect [all] | Except [all] } 子查询;(并交差(all表示不除重复元组)) ,eg:
Select S# From SC Where C# = '002'
Intersect
Select S# From SC Where C# = '003'
⑦、空值处理:空值检测只能使用: is [not] null
Select Sname From Student Where Sage is Null;
⑧、其他DML语句:Insert Delete Update
a.Insert
单一增加:
insert into 表名 [列名,....] values(值,......)
批量增加:
insert into 表名 [列名,....] 子查询
b.Delete
Delete From 表名 [where] 不加where为清空表,但表还在。
c.Update
Update 表名
Set 列名 = 表达式 | 子查询。。。。
[where 。。。]
⑨、视图
a.定义视图:
Creat view View_name[(列名,.....)]
as 子查询; eg:
create view compstud
as (select * from student where D# in (select D# from Dept where Dname = '计算机'));
b.使用视图:
Select S.Sname From compstud S
where S.Sage = '17'
c.视图的更新:满足一定条件才可以进行,条件如下: