zoukankan      html  css  js  c++  java
  • SQL学习笔记14——SQL中其他知识点

    SQL学习笔记14——SQL中其他知识点

    视图

    含义

    • mysql5.1版本出现的新特性,本身是一个虚拟表,它的数据来自于表,通过执行时动态生成,只保存了sql逻辑,不保存查询结果,和普通表一样使用
    • 比如:舞蹈班(领导检查时才生成)和普通班级的对比

    案例

    1. 查询姓张的学生名和专业名
    #保存学生信息和专业信息内连接表为一个视图
    CREATE VIEW v1
    AS
    SELECT stuname,majorname
    FROM stuinfo a
    INNER JOIN major m
    ON s.majorid=m.id;
    
    #从视图中查询姓张的学生信息
    SELECT * FROM v1 WHERE stuname LIKE '张%';
    

    特点

    1. 简化sql语句
    2. 提高了sql的重用性
    3. 保护基表的数据,提高了安全性
    4. 应用场景:多个地方用到同样的查询结果且该查询结果使用的sql语句较复杂

    创建视图

    语法

    create view 视图名
    as
    查询语句;
    

    修改视图

    1. 方式一:
    #该语句其实也可以创建视图
    create or replace view 视图名
    as
    查询语句;
    
    1. 方式二:
    alter view 视图名
    as
    查询语句;
    

    删除视图

    DROP VIEW 视图名,视图名,...;
    

    查看视图

    DESC myv3;
    
    SHOW CREATE VIEW myv3;
    

    更新视图

    CREATE OR REPLACE VIEW myv1
    AS
    SELECT last_name,email
    FROM employees;
    
    #1.插入
    INSERT INTO myv1 VALUES('张飞','zf@qq.com');#原始employees表也被插入了这条数据
    
    #2.修改
    UPDATE myv1 SET last_name = '张无忌' WHERE last_name = '张飞';#原始表也被改了
    
    #3.删除
    DELETE FROM myv1 WHERE last_name = '张无忌';#原始表也被删除了
    

    注意:视图一般用于查询的,而不是更新的,所以具备以下特点的视图都不允许更新
    ①包含分组函数、group by、distinct、having、union 【all】
    ②join
    ③常量视图
    ④where后的子查询用到了from中的表
    ⑤用到了不可更新的视图
    ⑥select中包含了子查询

    视图和表的对比

    创建语法的关键字 是否实际占用物理空间 使用
    视图 create view 只是保存了sql逻辑 增删改查,一般不能增删改,也不建议用视图来做增删改
    create table 保存了数据 增删改查

    变量

    分类

    1. 系统变量
      • 全局变量
        • 作用域:服务器每次启动将会为所有的全局变量赋初始值,针对于所有的会话(连接)有效,但是不能跨重启,想要跨重启需要修改配置文件my.ini
      • 会话变量
        • 作用域:仅仅针对于当前会话(连接)有效
    2. 自定义变量
      • 用户变量
      • 局部变量

    系统变量

    说明:变量由系统提供,不是用户定义,属于服务器层面
    注意:如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认session
    语法:

    1. 查看所有的系统变量
    show global|【session】 variables;
    
    1. 查看满足条件的部分系统变量
    show global|【session】 variables like '%char%';
    
    1. 查看指定的某个系统变量的值
    select @@global.|【session.】系统变量名;
    
    1. 为某个系统变量赋值
    #方式1
    set global|【session】 系统变量名 = 值;
    
    #方式2
    set @@global.|【session.】系统变量名 = 值;
    

    自定义变量

    说明:变量是用户自定义的,不是由系统提供的
    使用步骤:
    * 声名
    * 赋值
    * 使用(查看、比较、运算等)

    1. 用户变量
      • 作用域:针对于当前会话(连接)有效,同于会话变量的作用域
      • 应用在任何地方,也就是begin end里面或begin end外面
    #①声明并初始化
    ##方式1
    SET @用户变量名=值;
    
    ##方式2
    SET @用户变量名:=值;
    
    ##方式3
    SELECT @用户变量名:=值;
    
    ####以上方式都可以不赋值,只做声明
    
    
    #②赋值(更新用户变量的值)
    ##方式1:通过SET或SELECT
    SET @用户变量名=值;#或
    SET @用户变量名:=值;#或
    SELECT @用户变量名:=值;
    
    ##方式2:通过SELECT INTO
    SELECT 字段 INTO @用户变量名
    FROM 表;
    
    
    #③使用(查看用户变量的值、比较、运算等)
    SELECT @用户变量名;
    
    1. 局部变量
      • 作用域:仅仅在定义它的begin end中有效
      • 应用在begin end中的第一句话!!!
    #①声明
    DECLARE 变量名 类型;#只声明
    DECLARE 变量名 类型 DEFAULT 值;#声明且赋初值
    
    
    #②赋值
    ##方式1:通过SET或SELECT
    SET 局部变量名=值;#或
    SET 局部变量名:=值;#或
    SELECT @局部变量名:=值;
    
    ##方式2:通过SELECT INTO
    SELECT 字段 INTO 局部变量名
    FROM 表;
    
    
    #③使用(查看用户变量的值、比较、运算等)
    SELECT 局部变量名;
    

    存储过程和函数

    • 类似于java中的方法
    • 好处
      • 提高代码的重用性
      • 简化操作

    存储过程

    • 含义:一组预先编译好的SQL语句的集合,理解成批处理语句
    • 好处
      • 提高代码的重用性
      • 简化操作
      • 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

    创建语法

    CREATE PROCEDURE 存储过程名(参数列表)
    BEGIN
    	存储过程体(一组合法的SQL语句)
    END
    

    注意:

    1. 参数列表包含三部分:参数模式 参数名 参数类型,举例:IN stuname VARCHAR(20)
    2. 参数模式
      • IN:该参数可以作为输入,也就是该参数需要调用方传入值,IN其实可以省略,下面说的OUT、INOUT则不能省略,最好都不省略
      • OUT:该参数可以作为输出,也就是该参数可以作为返回值
      • INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
    3. 如果存储过程体仅仅只有一句话,begin end可以省略,存储过程体中的每条SQL语句的结尾要求必须加分号,存储过程的结尾可以使用DELIMITER重新设置,语法是DELIMITER 结束标记,如DELIMITER $,调用时也得使用新的结束标记,这样做的目的是让程序知道你的存储过程的结束位置,如果多个存储过程想使用相同的结束标记,DELIMITER可以只设置一次,注意这个更改后,后面的语句结束标记也不再是分号,而是自己定义的结束标记,可以自己再次使用DELIMITER ;改回来
    4. 调用in模式的参数:call sp1(‘值’);
      调用out模式的参数:set @name; call sp1(@name);select @name;
      调用inout模式的参数:set @name=值; call sp1(@name); select @name;

    调用语法

    CALL 存储过程名(实参列表);
    
    1. 演示调用空参的存储过程
    use girls;
    SELECT * FROM admin;
    DELIMITER $
    CREATE PROCEDURE myp1()
    BEGIN
    	INSERT INTO admin(username,`password`)
    	VALUES('LILY',0000),('ROSE',0000);
    END $
    CALL myp1()$
    SELECT * FROM admin;
    
    1. 演示调用in模式参数的存储过程
    #案例1.创建存储过程实现根据女神名查男神信息
    CREATE PROCEDURE myp2(IN beautyname VARCHAR(20))
    BEGIN
    	SELECT bo.*
    	FROM boys bo
    	RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
    	WHERE b.`name`=beautyname;
    END $
    
    CALL myp2('小昭')$
    
    #案例2.创建存储过程实现查用户是否登录成功
    CREATE PROCEDURE myp3(IN username VARCHAR(20),IN password VARCHAR(20))
    BEGIN
    	DECLARE result INT DEFAULT 0;#声明并初始化局部变量
    	
    	SELECT COUNT(*) INTO result#赋值
    	FROM admin
    	WHERE admin.username = username
    	AND admin.password = password;#需要加表限制,否则就近原则都是输入参数(是局部变量)的username、password
    
    	SELECT IF(result>0,'成功','失败');#使用
    END $
    
    CALL myp3('张飞','8888')$
    
    1. 演示调用out模式参数的存储过程
    #案例1,根据女神名,返回对应的男神名
    CREATE PROCEDURE myp4(IN beautyname VARCHAR(20), OUT boyname VARCHAR(20))
    BEGIN
    	SELECT bo.boyname INTO boyname
    	FROM boys bo
    	INNER JOIN beauty b ON bo.id = b.boyfriend_id
    	WHERE b.`name`=beautyname;
    END $
    
    
    SET @bname$#其实可以省略
    CALL myp4('小昭',@bname)$
    SELECT @bname$
    
    #案例2,根据女神名,返回对应的男神名和男神魅力值
    CREATE PROCEDURE myp5(IN beautyname VARCHAR(20), OUT boyname VARCHAR(20), OUT usercp INT)
    BEGIN
    	SELECT bo.boyname, bo.usercp INTO boyname, usercp
    	FROM boys bo
    	INNER JOIN beauty b ON bo.id = b.boyfriend_id
    	WHERE b.`name`=beautyname;
    END $
    
    CALL myp5('小昭',@bname,@usercp)$
    SELECT @bname,@usercp$
    
    1. 演示调用inout模式参数的存储过程
    #案例1:传入a和b两个值,最终a和b都翻倍并返回
    CREATE PROCEDURE myp8(INOUT a INT, INOUT b INT)
    BEGIN
    	SET a = a*2;
    	SET b = b*2;
    END $
    
    SET @m=10$
    SET @n=20$
    CALL myp8(@m,@n)$
    SELECT @m,@n$
    

    存储过程的删除

    语法:

    DROP PROCEDURE 存储过程名#删存储过程只能一次删除一个
    #不允许DROP PROCEDURE p1,p2;
    

    查看存储过程的信息

    语法:

    SHOW CREATE PROCEDURE myp2;
    # 不支持 DESC myp2;这种方式只是查看表,包含虚拟表等,如视图
    

    修改存储过程

    没办法修改存储过程的begin end内的SQL语句,一般也不去修改存储过程,想要改一般是通过直接删除原来的存储过程,然后重新定义新的存储过程

    函数

    • 含义:一组预先编译好的SQL语句的集合,理解成批处理语句
    • 好处
      • 提高代码的重用性
      • 简化操作
      • 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
    • 区别:存储过程可以有0个返回,也可以有多个返回,适合做批量插入、批量更新;函数有且仅有1个返回,适合做处理数据后返回一个结果

    创建语法

    CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
    BEGIN
    	函数体
    END
    

    注意:

    • 参数列表包含两部分:参数名 参数类型
    • 函数体肯定会有return语句,如果没有会报错,建议return语句放最后
    • 当函数体中仅有一句话,则可以省略begin end
    • 像存储过程一样使用delimiter语句设置结束标记

    调用语法

    SELECT 函数名(参数列表)
    

    案例:

    1. 无参有返回
    #返回公司的员工个数
    CREATE FUNCTION myf1() RETURNS INT
    BEGIN
    	DECLARE c INT DEFAULT 0;#定义变量
    	SELECT COUNT(*) INTO c#赋值
    	FROM employees;
    	RETURN c;
    END $
    
    SELECT myf1()$
    
    1. 有参有返回
    #根据员工名,返回它的工资
    CREATE FUNCTION myf2(empname VARCHAR(20)) RETURNS DOUBLE
    BEGIN
    	SET @sal=0;#定义用户变量
    	SELECT salary INTO @sal#赋值
    	FROM employees
    	WHERE last_name = empname;
    
    	RETURN @sal;
    END $
    
    SELECT myf2('kochhar')$
    

    查看函数

    SHOW CREATE FUNCTION myf3;
    

    删除函数

    DROP FUNCTION myf3;
    
  • 相关阅读:
    使用RedisDesktopManager工具,解决连接失败问题
    安装redis,搭建环境
    CentOS 7下GitLab搭建及配置
    Metasploit之Hash攻击(Hashdump、Quarks PwDump、Windows Credentials Editor、Mimikatz)
    Metasploit之令牌窃取
    Metasploit之漏洞利用( Metasploitable2)
    Metasploit之主机扫描
    Metasploit模块简介
    WAF的那些事
    XXE漏洞介绍 & XXE漏洞攻击 & 修复建议
  • 原文地址:https://www.cnblogs.com/sanmujun/p/12657446.html
Copyright © 2011-2022 走看看