7.9学习笔记
一、视图的介绍
1、定义:视图是一个虚拟表 它不在数据库中以存储的形式保存,(本身不包含数据),是在使用试图的时候动态生成。
2、视图的优点?
(1)提高查询效率
数据库中的数据查询非常复杂,可以简化sql语句
(2)安全
有些保密字段,可以通过创建视图限制用户对某些字段进行操作
(3)简单
不需要关心后面对应的表结构
3、视图的缺点?
(1)性能差
把视图查询结果转换称对表的查询
(2)修改限制
修改视图数据,必须把它转化为对基础表的修改
二、试图使用
1、创建一个视图
格式:create view 视图名 as (sql语句)
如;create view st1 as (
select sid,dept_name,name from dept INNER JOIN emp on dept1=dept2
)
select * from st1 ;
2、查看所有的表(物理表中没有视图)
show tables
3、查询视图
格式:select * from 视图名 ;
如:select * from st1 ;
4、查看创建好的视图
show create view 视图名
如:show create view st1 ;
5、删除视图
格式:drop view 视图名 ;
如:drop view st2 ;
三、试图的特点
1、视图是由基础表产生的虚拟表;
2、视图的创建不影响基础表
3、删除视图不影响基础表
4、视图删除数据,基础表也同时删除数据(合表的表无法删除,单表可以删除)
5、基础表删除数据,视图也删除数据,
6、视图不能修改表字段,不能对表字段删除
四、面试题
1、什么是视图?
2、视图是用来干什么?
3、视图的优缺点?
4、如何创建视图?
5、如何删除一个视图?
一、索引的介绍
1、定义:索引是一种数据结构
一个索引在存储的表中的数据结构
2、索引是在表的字段上创建
3、索引包含一列值,这个值保存在一个数据结构中
4、索引的作用?
(1)保证数记录的唯一性
(2)实现表与表之间的参照性
(3)减少排序盒分组的时间
(4)可以使用索引快速访问数据库中的指定信息
5、索引的缺点?
(1)索引占用物理内存
(2)索引对标进行增删改查,索引要动态维护,降低数据的维护速度
6、索引分类
(1)普通索引
index 简称 mul 最基本的索引,没有任何限制
(2)主键索引
primary key 简写 pri 是一种唯一索引 一个表中只有一个, 不能为空
(3)唯一索引
unique 简称 uni 是一个唯一索引,可为空,一个表中可以有多个唯一索引
了解:
全文索引、是组合索引、单列索引、聚焦索引、非聚焦索引
二、索引的创建
(一)建表后在添加索引
1、创建普通索引 (简写mul)
a、索引名和字段名不一致
格式:alter table 表名 add index 索引名(字段名) ;
如:alter table emp add index sym(age) ;
a、索引名和字段名一致
格式:alter table 表名 add index (字段名) ;
如:alter table emp add index (incoming) ;
2、添加主键索引
主键:primary key 主键
简称:pri
格式:
alter table 表名 add PRIMARY key (字段名)
如:
alter table student1 add PRIMARY key (stu_no)
特点:唯一、不能为空,一个表只有一个主键
3、添加唯一索引
唯一索引:unique
简写:uni
(1)索引名和字段名不一致
格式:
alter table 表名 add UNIQUE 所有名(字段名)
如:
alter table student1 add UNIQUE sym3(age)
(2)索引名和字段名一致
格式:
alter table 表名 add UNIQUE (字段名)
如;alter table student1 add UNIQUE (edit)
4、查看索引
(1)查看索引方法一: show index
格式:show index from 表名 ;
如:show index from student1 ;
(2)查看索引方法二: show keys
格式:show keys from 表名
如:show keys from student1 ;
(3)通过表结构查询索引:desc
格式:desc 表名
5、删除索引
(1)删除主键:
格式:ALTER table 表名 drop PRIMARY key ;
如:ALTER table student1 drop PRIMARY key ;
(2)删除普通索引和唯一索引,方法相同
删除索引名
格式:ALTER table 表名 drop index 索引名 ;
如:ALTER table student1 drop index sym3 ;
三、建表建索引
格式:
create table 索引名 (字段名 字符类型(字符长度) PRIMARY key,字段名2 字符类型(字符长度) UNIQUE,
字段3 字符类型(字符长度) DEFAULT 默认值 ,字段4 字符类型(字符长度) not null )
desc 表名 ; 查看表结构
建表添加索引:
create table s12(id int(10) PRIMARY key,name char(20) UNIQUE,
age int(10) DEFAULT 18 ,fs int(20) not null )
desc s12 ;
四、面试题?
1、什么是索引?
2、索引作用?
3、索引有哪些?
4、如何创建索引?
5、主键索引和唯一索引的区别?
(1)priamary key ,unique
(2)主键索引一个表就一个,唯一索引可以有多个
(3)主键索引不能为空,唯一索引可为空
(4)简写不一样:主键索引pri 、唯一索引uni
(5) 删除方式: 主键索引直接删除primary key, 唯一索引 删除 索引名
存储
一、存储的介绍
1、存储定义:
存储过程是实现某个特点功能的sql语句的集合,编译后的存储过程会保存在数据中,通过存储过程的名称反复的调用
2、存储过程的优点
(1)存储过程创建后,就可以反复的调用和使用,不需要重新写复杂的sql语句
(2)创建、修改存储过程不会对数据有任何的影响
(3)存储过程可以通过输入参数返回输出值
(4)通过存储过程中加入控制语句,可以加强slq语句的功能性和灵活
(5)创建存储,可以重复进行调用,可以减少数据开发人员的工作量
(6)防止sql注入
(7)造数据(重点)
二、存储中常用语句
1、查看单个存储的想起
格式:show create procedure 存储名 ;
如:show create procedure cc1 ;
2、查看所有已经创建好的存储过程详情
格式:show procedure status ;
如:show procedure status ;
3、查询指定数据库里的存储过程
格式:show procedure status where db=” 指定数据库“ ;
如:show PROCEDURE status where db="kk";
4、删除存储
格式:drop PROCEDURE 存储名; (已经创建成功存储名)
如:drop PROCEDURE cc2 ;
三、存储的创建格式
(1)基本结构
格式:
delimiter// #分割符号
drop PROCEDURE if EXISTS 存储名称; #判断存在存储删除, 加强键壮性
create procedure 存储名() #创建存储 ,括号无参数
BEGIN #开始
SELECT * from emp ; 存储体内容
select * from dept ;
end #结束
// 分隔符
call cc1() #call 调用 存储名称
如:
delimiter//
drop PROCEDURE if EXISTS cc1;
create procedure cc1()
BEGIN
SELECT * from emp ;
select * from dept ;
end
//
call cc1()
(2)带参数in:
格式:
delimiter// #分割符号
drop PROCEDURE if EXISTS 存储名; #判断存在存储名,存在删除
create procedure 存储名(in 变量名 变量字符类型 ) #创建存储
BEGIN #开始
SELECT * from emp where sid=x; #存储体语句
end #结束
// #分隔符
call cc1(1776) #call 调用 存储名称(实际参数)
如:
delimiter//
drop PROCEDURE if EXISTS cc1;
create procedure cc1(in x int )
BEGIN
SELECT * from emp where sid=x;
end
//
call cc1(1776)
(3)out 输出参数
输出变量
select 字段 into 变量名 from 表名 where 条件
@y 变量名
select @y 查看变量
如:
delimiter// #分隔符
drop PROCEDURE if EXISTS cc5;
create procedure cc5(out y int ) #out 输出值
BEGIN
SELECT age into y from emp where sid=1674;
end
//
call cc5(@y)
select @y #显示变量
(4)in 和out 存储 (输入和输出,变量不同)
SELECT * from emp
delimiter// #分隔符
drop PROCEDURE if EXISTS cc5;
create procedure cc5(in x int,out y int )
BEGIN
SELECT age into y from emp where sid=x;
end
//
call cc5(1776, @y)
select @y
(5)参数 inout 输入输出,变量是同一个
如:
SELECT * from emp
delimiter// #分隔符
drop PROCEDURE if EXISTS cc6;
create procedure cc6(inout x int )
BEGIN
set x=x+1;
end
//
set @x=5
call cc6(@x)
select @x
四、常用的语句
设置变量:
(1)set @变量名=值
set @变量名=值
(2)select 字段 into 变量名 from 表名 where 条件
(3)declare 声明变量
如: declae i int default 0;
(4)循环语句:
while 循环语句 :
sql语句
end while
(5)if语句
a、if 的单分支
格式:
if 条件 then:
sql1
else
sql2
end if ;
备注:一个if 对应一个end if
如:
SELECT * from emp
delimiter// #分隔符
drop PROCEDURE if EXISTS cc6;
create procedure cc6(in x int )
BEGIN
if x>10 THEN
select * from emp;
ELSE
select * from dept;
END if;
end
//
call cc6(8)
b、if的多分支
格式:
if 条件1 then
slq1
else if 条件2 then
sql2
else if 条件3 then
sql3
else:
slq4
end if ;
end if ;
end if ;
案例:
delimiter// #分隔符
drop PROCEDURE if EXISTS cc6;
create procedure cc6(in x int )
BEGIN
if x=10 THEN
select * from emp;
ELSE if x=100 THEN
select * from dept;
ELSE if x=0 then
select * from student;
ELSE
select * from sc;
END if;
end if;
END if;
end
//
call cc6(10)
五、实际应用
(一)造数
(1)早熟案例1 【造数数据写死了】
create table sss1(id int(10),name char(20) ); #创建表
select * from sss1 ; #查询表内数据
delimiter// #分隔符
drop PROCEDURE if EXISTS zs1; #判断是有zs1存储
create procedure zs1() #创建存储
BEGIN #开始
DECLARE i int DEFAULT 1; #declae 声明 i 默认1
WHILE (i<11) DO #while循环
INSERT into sss1(id) VALUES (i); #插入数据,插入变量
set i=i+1 ; #i+1 递增+1
END WHILE; #end while 结束循环
SELECT * from sss1 ; #查询插入完后的语句
end #结束
// #分隔符
call zs1()
(2)将造数据数据写变量
drop table sss1 ;
create table sss1(id int(10),name char(20) ); #创建表
select * from sss1 ; #查询表内数据
delimiter// #分隔符
drop PROCEDURE if EXISTS zs1; #判断是有zs1存储
create procedure zs1(in x int) #创建存储
BEGIN #开始
DECLARE i int DEFAULT 1; #declae 声明 i 默认1
WHILE (i<x) DO #while循环
INSERT into sss1(id) VALUES (i); #插入数据,插入变量
set i=i+1 ; #i+1 递增+1
END WHILE; #end while 结束循环
SELECT * from sss1 ; #查询插入完后的语句
end #结束
// #分隔符
call zs1(8)
(3)造数前,统计表中总数据,在表的总数据+数据
drop table sss1 ;
create table sss1(id int(10),name char(20) ); #创建表
select * from sss1 ; #查询表内数据
delimiter// #分隔符
drop PROCEDURE if EXISTS zs1; #判断是有zs1存储
create procedure zs1(in x int) #创建存储
BEGIN #开始
DECLARE i int DEFAULT (select count(*) from sss1); #declae 声明 i 默认1
WHILE (i<x) DO #while循环
INSERT into sss1(id) VALUES (i); #插入数据,插入变量
set i=i+1 ; #i+1 递增+1
END WHILE; #end while 结束循环
SELECT * from sss1 ; #查询插入完后的语句
end #结束
// #分隔符
call zs1(20)
实战2:
根据emp员工表
(1)当传如的参数小于表内数据的条数时,显示每个部门给员工的总收入
select sum(incoming) from emp group by dept2
(2)当传如的参数等于表内数据的条数时,显示emp整个表的数据
select * from emp ;
(3)当传如的参数大于于表内数据的条数时,显示表中数据条数
sele count(*) from emp;
浙公网安备 33010602011771号