概述
SQL功能: | 动词 |
---|---|
数据查询 | Select |
数据定义 | create,drop,alter |
数据操控 | insert,update,delete |
数据控制 | grant,revoke |
image-20211104110955813
一个关系型数据库管理系统的实例中
可以有多个数据库,一个数据库中
可以有多个模式,一个模式下
可以包含多个表、视图、索引;
数据字典:
数据字典是关系数据库管理系统的内部的一组系统表,他记录了所有的定义信息。
关系型数据库咋执行sql语句时就是在更新字典中的相应的信息;
模式
-
定义模式
-
创建语句:
Create schema <模式名> authorization <用户名>
-
-
说明:要创建爱模式必须有管理员权限,或者管理员授予的create schema权限。
- 目前,在create schema 中可以接受create table,create view,grant 字句,也就是可以在创建模式的时候将表、视图、授权一起定义了即: Create schema <模式名>authorization <用户名> [<表定义字句>|<视图定义字句>|<授权定义字句>];
实例:
create schema test authorization zhang Create table tab1( col1 smallint, col2 char(20), col2 int); #就是在创建模式的时候定义了一个表;
-
删除模式:
-
语句:
Drop schema <模式名> <cascade\|restrict>
-
说明:
- 其中cascade和restrict二选一, 前者是级联:表示在删除模式的情况下,把模式中所有的数据库对象(表,视图)全部删除; Restrict 选择限制:表示在该模式下如果定义了数据库对象(表,视图)则不允许删除;
-
基本表:
定义基本表
Create table <表>( <列><数据类型>[列级完整性约束条件], <列><数据类型>[列级完整性约束条件], … [<表及完整性约束条件>]);
-
实例:
create table student( sno char(12) PRIMARY key , sname char(9) UNIQUE, ssex char(2) ); #创建表的时候还可以定义和表相关的完整性约束条件; 如果约束条件涉及多个列,那么就要定义咋表级上 如: create table student( sno char(12) not null, sname char(9) UNIQUE, ssex char(2) primary key student(sno,sname) Foreign key(cno) references class(cno) ); #其中的class 是另一个表;
-
修改基本表
Alter table<表名> [add [column]<新列名><数据类型>[完整性约束]] [add<表级完整性约束>] [drop [column]<列名>[cascade|restrict]] [drop constraint<完整性约束>[restrict|cascade]] [alter column<列名><数据类型>]
-
实例:
#add字句用于增加新列,新的列级完整性约束,和表级完整性约束; #drop字句用于删除列和完整约束 #alter column 字句用于修改原有的列定义包括列名和数据类型 alter TABLE yggl1.salary1 add column niaho int; alter table yggl1.salary1 drop COLUMN niaho;
-
删除基本表
Drop table<表名>[restrict|cascade];
说明: 默认restrict;
数据的定义
SQL关系数据库支持三级模式:模式、外模式、内模式;
其中基本对象有:模式、表、视图、索引;所以定义,有这四个定义
创建 | 删除 | 修改 | |
---|---|---|---|
模式 | Create schema | Drop schema | |
表 | Create table | Drop table | Alter table |
索引 | Create index | Drop index | Alter index |
视图 | Create view | Drop view |
数据的查询
数据查询是数据库的核心操作:
查询语句:
Select [all|distinct] <目标列表达式>,[<目标列表达式>]…
From<表名或者视图名>,[<表名或者视图名>…] | (<select 语句>)[as]<别名>
[Where <条件表达式>]
[group by<列名1> [having<条件表达式>]]
[order by<列2>[ASC|DESC]];
# 含义:
#根据where语句中的条件表达式
#从from中的表、视图、派生表(注意可以用字句对表进行查询,把查询的结果集as别名,当做表)找出满足条件数据
#将数据进行group by 的列值相等进行分组,
#若有having则将符合having条件的组进行输出
#若有order by 则在输出前还需要根据列2进行排序;
单表查询
选择若干列 | SELECT name,sex,PhoneNumber from employees; |
---|---|
查询经过计算的值 | SELECT name,sex+3 as sex加3,PhoneNumber+100 as 不是电话 from employees; |
连接查询:
等值与非等值连接查询 | Select 语句中使用where连接谓词其条件表达式位连接条件: 如: SELECT * from employees,departments where employees.DepartmentID=departments.DepartmentID; 上面的是等值查询,也可以使用不等值查询,如!= >= <= between等 |
---|---|
自身连接 | 两个表都是自己的自己连接自己 |
外连接 | 一般情况下,连接查询显示的只是,符合连接条件的,如果我们想按照某一列显示所有而这列中不满足连接条件的用null显示,则需要使用外连接, select * student.sno,sname,ssex,sage,sdept,cno,grade from student ledt outer join sc on(student.sno=sc.sno); |
多表连接 | 和两表连接类似 |
嵌套查询(子查询) | 在SQL语句中一个 select -from-where 语句称为查询块,将一个查询块,嵌套在另一个查询块的****where****字句或者****having****短语的条件中的查询称为嵌套查询 ** 不相关子查询:也就是嵌套语句中的查询条件和父查询咩有关系; SELECT * from employees where employees.DepartmentID in (SELECT DepartmentID from departments); 注意:子查询返回的结果集,是一个集合,一般使用IN进行判断某个值是不是在这个集合中;(IN****常用**) 相关子查询:也就是嵌套语句中的查询和父查询有关系; Select * from sno,sname,sdept From student Where sdept = ( Select sdept from student Where sname='刘晨' ); 此处和结果集使用的是=这要求sdept必须是可以比较的某个值,而不是一个集合,否则会出问题; 比较子查询返回值:ANY ALL 子查询返回的是一个集合,当只有一个值的时候可以用=等去判断,若是一个集合,则需要用>any(大于子查询结果的某个值) ,>all(大于所有),<any(小于任意一个),<all,>=all,!=any(不等于任意一个),=all(等于所有),等去判断; |
派生表查询 | 子查询存在from中,如: select sno,cno from sc,( select sno,avg from sc group by sno) as avg_sc(avg_sno,avg_grade) |
---|---|
集合查询:select 语句查询的结果是一个集合,所以我们有了集合操作;
并:UNION
交:intersect
差:except
注意:参加集合操作的各个查询结果的列数,必须相同;对应的数据项也要相同
数据的更新
插入数据:
-
insert插入元组;
Insert into<表>[<属性列>,<属性列>…] value(<常量>,<常量>…);
-
Insert插入子查询结果
Insert into <表名> [<属性列>,<属性列>…] 子查询;
更新语法:
Update <表>
Set <列> =<表达式> ,[<列>=<表达式>]…
[where <条件>]
删除数据
Delete from <表名> [where <条件语句>] #没有where条件就是默认所有都符合条件; 注意条件语句也可以换成子语句;
索引:
索引是关系数据库管理系统的内部实现技术,属于内模式范畴;
建立索引
Create [unique] [cluster] index<索引名> on<表名>(<列>[次序],<列>[次序]...)
-
实例:
#表就是要建立索引的表; 索引可以建立在一个列上也可以是多个列上; #次序:表示的是大到小(DESC)还是小到大(ASC,默认) #unique表示一个索引值对应唯一的数据记录, #cluster 表示建立的索引是一个聚族索引; create UNIQUE index index_name on employees(name DESC);
修改索引
Alter index <旧缩影名> rename to <新索引名>
只能改名字
删除索引
Drop index <索引名>
空值处理
空值的现实:没有这个东西,比如一个学生没有考试,不能给0分,那就是一个null值;
正是有上述需求,所以有了列not null 和null两个选项;当一个列可以为null的时候,那么空值在不同的操作中的效果如何?
判断空值: | is null 或者 is not null 而不能直接使用= |
---|---|
空值的约束条件: | 有not null列级约束的列不能取空值; 码属性不能取空值;(码能为一个标识一个元组的属性) |
空值的运算 | 空值和别的值算术运算为空; 比较运算结果为unknown,(true****,****false****,****unknown****是****sql****语句中的三种布尔值)三者在参与and,or,not布尔运算的时候会有些出入 |
视图:
定义视图:
Create view<视图名>[<列名>,<列名>…] as <子查询> [with check option]; #任何对视图的更改都会导致基本表的改变(派生的列无法通过视图改变); #任何对基本表的改变都会自动更新视图 #最后一句表示,下次对view操作时带入子查询语句;
删除视图
Drop view <视图名>[cascade]
-
查询视图
#和查询表一样的,也就是 select - from -where - group by -having-order py
更新视图
注意视图只是一个映射,对基本表的一个映射,所以修改视图,不一定会修改基本表(也就是修改的东西可能保存不了)加了 with check option的才会修改基本表;
触发器:
在mysql中当我对一个表中的一部分数据进行改动时可以,出发某个事件。
比如当我修改一个学生表的学号数据时另个一成绩表中的学号也要做相应的修改;
定义触发器:
delimiter//
create trigger <触发器名字> 时间(after|before) 动作(insert|update|delete) on <表1>
for each row
befin
sql语句;
end
delimiter;
#含义当我在表1上执行了那些动作,那么就会执行begin 和 end中的sql语句
#是在对表1操作之前执行还是之后,有时间控制;
#由于sql语句是;结束,但是这个触发器还要执行end所以结束符号要改变
#delimiter// 修改结束符为://