一、DDL、DML、DCL常用语句

1、DDL(Data Definition Language)数据库定义语言

(1)数据库模式定义

#创建数据库  
create database if exsites db_name; #选定数据库
use db_name; #删除数据库
drop database if exists db_name; #修改数据库
alter database db_name set ...; #展示所创建的数据库
show databases;

(2)表定义    

#创建表
create table test_table
(
s_id int not null auto_increment,
s_name char(50) not null default "hanmei",
s_age int not null,
primary key(s_id),
index index_name(s_name)
); #删除表
drop table if exists test_table; #展示表结构
desc test_table;

2、DML(data manipulation language)数据库操作语言

insert into test_table(s_age) values(18);

insert into test_table set s_age=19; #插入部分列值数据

inert ...select...;

#case...when 匹配条件
select s_name as name,s_sex
case
  when 'f' then ‘女’
  else '男'
end as sex
from test_table; #使用内置函数
select count(*) from customers;
select max(cust_id) from customers;
select min(cust_id) from customers;
select sum(cust_id) from customers;
select avg(cust_id) from customers; #交叉连接(笛卡尔积)
select * from tb1 cross join tb2; #内连接
#---左外连接
select * from stu_info inner join stu_score on stu_info.sno=stu_score.sno;
select stu_info.sno,stu_info.sname,stu_score.sscore from stu_info left join stu_score on stu_info.sno=stu_score.sno;
#---右外连接
select stu_info.sno,stu_info.sname,stu_score.sscore from stu_score right join stu_info on stu_score.sno=stu_info.sno; #比较运算符
select * from customers where cust_id!=2;
select * from customers where cust_id<>2; #逻辑运算符
#---and 与
select * from customers where cust_id>2 and cust_sex=1;
#---or 或
select * from customers where cust_id>2 or cust_sex=1; #两者之间 范围
select * from customers where cust_id between 2 and 4;
select * from customers where cust_id>=2 and cust_id<=4; #in
select * from customers where cust_id in(2,4);
select * from customers where cust_id=2 or cust_id=4; #子查询
select * from stu_info where sno in(select sno from stu_score); #分组查询
select ssex,count(*)from stu_info group by ssex;
select saddress,ssex,count(*) from stu_info group by saddress,ssex;
select saddress,ssex,count(*) from stu_info group by saddress,ssex with rollup; #having 筛选---过滤分组后的数据
select saddress,ssex ,count(*) from stu_info group by saddress,ssex having count(*)>1;

3、DCL(Data Control Language)数据库控制语言

安全与访问控制

