SQL语言基础

SQL基础

SQL标识符

@:以@开头的标识符表示一个局部变量或者一个函数的参数

@@:以@@开头的标识符表示一个全局变量

注释

单行注释:##

多行注释:/*    */

数据类型

在SQL中,表和视图的列、局部变量、函数的参数和返回值、存储过程的参数和返回值(具有返回代码)和表达式等都具有相关的数据类型。

常量与变量

常量:常量也称为文字值或标量值,是指程序运行中值始终不改的量。

变量:变量就是在程序执行过程中,其值是可以改变的量。

  系统定义和维护的全局变量:

    系统全局变量是MySQL系统提供并赋值的变量。全局变量以两个@符号开头。

1 # 使用系统全局变量@@VERSION查看当前使用的MySQL的版本信息
2 select  @@version;

  用户定义用来保存中间结果的局部变量:

    局部变量是作用域局限在一定范围内的SQL对象。局部变量被引用时要在其名称前加上标志@

    局部变量的声明和赋值

      使用DECLAREA语句声明局部变量,局部变量的作用范围在它被声明的BEGIN…END复合语句内。        

      DECLAREA语句的语法格式如下:

        DECLARE 变量名[,…] 数据类型 [DEFAULT 默认值];

      声明局部变量后要给局部变量赋值,直接给变量赋值可以使用SET语句。SET语句的语法格式如下:

        SET 变量名=表达式[,变量名=表达式,…];

SQL语言基础
 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 政治面貌=@政治面貌;
View Code

    在MySQL中,还可以使用SELECT…INTO语句把数据表中选定的字段值直接存储到变量中。

    其语法格式如下:

      SELECT <字段名>[,...] INTO <变量名>[,...] FROM <表名>;

SQL语言基础
1 ## 通过局部变量查看D_sample数据库中的学生信息,条件是查看student表中学号”为“201507002”的学生姓名和性别信息。SQL语句如下:
2 use D_sample;
3 select 姓名,性别 into @name,@sex from student
4 where 学号=201507002;
5 select @name,@sex;
View Code

注意:局部变量分为存储变量和会话变量。

    存储变量就是使用DECLAREA语句创建的变量,并且初值为NULL的变量。

    会话变量就是直接使用set 或者select into语句赋值,不进行定义的变量,这个变量在这次会话框中都有效,并且初值即为赋的值。

操作符

SQL的操作符和其它高级语言的操作符类似,由变量、常量和函数连接起来并指定在一个或多个表达式中执行的操作。

表达式

 在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;
View Code

函数

系统函数

数学函数

数学函数对数值表达式进行数学运算,并将运算结果返回给用户。

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函数输入值与哪个匹配值匹配则返回相应的结果值。

SQL语言基础
 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;
View Code

其它函数

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

创建一个存储函数,返回两个参数中的最大值。

SQL语言基础
 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 ;
View Code

存储函数的调用

当调用创建的存储函数时,可以利用SELECT语句调用函数。
使用SELECT语句调用max1函数。

1 select max1(2,7);

流程控制语句

顺序控制语句

BEGIN…END可以定义SQL语句块,其语法格式如下:

1 BEGIN
2 SQL语句|SQL语句块;
3 END

在D_sample数据库中创建一个存储函数,返回指定学号的学生信息:

SQL语言基础
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 ;
View Code

分支控制语句

IF…ELSE语句

用于指定 SQL 语句的执行条件。其语法格式如下:

1 IF <逻辑表达式> THEN
2 <SQL语句|SQL语句块>;
3 [ELSE
4 < SQL语句|SQL语句块>;]
5     END IF;

创建一个存储函数f1,输入一个数判断其奇偶数。如果是偶数输出0,否则输出1。

SQL语言基础
 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 ;
View Code

调用函数f1。SQL语句如下:

1 select f1(23);

CASE语句

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语句如下:

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 ;
View Code

循环控制语句

WHILE语句是设置重复执行SQL语句或语句块的条件。其语法格式如下:

1 WHILE <逻辑表达式> DO
2 <SQL语句|SQL语句块>;
3 END WHILE;

使用WHILE语句计算1~100之和。

SQL语言基础
 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 ;
View Code

游标

游标概念:游标是类似于C语言指针一样的结构,在MySQL中,它是一种数据访问机制,允许用户访问单独的数据行,而不是对整个行集进行操作。

游标的使用步骤:

1.声明游标

声明游标的语法格式如下:

1 DECLARE <游标名> CURSOR
2 FOR SELECT语句;

在D_sample数据库中为了student表创建一个普通的游标,定义名称为stu_cursor。

SQL语言基础
1 use D_sample;
2 declare stu_cursor cursor
3 for select * from student;
View Code

2.打开游标

打开游标的语法格式如下:

1 OPEN <游标名>;

打开前面创建的stu_cursor游标。

SQL语言基础
1 open stu_cursor;
View Code

3.检索游标

其语法格式如下:

1 FETCH <游标名> INTO <变量名>[,变量名]...;

在打开的stu_cursor游标之后,使用FETCH语句来检索游标中的可用的数据。

SQL语言基础
1 fetch stu_cursor into xh;
2 while found do
3 set i=i+1;
4 fetch stu_cursor into xh;
5 end while;
View Code

4.关闭游标

关闭游标的语法格式如下:

1 CLOSE <游标名>;

在检索游标stu_cursor后可用CLOSE语句来关闭它。

SQL语言基础
1 close stu_cursor;
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-------------------------

SQL语言基础

上一篇:Brain Full-featured, real-time database searching platform enables fast and accurate multiplexed quantitative proteomics (功能齐全的实时数据库搜索平台可实现快速,准确的多重定量蛋白质组学)【分享人:翁海玉】


下一篇:MySQL按时间分组统计数据