数据库系统(六)---MySQL语句及存储过程
一、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';
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量);
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量);
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量);
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('');
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 的值,因为前者为局部变量、后者为全局变量。
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变量的值
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 ;
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;
#删除已经存在的存储函数
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;
SELECT func_stu(1);
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语句及存储过程的更多相关文章
- mysql(函数,存储过程,事务,索引)
函数 MySQL中提供了许多内置函数: 内置函数 一.数学函数 ROUND(x,y) 返回参数x的四舍五入的有y位小数的值 RAND() 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND( ...
- 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器
@ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...
- MySQL基础值 存储过程和函数
一.创建存储过程和函数 什么是创建存储过程和函数? 就是将经常使用的一组SQL语句组合在一起,并将这些SQL语句当做一个整体存储在MYSQL服务器中. 创建存储过程的语句是:CREATE PROCE ...
- easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)
easyui datagrid 禁止选中行 没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...
- mysql数据库之存储过程入门
引用:百度百科 存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存 ...
- DB-MySQL:MySQL 语句性能优化
ylbtech-DB-MySQL:MySQL 语句性能优化 1.返回顶部 1. MySQL概述1.数据库设计 3范式2.数据库分表分库---会员系统() 水平分割(分页如何查询)MyChar .垂直3 ...
- MySQL学习——操作存储过程
MySQL学习——操作存储过程 摘要:本文主要学习了使用DDL语句操作存储过程的方法. 了解存储过程 是什么 存储过程是一组为了完成特定功能的SQL语句集合. 使用存储过程的目的是将常用或复杂的工作预 ...
- MySQL中的存储过程、函数与触发器
一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译.能提高数据库执行速度. 2.简单复杂操作结合事物一起封装. 3.复用性高. 4.安全性高,可指定存 ...
- MySQL中的存储过程、游标和存储函数
MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存 ...
随机推荐
- java-整型数值 用 16进制转换、2进制转换-Integer.toHexString
负数为什么要用补码表示 可以将符号位和其它位统一处理 减法也可按加法来处理 另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃 正数:原码.反码.补码相同. 负数:反码符号位不变 ...
- Spring 梳理-接收请求的输入(原)
Spring MVC 允许一下方式将客户端的数据传送到控制器的处理方法中 查询参数(Query Parameter) 表单参数(Form Parameter) 路径变量(Path Variable ...
- <反向传播(backprop)>梯度下降法gradient descent的发展历史与各版本
梯度下降法作为一种反向传播算法最早在上世纪由geoffrey hinton等人提出并被广泛接受.最早GD由很多研究团队各自发表,可他们大多无人问津,而hinton做的研究完整表述了GD方法,同时hin ...
- .Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统
一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈. 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理 ...
- Unity进阶技巧 - RectTransform详解
前言 最近要做UI,有时候需要在代码中调整改变UI控件的属性,比如位置.大小等,然而在NGUI里面,控制UI控件的位置等属性的是RectTransform这个组件,这个组件继承自Transform组件 ...
- Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.1)- 玩转板载OpenSDA,Freelink调试器
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK上板载调试器的用法. 本文是i.MXRT硬件那些事系列第二篇,第一篇痞子衡给大家整体介绍了i.M ...
- java IO、NIO、AIO详解
概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronous/asynchronous):同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调 ...
- python selenium鼠标滑动操作
先安装pyautogui: pip install pyautogui #coding=utf-8 import pyautogui from selenium import webdriver fr ...
- springboot配置logback日志
springboot配置logback日志 java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日 ...