-- 查看 mysql 数据库的使用者账号
select user from mysql.user; -- 密码加密
select password(456); -- 创建用户
create user 'zhangsan'@'localhost' identified by '',
'lisi'@'localhost' identified by password '*531E182E2F72080AB0740FE2F2D68
9DBE0146E04'; -- 删除用户账号
drop user lisi@localhost; -- 重命名
rename user 'zhangsan'@'localhost' to 'wangwu'@'localhost'; -- 修改密码
set password for 'wangwu'@'localhost'='*6B4F89A54E2D27ECD7E8DA05B4AB8FD9D1D8B119'; -- 设置权限
grant select n test1.customers o 'wangwu'@'localhost'; -- 创建两个用户
grant select,update on test1.customers to 'liming'@'localhost' identified by '', 'huang'@'localhost' identified by ''; --执行所有数据库操作的权限
grant all on test1.* to 'wangwu'@'localhost'; -- 添加用户的权限
grant create user on *.*to 'wangwu'@'localhost'; -- 权限转移
grant select,update on test1.customers to 'zhou'@'localhost' identified by '' with grant option; -- 权限撤回
revoke select on test1.customers from 'zhou'@'localhost';
二、存储过程
  1、存储过程是一组为了完成某项特定功能的 SQL 语句集,其实质上就是一段存储在数据库中的代码,它可以由声明式的 SQL 语句(如 CREATE、UPDATE 和SELECT 等语句)和过程式 SQL 语句(如 IF…THEN…ELSE 控制结构语句)组成。创建的存储过程保存在数据库的数据字典中。
  使用存储过程通常具有以下优势:
  1) 可增强 SQL 语言的功能和灵活性;
  2) 良好的封装性;
  3) 高性能;
  4) 可减少网络流量;
  5) 存储过程可作为一种安全机制来确保数据库的安全性和数据的完整性。
 
  2、创建存储过程
   2.1)DELIMITER 命令
    DELIMITER 命令将 MySQL 语句的结束标志临时修改为其他符号,从而使得 MySQL 服务器可以完整地处理存储过程体中所有的 SQL 语句,而后可通过 DELIMITER 命令再将 MySQL 语句的结束标志改回为 MySQL 的默认结束标志,即分号(;)。
    DELIMITER 命令的语法格式: DELIMITER $$
 
     2.2)创建存储过程
    在 MySQL 中,是使用 CREATE PROCEDURE 语句来创建存储过程,其常用的语法格式是: CREATE PROCEDURE sp_name([proc_parameter[,…]]) Routine_body  
      "sp_name" 用于指定存储过程的名称,且默认在当前数据库中创建;
      "proc_parameter" 用于指定存储过程的参数列表;
      "routine_body" 表示存储过程的主体部分,也称为存储过程体。
           其中,语法项“proc_parameter”的语法格式是: [IN|OUT|INOUT] param_name type

      IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量);
      OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量);
      INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量);

   2.3)存储过程体
     局部变量:在存储过程体中可以声明局部变量,用来存储存储过程体中的临时结果。在 MySQL 中,可以使用 DECLARE 语句来声明局部变量,并且同时还可以对该局部变量赋予一个初始值,其使用的语法格式是: DECLARE var_name[,…] type [DEFAULT value]
其中,
    1)"var_name" 用于指定局部变量的名称;
    2)"type" 用于声明局部变量的数据类型;
    3) DEFAULT 子句用于为局部变量指定一个默认值,若没有指定,则默认为 NULL。 需要注意的事项如下:
      1) 局部变量只能在存储过程体的 BEGIN…END 语句块中声明。
      2) 局部变量必须在存储过程体的开头处声明。
      3) 局部变量的作用范围仅限于声明它的 BEGIN…END 语句块,其他语句块中的语句不可以使用它。
      4) 局部变量不同于用户变量,两者的区别是:
              局部变量声明时,在其前面没有使用@符号,只能被声明它的 BEGIN…END 语句块中的语句所使用;
         用户变量在声明时,会在其名称前面使用@符号,同时已声明的用户变量存在于整个会话之中。
 
    4)  SET 语句   在 MySQL 中,可以使用 SET 语句为局部变量赋值,语法格式是: SET var_name=expr[,var_name=expr] …
    5)  SELECT…INTO 语句   在 MySQL 中,可以使用 SELECT…INTO 语句把选定列的值直接存储到局部变量中,语法格式是: SELECT col_name[,…] INTO var_name[,…] table_expr   其中:
    “col_name”用于指定列名;
    “var_name”用于指定要赋值的变量名;
    “table_expr”表示 SELECT 语句中的 FROM 子句及后面的语法部分。
            注意:存储过程体中的 SELECT…INTO 语句返回的结果集只能有一行数据。
    6)流程控制语句
    在 MySQL 中,可以在存储过程体中,使用条件判断语句和循环语句这样两类用于控制语句流程的过程式 SQL 语句。
      (1) 条件判断语句 常用的条件判断语句有 IF…THEN…ELSE 语句和 CASE 语句;
      (2) 循环语句 常用的循环语句有 WHILE 语句、REPEAR 语句和 LOOP 语句。此外,循环语句中还可以使用 ITERATE 语句,但它只能出现在循环语句的 LOOP、REPEAT 和 WHILE 子句 中,用于表示退出当前循环,且重新开始一个循环。
eg:  
 
