数据库语言SQL从入门到熟悉

数据库作为一堆躺在硬件里面的数据的集合,必须要通过一定的规则来和它打交道,如果使用传统的高级语言如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.视图的更新:满足一定条件才可以进行,条件如下:

数据库语言SQL从入门到熟悉