【数据库原理及应用】第四章 —— 关系型数据库标准语言SQL

4.1、SQL概述

结构化查询语言,是关系型数据库管理系统的标准语言,不同数据库软件可能还有自己独特的方言

4.1.1、SQL特点

  • 综合统一
  • 高度非过程化
  • 面向集合的操作方式
  • 以同一种语法结构提供两种使用方式:独立和嵌入。独立使用方式又称为交互式,是指在DBMS提供的查询界面输入SQL语句并执行,DBMS向用户反馈SQL查询结果。嵌入是指在类似C#、Java等编程语言中使用SQL语句

4.1.2、SQL基本概念

4.1.2.1、DBMS

DBMS是一种操纵和管理数据库的大型软件,常见的DBMS产品:SQL Server、MySQL、Oracle

4.1.2.2、方言

SQL方言是不同数据库管理系统在SQL基础上进行的拓展,也是不同管理系统sql语句的主要区别

4.1.2.3、SQL功能组件

标准的有三大功能组件:DML(数据操纵)、DDL(数据定义)、DCL(数据控制)

4.1.3、SQL基本数据类型

数据类型实例占用字节数说明或范围
精确型money8范围是-922337203685477.5808 ~ -922337203685477.5807,精确到所代表的的货币单位的万分之一
(money和smallmoney也是货币类型smallmoney4存储范围为-214748.3648 ~ 214748.3647
tinyint10~255
bigint8-2^63 ~ 2^63-1
int(常用)4-2^31 ~ 2^31-1
bit1取值: 1、
decimal(numeric)由精度确定压缩严格的定点数decimal(p,s):其中p是精度(1~38,默认18),表示最多可存储的十进制数字的总位数;s是小数位数)(十进制)
近似型real4-3.4010^38 ~ 1.1810(-38)、0、1.18*10(-38)~3.40*10^38
float取决于n值float(n)
普通字符串类型text(会删除)服务器代码页中长度可变的非Unicode数据,字符串最大长度为2^31-1字节
charn决定char(n), 固定长度,n∈[1, 8000]
varchar决定varchar(n), 可变长度, n∈[1, 8000]
Unicode字符类型nchar(会删除)n决定nchar(n), n∈[1, 4000],,存储固定大小的Unicode字符集,存储大小为2n
nvarcharn决定存储可变大小的Unicode字符集,n∈[1, 4000]
varchar长度可变的Unicode数据,字符串最大长度为2^30-1字节,存储大小是所输入字符串长度的两倍
日期时间类型date30001-01-01~9999-12-31
time500:00:00.0000000 ~ 23:59:59:9999999
datetime81753年1月1日 ~ 9999年12月31日
smalldatetime41900-01-01~2079-06-06
二进制类型binarynbinary(n): 存储n字节固定长度的二进制数据,n∈[1, 8000]
varbinarynvarbinary(n),可变长度二进制数据,n∈[1, 8000]
image(会删除)长度可变的二进制数据

4.2、数据定义

4.2.1、模式的定义与删除

模数据库模式是一种逻辑分组对象,数据库模式是数据库对象的集合,包括了各种对象,比如表、视图、存储过程、索引等。

数据库模式可作为一个命名空间,防止来自不同模式的对象名称冲突

数据库的定义和删除

/*创建数据库*/
create database DBname

/*删除数据库*/
drop database DBname

创建模式语法

create schema 模式名 authorization 用户名

/*说明:创建一个模式,并将这个模式授权给指定的用户进行管理*/
/*模式创建成功后,即可在该模式下创建对象:表、视图等*/

删除模式

drop schema 模式名

实例 - 一个数据库的创建、建表到删库

create database testDB/*创建数据库*/
use testDB            /*进入该数据库*/
go
create login Rory with passwords='test'   /*先创建一个数据库用户*/
go
create user Rory for login Rory          
go
create schema mod_1 authorization Rory   /*再定义模式,并将其授权给创建的数据库用户管理*/

/*自此模式创建成功,下面在该模式下创建表,插入表并查找表*/
create table mod_1.testTable(
    Cno char(12) not null,
    Vname varchar(10) not null
) 
go
insert into mod_1.testTable values('202131066666', 'Doc')
go
select * from mod_1.testTable

/*下面是删库*/
drop table mod_1.testTable  /*先删表*/
go
drop schema mod_1     /*再删模式*/
go
drop database testDB   /*最后删库*/

4.2.2、基本表的定义、删除、修改

4.2.2.1、定义表
/*语法*/
create table<tableName>(
    <列名> <数据类型> [列级完整性约束定义]
        {, <列名> <数据类型> [数据完整性定义]
        ……}
    	[, 表级完整性约束定义])

/*eg1.*/
create table student(
    sno char(7) primary key, /*主码*/
    sname char(10) not null,
    ssex char(2) check (ssex = '男' or ssex = '女'),
    sage tinyint check (sage >= 15 and sage <= 20),
    
    /**
    *primary key(sno)   也可以在最后,这样定义主码
    *primary key(sno, sname)   或者定义一个有多个属性的主码
    **/
)
4.2.2.2、删除表
drop table tableName
4.2.2.3、修改表
语句作用
alter table tableName alter column 列名 新数据类型修改列定义
alter table tableName add column 列名 数据类型 属性添加新列
alter table tableName drop column 列名删除列
alter table tableName add primary key(列名[,...n])添加主码约束
alter table tableName add foreign key 列名 references 表名(列名)添加外码约束
alter table tableName drop column 字段名删除原有字段
alter table tableName add 字段名 数据类型添加新字段
alter table tableName alter column 字段名 数据类型(长度)修改数据类型或长度
4.2.2.4、数据库完整性