select...into...
mysql> delimiter $$
mysql> CREATE PROCEDURE proc_add_stu(
   -> IN sNo INTEGER,
   -> OUT sid int
   -> ) mysql> BEGIN #存储过程开始
   -> insert into student(s_no) values(sNo);
   -> SELECT LAST_INSERT_ID() into sid; #将选定列的值直接存储到局部变量中
   -> END $$ #存储过程结束 mysql> delimiter;  #将语句的结束符号恢复为分号 mysql> call pro_add_stu('');
in输入参数(默认,可省略不写)
mysql> delimiter $$
mysql> create procedure in_proce(in p_in int)
-> begin
->   select p_in;
->   set p_in=0; #局部变量赋值(begin...和end之间)
-> select P_in;
-> end$$
mysql> delimiter ; mysql> set @p_in=1; #全局变量@p_in赋值 mysql> call in_param(@p_in); #将全局变量@p_in的值作为参数传递给局部变量p_in
+------+
| p_in |
+------+
| 1 |
+------+ +------+
| P_in |
+------+
| 0 |
+------+ mysql> select @p_in; #输出全局变量@p_in的结果
+-------+
| @p_in |
+-------+
| 1 |
+-------+

以上可以看出,p_in 在存储过程中被修改,但并不影响 @p_id 的值,因为前者为局部变量、后者为全局变量。

out输出参数
mysql> delimiter //
mysql> create procedure out_proce(out p_out int)
-> begin
-> select p_out;
-> set p_out=2;
-> select p_out;
-> end
-> //
mysql> delimiter ; mysql> set @p_out=1; mysql> call out_proce(@p_out);
+-------+
| p_out |
+-------+
| NULL |
+-------+
#因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null
+-------+
| p_out |
+-------+
| 2 |
+-------+ mysql> select @p_out; #输出全局变量(用户变量)结果
+--------+
| @p_out |
+--------+
| 2 |
+--------+
#调用了out_proce存储过程,输出参数,改变了p_out变量的值
inout输入参数(尽量少用)
mysql> delimiter $$
mysql> create procedure inout_proce(inout p_inout int)
-> begin
-> select p_inout;
-> set p_inout=2;
-> select p_inout;
-> end
-> $$
mysql> delimiter ; mysql> set @p_inout=1; mysql> call inout_proce(@p_inout);
+---------+
| p_inout |
+---------+
| 1 |
+---------+ +---------+
| p_inout |
+---------+
| 2 |
+---------+ mysql> select @p_inout;
+----------+
| @p_inout |
+----------+
| 2 |
+----------+
#调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量

变量作用域

  内部的变量在其作用域范围内享有更高的优先权,当执行到 end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是你可以通过 out 参数或者将其值指派给会话变量来保存其值。

mysql > DELIMITER //
mysql > CREATE PROCEDURE proc3()
-> begin
-> declare x1 varchar(5) default 'outer';
-> begin
-> declare x1 varchar(5) default 'inner';
-> select x1;
-> end;
-> select x1;
-> end;
-> //
mysql > DELIMITER ;

条件语句

mysql > DELIMITER //
mysql > CREATE PROCEDURE proc2(IN parameter int)
-> begin
-> declare var int;
-> set var=parameter+1;
-> if var=0 then
-> insert into t values(17);
-> end if;
-> if parameter=0 then
-> update t set s1=s1+1;
-> else
-> update t set s1=s1+2;
-> end if;
-> end;
-> //
mysql > DELIMITER ;

循环语句

