SQL基础sql
标识符、注释、数据类型、常量与变量、操做符、表达式数据库
函数安全
系统函数服务器
存储函数网络
流程控制语句ide
游标模块化
存储过程函数
@:以@开头的标识符表示一个局部变量或者一个函数的参数性能
@@:以@@开头的标识符表示一个全局变量fetch
单行注释:##
多行注释:/* */
在SQL中,表和视图的列、局部变量、函数的参数和返回值、存储过程的参数和返回值(具备返回代码)和表达式等都具备相关的数据类型。
常量:常量也称为文字值或标量值,是指程序运行中值始终不改的量。
变量:变量就是在程序执行过程当中,其值是能够改变的量。
系统定义和维护的全局变量:
系统全局变量是MySQL系统提供并赋值的变量。全局变量以两个@符号开头。
1 # 使用系统全局变量@@VERSION查看当前使用的MySQL的版本信息 2 select @@version;
用户定义用来保存中间结果的局部变量:
局部变量是做用域局限在必定范围内的SQL对象。局部变量被引用时要在其名称前加上标志@。
局部变量的声明和赋值
使用DECLAREA语句声明局部变量,局部变量的做用范围在它被声明的BEGIN…END复合语句内。
DECLAREA语句的语法格式以下:
DECLARE 变量名[,…] 数据类型 [DEFAULT 默认值];
声明局部变量后要给局部变量赋值,直接给变量赋值可使用SET语句。SET语句的语法格式以下:
SET 变量名=表达式[,变量名=表达式,…];
1 ## 将局部变量var1声明为char类型,长度值为10,并为其赋值为“程菲”,SQL语句以下: 2 begin 3 declare var1 char(10); 4 set @var1='程菲'; 5 end 6 7 8 ##经过局部变量查看D_sample数据库中的学生信息,条件是查看student表中“政治面貌”为“中共党员”的学生信息。SQL语句以下: 9 use D_sample; 10 set @政治面貌='中共党员'; 11 select * from student 12 where 政治面貌=@政治面貌;
在MySQL中,还可使用SELECT…INTO语句把数据表中选定的字段值直接存储到变量中。
其语法格式以下:
SELECT <字段名>[,...] INTO <变量名>[,...] FROM <表名>;
1 ## 经过局部变量查看D_sample数据库中的学生信息,条件是查看student表中学号”为“201507002”的学生姓名和性别信息。SQL语句以下: 2 use D_sample; 3 select 姓名,性别 into @name,@sex from student 4 where 学号='201507002'; 5 select @name,@sex;
注意:局部变量分为存储变量和会话变量。
存储变量就是使用DECLAREA语句建立的变量,而且初值为NULL的变量。
会话变量就是直接使用set 或者select into语句赋值,不进行定义的变量,这个变量在此次会话框中都有效,而且初值即为赋的值。
SQL的操做符和其它高级语言的操做符相似,由变量、常量和函数链接起来并指定在一个或多个表达式中执行的操做。
在SQL语言中,表达式由变量、常量、操做符、函数等元素组成。
1 ## 在D_sample数据库中,查询一个按平均成绩降序排列的结果集,包括学生“学号”、“平均成绩”及“考生信息”3列,其中考生信息列又由学生“姓名”、“性别”这些来自student表的数据组成。 2 3 4 use D_sample; 5 -- concat是一个函数,链接函数。space是表示空格函数。产生参数个空格。 6 select a.学号,avg(成绩) as '平均成绩',concat(姓名,space(6),性别) as '考生信息' 7 from sc a inner join student b on a.学号=b.学号 8 group by a.学号 -- 分组后才有平均成绩那一项。 9 order by 平均成绩 desc;
数学函数对数值表达式进行数学运算,并将运算结果返回给用户。
ABS(数值表达式)函数用来得到一个数的绝对值。
1 select abs(-876),abs(-2.345);
FLOOR(数值表达式)函数用于得到小于一个数的最大整数值,CEILING(数值表达式)函数用于得到大于一个数的最小整数值。
1 select floor(-1.2), ceiling(-1.2), floor(9.9), ceiling(9.9);
ROUND(数值表达式)函数用于得到一个数的四舍五入的整数值。
1 select round(34.567,2), round(19.8,0);
SIGN(数值表达式)函数返回数字的符号,返回的结果是正数(1)、负数(-1)或者零(0)。
1 select sign(-2), sign(2), sign(0);
SQRT(数值表达式)函数返回一个数的平方根。
1 select sqrt(25), sqrt(15), sqrt(1);
字符串函数是对字符串(char 或varchar数据类型)输入值执行操做,并返回一个字符串或数字值。
ASCII(字符表达式) 函数可返回字符表达式中最左侧字符的ASCII码值。
1 select ascii('A'), ascii('a'), ascii('中文');
CHAR(整型表达式)函数将整型的ASCII码转换为字符。
1 select char(65),char(97);
LEFT(字符表达式,整型表达式)函数返回字符串中从左边开始的指定个数的字符。RIGHT(字符表达式,整型表达式) 函数返回字符串从右边开始的指定个数的字符。
1 select left('数据库应用技术',3), right('数据库应用技术',2);
LENGTH(字符表达式)函数返回某个指定字符串的长度,不计字符串后的空格。
1 select length('中华人民共和国'), length('Tsinghua University press');
LOWER(字符表达式)函数将字符表达式中的大写字母转换为小写字母。UPPER(字符表达式) 函数将字符表达式中的小写字符转换为大写字符。
1 select lower('WonDERful'), upper('Tsinghua University press');
LTRIM(字符表达式)函数返回删除了前导空格字符后的字符表达式。RTRIM(字符表达式)函数截断全部尾部空格后返回一个字符串。
1 select concat(rtrim('计算机应用技术专业 '),ltrim(' 数据库应用技术'));
CONCAT(字符串1,字符串2,...)函数返回链接参数产生的字符串。
1 select concat(‘MySQL’,’数据库管理系统’);
SUBSTRING(字符表达式,起始点,n)函数返回字符表达式中从“起始点”开始的n个字符。
1 use D_sample; 2 select substring(学号,5,2) as 专业大类代码 3 from student;
日期时间函数对日期和时间输入值执行操做,将返回一个字符串、数字或日期和时间值。
CURDATE()函数返回当前日期。YEAR(日期)、MONTH(日期)和DAY(日期)函数返回日期的年、月和日。
1 select curdate(),year('2016-1-12'), month('2016-1-12'),day('2016-1-12');
ADDDATE(日期,INTERVAL 数值 日期元素)函数可按照“日期元素”给定的日期单位,返回“日期”加上“数值”的新日期。
1 select adddate('2016-1-12',interval -2 year), adddate('2016-1-12',interval 3 month), adddate('2016-1-12',interval 60 day);
DAYNAME(日期)函数返回日期对应的工做日名称。
1 select dayname('2015-03-01');
DATEDIFF(日期1,日期2)函数返回起始时间日期1和结束时间日期2之间的天数。
1 select datediff('2011-3-3', '2014-4-6');
数据类型转换函数就是把一个值转换为指定的数据类型。
CAST(表达式 AS 数据类型)函数将表达式的类型转换为指定的数据类型。
1 select concat('考试成绩是:',cast(90 as char(5)));
CONVERT(表达式,数据类型(长度))函数将表达式的类型转换为指定的数据类型。
1 select concat(‘考试成绩是:’,convert(90,char(5)));
聚合函数经常使用于对一组值进行计算,而后返回单个值。聚合函数主要用于select 语句的group by子句、having子句。
count(字段):计算个数
max(字段):计算该字段的最大值
min(字段):计算字段的最小值
sum(字段):计算该字段的和
avg(字段):计算字段的平均值
控制流程函数的做用是进行条件判断。根据判断条件,执行不一样的分支并将运算结果返回给用户。
IF(表达式1,表达式2,表达式3)函数表达式1为真将返回表达式2的值,不然返回表达式3的值。
1 select if(23%2=0,’是偶数’,’是奇数’);
CASE 输入值 WHEN 匹配值1 THEN 结果1 [WHEN 匹配值2 THEN 结果2...] [ELSE 其它结果] END函数输入值与哪一个匹配值匹配则返回相应的结果值。
1 SELECT 学号, 2 CASE FLOOR(成绩/10) 3 WHEN 10 THEN '优秀' 4 WHEN 9 THEN '优秀' 5 WHEN 8 THEN '良好' 6 WHEN 7 THEN '中等' 7 WHEN 6 THEN '及格' 8 ELSE '不及格' 9 END AS '成绩等级' 10 FROM sc;
1)加密函数
MD5(字符串)函数以32位十六进制数字的形式返回为字符串算出一个 MD5 128比特校验和。
1 select md5(‘MySQL’);
PASSWORD(字符串)函数从原文密码字符串中计算并返回密码字符串。
1 select password(‘newpwd’);
2)信息函数
USER()函数返回当前登陆的用户名。
1 select user();
DATABASE()函数返回当前数据库名。
1 select database();
在MySQL中,服务器处理语句的时候是以分号为结束标志的。使用DELIMITER语句将MySQL语句的结束标志修改成其余符号。
DELIMITER语法格式以下:
DELIMITER $$
要想恢复使用分号做为结束符,执行下面语句便可:
DELIMITER ;
建立存储函数语法格式以下:
1 CREATE FUNCTION 存储函数名([参数名 参数的数据类型[,…]]) 2 RETURNS 函数返回值的数据类型 3 BEGIN 4 函数体; 5 RETURN 表达式; 6 END
建立一个存储函数,返回两个参数中的最大值。
1 delimiter $$ 2 create function max1(i int,j int) 3 returns int 4 begin 5 declare k int; 6 if i>j then 7 set k=i; 8 else 9 set k=j; 10 end if; 11 return k; 12 end$$ 13 delimiter ;
当调用建立的存储函数时,能够利用SELECT语句调用函数。
使用SELECT语句调用max1函数。
1 select max1(2,7);
BEGIN…END能够定义SQL语句块,其语法格式以下:
1 BEGIN 2 SQL语句|SQL语句块; 3 END
在D_sample数据库中建立一个存储函数,返回指定学号的学生信息:
1 use D_sample; 2 delimiter $$ 3 create function search1(xh char(9)) 4 returns char(9) 5 begin 6 return (select * from student where 学号=xh); 7 end$$ 8 delimiter ;
用于指定 SQL 语句的执行条件。其语法格式以下:
1 IF <逻辑表达式> THEN 2 <SQL语句|SQL语句块>; 3 [ELSE 4 < SQL语句|SQL语句块>;] 5 END IF;
建立一个存储函数f1,输入一个数判断其奇偶数。若是是偶数输出0,不然输出1。
1 delimiter $$ 2 create function f1(j int) 3 returns int 4 begin 5 declare i int; 6 if i%2=0 then 7 return 0; 8 else 9 return 1; 10 end if; 11 end$$ 12 delimiter ;
调用函数f1。SQL语句以下:
1 select f1(23);
CASE关键字可根据表达式的真假来肯定是否返回某个值,能够容许使用表达式的任何位置使用这一关键字。使用CASE语句能够进行多个分支的选择。CASE语句具备以下两种格式。
CASE表达式是将某个表达式与一组简单表达式进行比较以肯定结果。其语法格式以下:
1 CASE <输入表达式> 2 WHEN <表达式> THEN <语句>; 3 [WHEN <表达式> THEN <语句>[...]]; 4 [ELSE <语句>]; 5 END CASE;
第二种格式:
1 CASE 2 WHEN <表达式> THEN <语句>; 3 [WHEN <表达式> THEN <语句>[...]]; 4 [ELSE <语句>]; 5 END CASE;
输入学生的考试成绩,按照优秀、良好、中等、合格及不合格显示成绩。SQL语句以下:
1 delimiter $$ 2 create function score1(i int) 3 returns char(6) 4 begin 5 declare j int; 6 declare cj char(6); 7 case 8 when j>=90 then set cj='优秀'; 9 when j>=80 and j<90 then set cj='良好'; 10 when j>=70 and j<80 then set cj='中等'; 11 when j>=60 and j<70 then set cj='合格'; 12 else set cj='不合格'; 13 end case; 14 return cj; 15 end$$ 16 delimiter ;
WHILE语句是设置重复执行SQL语句或语句块的条件。其语法格式以下:
1 WHILE <逻辑表达式> DO 2 <SQL语句|SQL语句块>; 3 END WHILE;
使用WHILE语句计算1~100之和。
1 delimiter ## 2 create function sum1() 3 returns int 4 begin 5 declare s int default 0; 6 declare i int default 1; 7 while i<=100 do 8 set s=s+i; 9 set i=i+1; 10 end while; 11 return s; 12 end## 13 delimiter ;
游标概念:游标是相似于C语言指针同样的结构,在MySQL中,它是一种数据访问机制,容许用户访问单独的数据行,而不是对整个行集进行操做。
游标的使用步骤:
1.声明游标
声明游标的语法格式以下:
1 DECLARE <游标名> CURSOR 2 FOR SELECT语句;
在D_sample数据库中为了student表建立一个普通的游标,定义名称为stu_cursor。
1 use D_sample; 2 declare stu_cursor cursor 3 for select * from student;
2.打开游标
打开游标的语法格式以下:
1 OPEN <游标名>;
打开前面建立的stu_cursor游标。
1 open stu_cursor;
3.检索游标
其语法格式以下:
1 FETCH <游标名> INTO <变量名>[,变量名]...;
在打开的stu_cursor游标以后,使用FETCH语句来检索游标中的可用的数据。
1 fetch stu_cursor into xh; 2 while found do 3 set i=i+1; 4 fetch stu_cursor into xh; 5 end while;
4.关闭游标
关闭游标的语法格式以下:
1 CLOSE <游标名>;
在检索游标stu_cursor后可用CLOSE语句来关闭它。
1 close stu_cursor;
存储过程:存储过程(Stored Procedure)是一组完成特定功能的SQL语句集,经编译后存储在数据库中。
优势:
(1)存储过程在服务器端运行,执行速度快。
(2)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在之后的操做中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提升了系统性能。
(3)存储过程提供了安全机制。
(4)存储过程容许模块化程序设计。
(5)存储过程能够减小网络通讯流量。
在MySQL系统中,可使用CREATE PROCEDURE语句建立存储过程。其语法格式以下:
1 CREATE PROCEDURE <存储过程名称> ([IN|OUT|INOUT] 参数 数据类型[,...]) 2 BEGIN 3 过程体; 4 END
建立一个存储过程,在数据库D_sample的student表中查询政治面貌为“共青团员”的学生的学号、姓名、性别及政治面貌信息。
1 use D_sample; 2 delimiter $$ 3 create procedure cp_student(in zzmm char(8)) 4 begin 5 select 学号,姓名,性别,政治面貌 6 from student 7 where 政治面貌=zzmm 8 order by 学号; 9 end$$ 10 delimiter ;
能够利用CALL语句调用存储过程,其语法格式以下:
1 CALL [数据库名.]<存储过程名称>([参数[,...]]);
执行上例“cp_student”存储过程代码:
1 call cp_student(‘共青团员’);
在D_sample数据库的student表中建立一个存储过程,经过创建一个性别参数为同一存储过程指定不一样的性别,用于返回不一样性别的学生信息,
1 # #创建存储过程 2 use D_sample; 3 delimiter @@ 4 create procedure cp_sex(in xb char(2)) 5 begin 6 select * from student where 性别=xb; 7 end@@ 8 delimiter ; 9 10 ##执行带有输入参数的存储过程“cp_sex” 11 call cp_sex('女');
建立了一个名为“cp_score”的存储过程。它使用两个参数:“p_姓名”为输入参数,用于指定要查询的学生姓名,“p_成绩”为输出参数,用来返回学生的成绩
1 ## 建立存储过程 2 use D_sample; 3 delimiter $$ 4 create procedure cp_score(in p_name char(10),out p_score decimal(4,1)) 5 begin 6 select b.成绩 into p_score from student a,sc b 7 where a.学号=b.学号 and 姓名=p_name; 8 end$$ 9 delimiter ; 10 11 12 ## 调用存储过程 13 以上代码为了接收某一存储过程的返回值,须要一个变量来存放返回参数的值。 14 call cp_score('高峰',@p_score); 15 select concat('高峰','的成绩是:',@p_score) as 结果为:;
注意:若是要使用带参数的存储过程,须要在执行过程当中提供存储过程的参数值。可使用两种方式来提供存储过程的参数值。
(1)直接方式:该方式在CALL语句中直接为存储过程的参数提供数据值,而且这些数据值的数量和顺序与定义存储过程时参数的数据和顺序相同。
(2)间接方式:该方式是指在执行CALL语句以前,声明参数而且为这些参数赋值,而后在CALL语句中引用这些已经获取数据值的参数名称。
使用ALTER PROCEDURE语句来修改现有存储过程的特征。修改存储过程的基本语法格式以下:
1 ALTER PROCEDURE <存储过程名称> 2 [{{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA} 3 |SQL SECURITY {DEFINER|INVOKER} 4 |COMMENT '注释内容'}];
修改存储过程“cp_student”的定义。具备写数据权限,而且调用者能够执行。
1 alter procedure cp_student 2 modifies sql data 3 sql security invoker;
可以使用DROP PROCEDURE语句从当前的数据库中删除用户定义的存储过程。删除存储过程的基本语法格式以下:
1 DROP PROCEDURE [IF EXISTS] <存储过程名称>
删除“cp_student”存储过程。
1 drop procedure if exists cp_student;
使用SHOW PROCEDURE STATUS语句。查看存储过程的定义信息基本语法格式以下:
1 SHOW PROCEDURE STATUS [LIKE '参数'];
查看“cp_score”存储过程的定义文本信息。
1 show procedure status like 'cp_score';
使用SHOW CREATE PROCEDURE语句。查看存储过程的详细信息基本语法格式以下:
1 SHOW CREATE PROCEDURE <存储过程的名称>;
查看“cp_score”存储过程的详细文本信息。
1 show create procedure cp_score;
-------------------------