关于mysql的sql语句的汇总(学习笔记)03(mysql高级应用)

    xiaoxiao2021-12-14  18

    – 索引:

    (在某种程度上可以把数据库看做是一本书,吧索引看做是书的目录,通过目录查找书中的信息,比没有目录的书方便快捷)** 索引一旦创立,将由数据库自动管理和维护;

    须知:在sql中语法格式的一些约定符号:

    尖括号<>中的内容为必选项;中括号[]中的内容为任选项;[,…]的意思是等等;大括号{}与竖线 | 表明此处为选择项,在所列出的各项中仅需选择一项; 索引分为: --普通索引和唯一索引; --单列索引和组合索引; --全文索引; --空间索引; 组合索引,是指在表的多个字段创建的索引; 全文索引,允许在这些索引列中插入重复值和空值,全文索引可以在char,varchar,或者text类型的列上创建;mysql中只有MyISAM存储引擎支持全文索引; 创建索引的注意事项: 当给表创建unique约束时,mysql会自动创建唯一索引; 索引的名称必须符合mysql的命名规范,且必须是表中唯一 可以在创建表时创建想索引,或是给现存表创建索引; 只有表的所有者才能给表创建索引; 创建唯一索引时,应保证创建索引的列不包括重复的数据(两个为null的也算重复值),如果有这种数据,必须现将其删除,否者索引不能被成功创建; ------------------------------- 创建索引基本格式1:[unique|fulltext|spatial]<index|key> [索引名](属性名[(长度)][asc|desc][,...]) 创建索引基本格式2:create [unique|fulltext|spatial] index <索引名> on <表名> (属性名[(长度)][asc|desc][,...]); 删除索引基本格式:drop index<索引名> on <表名>; ------------------------------- -- 在创建表的时候创建索引; create table student( ... unique index id_sno(sno) desc ); ------------------------------ -- 在现有表中创建索引: ---------------------------------- -- 删除索引: drop index id_name on student;

    – 视图

    提示:保存视图的时候,实际上保存的就是select查询.保存的是视图的定义而不是select查询的结果; 注意:创建视图时,注意编码要保持一直,不然会报1267的error.出现乱码现象; -- sql语句创建视图(创建视图是不要用 阿拉伯数字命名 ,删除时好像有语法错误): create View view_name [(Column[,...n])] as <select语句> [with check option] 说明:with check option:强制所有通过视图修改的数据瞒住select语句中指定的选择条件; ---------------------- 事例: create view v_name as select A.sno,sname,cname,degree from student A,course B,sc C where A.sno and B.cno=C.cno and cname='数据库'; ---------------------- 视图定义后,可以像基本表一样进查询.例如: select * from v_name; -- 视图的使用: 注意:修改视图,会同时修改基表; 注意:如果视图中有下面所述属性,则插入,更新或者删除操作将失败 : -1-视图定义中的from子句包含两个或者多个表,且select选择列表达式中的列包含来自多个表的列; -2-视图的列是从集合函数派生的; -3-视图中的select语句包含group by 子句或distinct选项; -4-视图的列是从常量或表达式派生的; -- 视图的修改: alter View View_name [(column[,...n])] as <select语句> -- 如果在创建视图的时使用了with check option,则在alter中也必须使用; [with check option] --视图的删除 drop View <视图名> --可同时删除多个,多个时用 , 分开;

    – SQL语言基础(存储过程和函数):

    1.常量8种; -- 字符串常量,十进制常量,十六进制常量,日期常量,实型常量,位字段值,布尔常量,null常量; 2.变量; -- 变量名不能和命令和函数名相同; -- 在mysql中存在三种类型的变量:系统变量,用户变量,局部变量;其中系统变量有分为全局变量和会话变量两种; -- 1.全局变量和回话变量.全局变量在mysql启动时由服务器自动将他们初始化为默认值,这些默认值可以通过my.ini文件来更改; -- 会话变量在每次创建新的连接的时候,由mysql来初始化,mysql会将当前所有全局变量的值复制一份作为会话变量; -- 大多数的系统变量应用于其他sql产品保持一致,某些特定的系统变量是要省略 @@ 的,如:current_date,current_user; -- 可以使用系统全局变量@@version查看当前使用的mysql的版本信息和当前日期,sql语句如下: select @@version as '当前系统版本',current_date; -- 图片如下 -- 图1:

    ——————

    -- a.显示系统清单: show [global|session] variables [like '字符串']; 其中,global表示全局变量,session为会话变量.默认为会话变量; -- 例: 表示以 a 开头的所有系统变量的值:show variables like 'a%'; 图片如下 -- 图2:

    —————–

    --b.修改系统变量的值: 形如: set system_var_name = expression set_system_var_name为系统变量名,名称前面可以添加,globalsession等关键字; -- 注意: 1.要想更改全局变量的值,需要拥有super权限; 2.有些系统变量不可以改变,如:系统版本,系统日期; -- 用户变量: 定义和初始化一个用户变量可以使用setselect语句,其语法格式如下: set @user_variable[:] = expression1 [,user_variable = expression2,...] 或 set @user_variable:=expression [,user_variable:= expression2,...]; -- 说明:对于set语句,可以使用 = 或 := 作为分配符.也可以用select 语句代替set语句来为用户变量分配一个值,在这种情况下,分配符必须为 := ,而不能是 = ,因为在非set语句中 = 被视为比较操作符; -- 例如:创建用户变量name并赋值为 王小强; set @name = '王小强';select @name := '王小强'; 注意:1. @ 符号必须放在一个用户变量的前面, 便于与列名区分开,如果给name重新赋不同类型的 2.在group by,order by,having中不能使用select中的用户变量,因为在select中,表达式发送 到客户端后才进行计算; -- 局部变量: 局部变量的作用范围实在begin...end语句块中,可以使用declare 语句进行定义,局部变量不用 @ ; 局部变量与begin...end语句块,流程控制语句只能用于函数,存储过程,触发器和事务的定义中; 基本语法:declare var_name [,...] type [default value] 例子:declare myvar int default 10; 赋值: set myvar = 100; --3.sql流程控制语句: --注:流程控制语句必须和存储过程和存储过程配合 --------------- begin ... end ---------------- if ... then ... else if ... then ... else ... end if; -- 注意:如果逻辑表达式中有select语句必须用括号把select括起来; ----------------- -- 这个语句运行好像不对: if (select office from department where deptname = '计算机工程系') is null then begin select '办公地点不像' as 办公地点; select * from department where deptname = '计算机工程系'; end; else select office from department where deptname = '计算机工程系'; end if; ---------------------- case分支语句: 基本格式:case input_expression when when_expression then result_repression; [...n] [else else_result_expression]; end case; 说明:1.input_expression:使用case语句时所计算的表达式,可以是任何有效的表达式. 2.when_expression:用来和input_expression表达式作比较的表达式, input_expression和每个when_expression表达式的数据类型必须相同,或者可以隐形转换; 3.result_expression:指当input_expression=when_expression的取值为true时,需要返回 的表达式. 4.else_result_expression:指当input_expression=when_expression的取值为false时, 需要返回的表达式; 例子: declare dj int default 0; select count(*) into dj from sc where degree<60; case when dj>=100 then select '不及格门数' as 档次; when dj>=50 and dj<100 then select '不及格门数一般' as 档次; when dj>=1 and dl<50 then select '不及格门数' as 档次; else select '没有及格的' as 档次; end case; --------------------- 循环语句: 基本格式:while 布尔值 do {leave begin_lable;} {iterate begin_label;} end while; 说明:leave begin_label:用与退出while循环; iterate begin_label:用与跳出本次循环,直接进入下一次循环; 例子: set @i=,@sum=0; while @i <= 100 DO begin set @sum = @sum+@i; set @i = @i + 1; end; end while; select @sum; ----------------------- 注释: 在mysql中支持三种注释:#,/* */,--; ----------------------- mysql常用的函数: 游标: (以上内容有空就去看看,老师没有讲到;) ----------------------- 存储过程和存储函数: ----------------------------------- 1.创建存储过程: 基本格式: -- 可一有参数,也可以不传入参数,如: in param_name char(10) create procedure 存储过程名 (<[in|out|inout] 参数名 type参数类型>) [characteristic[,...]] 语句体(可以使用: begin ...语句体 end; ) 关于characteristic的具体介绍看下面 -- 图3:

    例子: use gradem; delimiter $ -- 这个在命令行界面中要用,在查询中可以不用; create procedure pro() reads sql data begin select sno,sname,classno,saddress from student where saddress like '%青岛%' order by sno; end; -- 在命令行中是要把 ; 换成上面定义的 $ ,在查询中不需要; delimiter; -- 在查询中不需要这个语句,命令行中需要 执行存储过程的语句: call pro(); ------------------------------- 2.创建存储函数: 基本格式:create function 函数名称([function_parammeter[,...]]) returns type; [character[,...]] 语句体(说明:这里可以用begin ... end 语句体) 说明:function_parameter和存储过程中相同; returns指定返回值的类型; 例子: create function func_name(class_no varchar(8)) returns varchar(8) begin return (select header from class where classno = class_no); end; 执行存储函数:select func_name('20060101'); 3.查看存储过程和函数: 基本格式:1.show {procedure|function} status [like '函数名']; 2.show create [procedure|function] name; 说明:show ... status语句只能查看储存过程或函数是操作哪一个数据库,存储过程或函数的名称、 类型、谁定义的、创建和修改时间、字符编码等信息.但是这个语句不能查询存储过程或函数的具体定 义.若要查看具体定义要用 show create语句; 也可以从information_schema.Routines表中查看存储过程和函数的具体信息; 4.修改存储过程和函数: 基本格式:alter {procedure|function} 名称 [characteristic ...]; 说明:characteristic 的说明见上面--图3; 例子: alter function func_name -- 修改; MODIFIES sql data sql-- 访问数据的全限; SECURITY INVOKER -- 修改安全类型; COMMENT '0000'; -- 修改函数注释; 5.删除存储过程和函数: drop {procedure|function} [if exists] 要删除的名称; 说明:其中if exists是mysql的扩展,如果函数和存储过程不存在,它可以防止发生错误,产生一个show warning的警告;

    – 触发器

    说明:触发器是一种特殊的存储过程,它与表紧密相连,可以是表定义的一部分;触发器是基于一个表建立的; 在表的数据做了任何修改时,触发器会自动执行,触发器可以通过数据库中的相关表进行层叠修改;触发器可以强制限制,这些比用check约束所定义的更复杂;

    1.创建触发器: 基本格式:CREATE trigger trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_statement; 说明:trigger_time:指定触发器触发的时机.可以指定为 after 或者 before; trigger_event:指明触发的程序的语句类型:1.insert 2.update 3.delete FOR EACH ROW:行级触发和语句级触发两种;不加 for each row为语句级触发; 丽姐讲的比较通俗的理解: 分析: 监视谁: table_name; 监视动作: trigger_event; 出发时间:trigger_time; 触发事件: trigger_statement; 关于new和old的总结: 总结: new在before触发器中赋值,取值;在after触发器中取值。 new是新插入的数据,old是原来的数据 insert只会有new,代表着要插入的新记录 delete只会有old,代表着要删除的记录 例子1: create trigger t after insert on student for each row begin insert into class(classno) value(new.sno); end; 例1的说明:创建名为t的触发器,当在student表中执行插入操作后,在class表中插入classno为 新插入的sno的值; 例子2: create trigger t2 after update on student for each row begin if new.sno!=old.sno then update sc set sno=new.sno where sno = old.sno; end if; end; 例2的说明:创建名为t2的触发器,当在student表中执行更新操作后,先判断所更新的那行的sno的新 旧的值,是否一样,不一样就更新表sc中的相应数据; 2.查看触发器: 语句1:show trigger; 语句2:select * from information_schema.triggers; 语句3(精确查询): select * from information_schema.triggers where trigger_name='触发器名称'; 注意:触发器的名称要用单引号,括起来; 3.删除触发器: 语句:drop trigger [dbname] trigger_name; 注意:dbname为数据库的名称,默认值为当前的数据库,也可以这样用: use db_name; drop trigger trigger_name;
    转载请注明原文地址: https://ju.6miu.com/read-968985.html

    最新回复(0)