mysql > DELIMITER //
mysql > CREATE PROCEDURE proc4()
-> begin
-> declare var int;
-> set var=0;
-> while var<6 do
-> insert into t values(var);
-> set var=var+1;
-> end while;
-> end;
-> //
mysql > DELIMITER ;
   
 2.5) 删除存储过程
    DROP PROCEDURE[IF EXISTS] sp_name 其中,“sp_name”用于指定要删除的存储过程的名称。
 
   2.4)游标
   游标是一个被 SELECT 语句检索出来的结果集。即,游标可以遍历返回的多行结果。
  在 MySQL 中,使用游标的具体步骤如下:
  (1) 声明游标 DECLARE cursor_name CURSOR FOR select_statement 其中,
    “cursor_name”用于指定要创建的游标的名称,其命名规则与表名相同;
    “select_statement”用于指定一个 SELECT 语句,其会返回一行或 多行的数据,且需注意此处的 SELECT 语句不能有 INTO 子句。
  (2) 打开游标 OPEN cursor_name   其中,“cursor_name”用于指定要打开的游标。
  (3) 读取数据 FETCH cursor_name INTO var_name[,var_name]…   其中,“cursor_name”用于指定已打开的游标;语法项“var_name”用于指定存放数据的变量名。
  (4) 关闭游标 CLOSE cursor_name 其中,语法项“cursor_name”用于要关闭的游标。
       (5)在使用游标过程中,需要注意以下几点:
    1) 游标只能用于存储过程或存储函数中,不能单独在查询操作中使用。
    2) 在存储过程或存储函数中可以定义多个游标,但是在一个 BEGIN…END 语 句块中每一个游标的名字必须是唯一的。
    3) 游标不是一条 SELECT 语句,是被 SELECT 语句检索出来的结果集。 模块四 调用存储过程 CALL sp_name[parameter[,…]] CALL sp_name[()] 在此语法格式中:
       语法项“sp_name”用于指定被调用的存储过程的名称。如果要调用某个特 定数据库的存储过程,则需要在前面加上该数据库的名称。
       语法项“parameter”用于指定调用存储过程所要使用的参数。调用语句中参数的个数必须等于存储过程的参数个数。
    当调用没有参数的存储过程时,使用 CALL sp_name()语句与使用 CALL sp_name 语句是相同的。
 eg:

create procedure p1()
begin
declare id int;
declare name varchar(15);
-- 声明游标
declare mc cursor for select * from class;
-- 打开游标
open mc;
-- 获取结果
fetch mc into id,name;
-- 这里是为了显示获取结果
select id,name;
-- 关闭游标
close mc; end;
 
三、存储函数
  1、存储函数和存储过程的区别:
  (1) 存储函数不能拥有输出参数,这是因为存储函数自身就是输出参数;而存储过程可以拥有输出参数。
  (2) 可以直接对存储函数进行调用,且不需要使用 CALL 语句;而对存储过程 的调用,需要使用 CALL 语句。
  (3) 存储函数中必须包含一条 RETURN 语句,而这条特殊的 SQL 语句不允许包含于存储过程中。
 
  2、创建存储函数 CREATE FUNCTION sp_name([func_parameter[,…]]) RETURNS type routine_body 其中,语法项“func_parameter”的语法格式是: param_name type
     在此语法格式中:
    (1) 语法项“sp_name”用于指定存储函数的名称,需注意,存储函数不能与存 储过程具有相同的名字。
    (2) 语法项“func_parameter”用于指定存储函数的参数,这里的参数只有名称 和类型,不能指定关键字“IN”“OUT”和“INOUT”。
    (3) RETURNS 子句用于声明存储函数返回值的数据类型,其中 type 用于指定 返回值的数据类型。
    (4) 语法项“routine_body”用于指定存储函数的主体部分,也称为存储函数体。 所有在存储过程中使用的 SQL 语句在存储函数中同样也适用,包括前面所介绍的局部变量、SET 语句,流程控制语句、游标等。但是,存储函数体中还必须包含一个 RETURN value 语句,其中 value 用于指定存储函数的返回值。
 eg:
#删除已经存在的存储函数
DROP FUNCTION IF EXISTS func_stu; #创建存储函数(声明返回类型为varChar(50))
CREATE FUNCTION func_stu(in_id INT) RETURNS VARCHAR(50)
BEGIN
DECLARE o_name VARCHAR(50); #声明局部变量
SELECT name INTO o_name FROM tb_stu WHERE id = in_id; #tb_stu指事先创建好的数据库
RETURN o_name;
END;
 
   3、调用存储函数
  成功创建存储函数后,就可以如同调用系统内置函数一样,使用关键字 SELECT 对其进行调用,语法格式是: SELECT sp_name([func_parameter[,…]])
 eg:

SELECT func_stu(1);
    4、删除存储函数
  在 MySQL 中,可以使用 DROP FUNCTION 语句来实现,语法格式: DROP FUNCTION[IF EXISTS] sp_name     其中,语法项“sp_name”指定要删除的存储函数的名称。