实体完整性、参照完整性、用户定义完整性、完整性约束命名子句

数据库完整性指数据的正确性相容性

  • 放置数据库中存在不正确的数据
  • 防范对象:不合语义的

数据的安全性

维护数据库完整性,DBMS所做的:

  • 提供定义完整性约束条件的机制
  • 提供完整性检查的方法
  • 违约处理:实体完整性中,检查主码是否唯一(全表扫描),主码的各个属性是否非空

完整性控制是DBMS核心支持的功能,从而能够所有的用户和所有的应用提供一致的数据库完整性

4.2.2.4.1、列级完整性可定义的约束
约束说明
not null限制列取值非空
default k设置列默认值为常量k
unique限制列取值不重复
check限制列的取值范围,格式:check(约束表达式)
primary key指定本列为主码
foreign key定义本列为引用其他表的外码,格式:foreign key 列名 references 外表名/外表列名

not null 和 default 不能在表级完整性约束处定义

4.3.0、准备

4.3.0.1、给表单取别名
/*格式一: 使用as*/
select * from stu as s1 where exists (select * from student as s2 where s1.major = s2.major and s2.name = 'Rory')

/*格式二: 空格*/
select * from stu s1 where exists (select * from student s2 where s1.major = s2.major and s2.name = 'Rory')
4.3.0.2、给列设置友好列标题
/*使用as, 得到的结果里,对应列名称会被改变为as之后的字段*/
select Sno as 学号, Sname as 姓名 from stu
4.3.0.3、逻辑运算符

逻辑运算符均写在where后面

逻辑运算符说明
all一组比较都为true,则结果为true
and连接的两个布尔表达式都为true,则结果为true
any其中的一个为true则结果为true
between…and…或between操作数在某范围内则为true
exists子查询包含符合要求的行,则为true
in操作数等于表达式列表中的一个,则为true
like操作数与一种模式相匹配则为true,注意,like需要配合通配符使用,进行模糊查询
not对其他运算符取反,写在其他运算符之前
or连接的两个运算符有一个为true则结果为true
some一组比较中,有一些为true,则结果为true
4.3.0.3.1、通配符
通配符描述实例
%包含任意个字符的字符串select * from stu where name like '%泽%'
_仅为任意单个字符select * from stu where name like '李__'
[]指定范围: [a-f]或者集合: [asdc]中的任意单个字符select * from stu where name like '_R[a-f]%'
[^]不属于指定范围中的任何单个字符[^a-f][^asdasd]select * from stu where name like 'j[^a]%'

eg.

select * from stu where Sage not between 19 and 22
select * from stu where Sname like '李%'
select * from stu where indentify in ('班长','学委')

4.3.1、单表查询

select columnName1, columnName2, columnName2, ... from tableName where 限制条件
select columnName1, columnName2 group by columnName1 having 限制条件

/*columnName换为*则是全表查询*/
/*where是按行筛选,group by columnName having 限制条件 是按列筛选*/
语法说明
select * from tableQName where 限制条件根据限制条件查询全表满足条件的行的对应信息,不加where就是查询全表所有信息,相对的,having是按满足条件的列进行筛选,而having前面一定有group by
select * from tableName order by columnName DESC/ASC查询信息并升序或降序排序,ASC是升序,DESC是降序,默认为ASC
select * from tableName where columnName is NULL/is not NULL查询字段为空或不为空的数据段
select Cno, count(Sno) from SC group by Cno order by count(Sno) 分组查询示例
select top n columnName from tableName查询前n行列名为columnName的数据

使用distinct关键字还可以去掉表中重复的行:select distinct Sno from SC

4.3.2、多表连接查询

语法说明
select table1.*, table2.* from tableName1, tableName2 where table1.columnName = table2.columnName多表的等值连接查询
select table1, table2 from table1, table2 where table1.xxx = table2.xxx and ......复合条件连接, where中含多个连接条件,条件用and连接

4.3.3、嵌套查询

语法说明
select columnName1 from table1 where columnName2 in (select columnName2 from table2 where columnName3等相关限制条件)带有in谓词的子查询,同样的也有not in,即将一个查询块嵌套在另一个查询块中,外层查询又叫父查询,内层查询又叫子查询
select * from teacher where sex='男' and age > any(select age from teacher where sex = '女')使用anysomeall谓词的子查询,这些谓词是用来修饰引入子查询的比较运算符,其中all表示所有,any、some表示至少满足一个
select * from stu where exists(select * from sc where Sno = stu.Sno and Cno = '2214')使用exists谓词的子查询,同样的也有not exists,相当于进行存在性测试,外部where子句测试子查询返回的行是否存在,存在返回TRUE,否则为FALSE

4.3.4、集合查询

集合查询操作:并(union) - union(自动去重) 和 union all(不去重)交(intersect)差(except)

能够进行集合查询的前提:select语句必须拥有相同数量的列,并且类型兼容

语法说明
select语句1 集合查询操作 select语句2统一的语法

4.4、数据更新(增删改)

4.4.1、插入

4.4.2、更新

4.4.3、删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六时二一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值