eg:
DROP FUNCTION IF EXISTS func_stu;

5、修改存储函数

ALTER FUNCTION func_name [characteristic ...]
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }

感谢阅读,如需转载,请注明出处,谢谢!https://www.cnblogs.com/huyangshu-fs/p/11669708.html

数据库系统(六)---MySQL语句及存储过程的更多相关文章

  1. mysql(函数,存储过程,事务,索引)

    函数 MySQL中提供了许多内置函数: 内置函数 一.数学函数 ROUND(x,y) 返回参数x的四舍五入的有y位小数的值 RAND() 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND( ...

  2. 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器

    @ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...

  3. MySQL基础值 存储过程和函数

    一.创建存储过程和函数 什么是创建存储过程和函数? 就是将经常使用的一组SQL语句组合在一起,并将这些SQL语句当做一个整体存储在MYSQL服务器中. 创建存储过程的语句是:CREATE  PROCE ...

  4. easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)

    easyui datagrid 禁止选中行   没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...

  5. mysql数据库之存储过程入门

    引用:百度百科 存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存 ...

  6. DB-MySQL:MySQL 语句性能优化

    ylbtech-DB-MySQL:MySQL 语句性能优化 1.返回顶部 1. MySQL概述1.数据库设计 3范式2.数据库分表分库---会员系统() 水平分割(分页如何查询)MyChar .垂直3 ...

  7. MySQL学习——操作存储过程

    MySQL学习——操作存储过程 摘要:本文主要学习了使用DDL语句操作存储过程的方法. 了解存储过程 是什么 存储过程是一组为了完成特定功能的SQL语句集合. 使用存储过程的目的是将常用或复杂的工作预 ...

  8. MySQL中的存储过程、函数与触发器

    一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译.能提高数据库执行速度. 2.简单复杂操作结合事物一起封装. 3.复用性高. 4.安全性高,可指定存 ...

  9. MySQL中的存储过程、游标和存储函数

    MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存 ...

随机推荐

  1. java时间格式转换任意格式

    例如:20180918/120023转换成2018-09-18 12:00:23 //时间格式转换 public String getNomalTime(String oldTime){ String ...

  2. WebGL简易教程(六):第一个三维示例(使用模型视图投影变换)

    目录 1. 概述 2. 示例:绘制多个三角形 2.1. Triangle_MVPMatrix.html 2.2. Triangle_MVPMatrix.js 2.2.1. 数据加入Z值 2.2.2. ...

  3. MapReduce案例-好友推荐

    用过各种社交平台(如QQ.微博.朋友网等等)的小伙伴应该都知道有一个叫 "可能认识" 或者 "好友推荐" 的功能(如下图).它的算法主要是根据你们之间的共同好友 ...

  4. kubeadm部署高可用集群Kubernetes 1.14.1版本

    Kubernetes高可用集群部署 部署架构: Master 组件: kube-apiserver Kubernetes API,集群的统一入口,各组件协调者,以HTTP API提供接口服务,所有对象 ...

  5. asp.net core 3.0 更新简记

    asp.net core 3.0 更新简记 asp.net core 3.0 更新简记 Intro 最近把活动室预约项目从 asp.net core 2.2 更新到了 asp.net core 3.0 ...

  6. MongoDB 学习笔记之 Nested doc/DBRef (Spark)

    Nested doc/DBRef (Spark) 实现: 运行结果:

  7. Java8 Lambda表达式详解手册及实例

    先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...

  8. Kylin构建Cube过程详解

    1 前言 在使用Kylin的时候,最重要的一步就是创建cube的模型定义,即指定度量和维度以及一些附加信息,然后对cube进行build,当然我们也可以根据原始表中的某一个string字段(这个字段的 ...

  9. SparkStreaming整合Flume的pull报错解决方案

    先说下版本情况: Spark 2.4.3 Scala 2.11.12 Flume-1.6.0 Flume配置文件: simple-agent.sources = netcat-source simpl ...

  10. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...