-----------------------mysql笔记-------------------------------------------------------------------
---------------------y04代指数据库名--------------------------
-----------------------常用操作-------------------------------
auto_increment 自增(Mysql)
unique 唯一unique key(Mysql)
not null 不为空
default 默认
primary key() | primary key 主键
references 表名(列名) 外键
select 查询
update 更新
insert 插入
delete 删除
create 创建
database 数据库
table 表
limit 限制查询条数,select * from 表名 limit 10 ;
show plugins; 查看是否支持表分区
[not] in 区间集合 select * from 表名 where id in (select * from where id>5 and id <8);
-----------------------------------------------------------------------------------------------
-----------------------数据库-------------------------
新增_创建数据库----------------------------------------------------------
create database y04;
新增_创建数据库,如果不存在-----------------------------------------------
create database if not exists y04;
使用_数据库--------------------------------------------------------------
use y04;
删除_数据库--------------------------------------------------------------
drop database y04;
删除_数据库,如果存在-----------------------------------------------------
drop database if exists y04;
设置_数据库编码----------------------------------------------------------
alter database y04 character set utf8;
查看_所有数据库----------------------------------------------------------
show databases;
查看_其它数据库表--------------------------------------------------------
show tables from 数据库名;
查看_数据库的编码--------------------------------------------------------
show create database y04;
查看_警告----------------------------------------------------------------
show warnings;
-----------------------------------------------------------------------------------------------
-----------------------数据表-------------------------
新增_创建表--------------------------------------------------------------
create table 表名();
查看_所有表--------------------------------------------------------------
show tables;
查看_表结构1-------------------------------------------------------------
show create table 表名;
1)默认为空:DEFAULT NULL
2)字段不为空: NOT NULL
3)默认为当前时间: DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
4)数据库引擎:ENGINE=InnoDB
查看_表结构2-------------------------------------------------------------
desc 表名;
删除_删除表---------------------------------------------------------------
drop table 表名;
删除_删除表,如果存在------------------------------------------------------
drop table if exists 表名;
清空_表数据---------------------------------------------------------------
delete from 表名;
清空_表数据---------------------------------------------------------------
truncate table 表名;
修改_添加列---------------------------------------------------------------
alter table 表名 add 列名 [约束]
修改_修改列名-------------------------------------------------------------
alter table 表名 change 旧列名 新列名 新数据类型
修改_修改数据类型---------------------------------------------------------
alter table 表名 modify 新数据类型
修改_删除列---------------------------------------------------------------
alter table 表名 drop 列名
修改_修改表名-------------------------------------------------------------
alter table 表名 rename [to] 新表名
修改_数据库名-------------------------------------------------------------
rename database 旧名 TO 新名
新增_外键约束-------------------------------------------------------------
alter table 表名 add foeelgn key (列名) references 外键表名(列名)
删除_约束-----------------------------------------------------------------
alter table 表名 drop primary key
删除_外键约束-------------------------------------------------------------
alter table 表名 drop foeelgn key 外键约束名字(默认的名字用show create table查看 )
删除_按指定条件-----------------------------------------------------------
delete from 表名 where 条件
新增_一条数据-------------------------------------------------------------
insert into 表名[列名] values(值1,值2);
修改_匹配数据-------------------------------------------------------------
update 表名 set 列名=新值,列名2=新值 where 条件
表分区--------------------------------------------------------------------
CREATE TABLE 表名(
字段1,
字段2
)
partition by range(字段1)(
partition 分区名1 values less than (100),
partition 分区名2 values less than (300),
partition 分区名3 values less than MAXVALUE
)
create table car(
id int,
name varchar(20)
)
partition by range(id)(
partition c1 values less than (100),
partition c2 values less than (300),
partition c3 values less than MAXVALUE
)
SELECT * FROM 表名 partition(分区名)
-----------------------------------------------------------------------------------------------
-----------------------mysql常用数据类型-------------------------
数值类型------------------------------------------------------------------
tinyint int bigint float double
日期和时间类型------------------------------------------------------------
date YYYY-MM-DD
time HH:MM:SS
year YYYY
datetime YYYY-MM-DD HH:MM:SS
字符串类型----------------------------------------------------------------
varchar text longtext
-----------------------------------------------------------------------------------------------
3、查询的别名-------------------------------------------------------------
AS 取别名
完整写法: select stu_no AS '学号', name AS '姓名' from student;
简写: select stu_no '学号', name '姓名' from student;
4、where条件
SELECT * FROM 表名 WHERE 给定条件
5、sql排序:order by
语法: select * from 表名 [where] order by 列名 desc
降序(DESC):
select * from student order by id desc;
select * from student where id>1 order by id desc;
升序(ASC):
select * from student order by id asc;
select * from student where id>1 order by id asc
6、sql分组:group by
select * from student group by name
如果要在分组中进行排序那么可以直接跟上DESC或者ASC
如: select * from student group by name DESC
分组条件: having
select * from student group by name having id<2;
注意:group by 分组后面如果需要添加条件,只能使用having作为分组条件
7、查询的数量控制,分页查询:limit
select * from student limit 0,2;
0 -表示查询开始位置
2 -表示查询的条数
select * from student limit 1;
当limit后面只有一个数字时,表示查询条数,默认从0开始查询
-- 1、运算符 +、-、*、/、%
select se.grade+2 from student st inner join score se on st.id=se.stu_id AND st.name='张老大';
select se.grade+2 from student st inner join score se on st.id=se.stu_id AND st.id=1+1;
select * from score where grade+10>90;
-- 老师将分数不大于70的加10分?
-- 1、等到小于70的
SELECT * FROM score WHERE grade <70;
-- 2、将其加10
SELECT grade+10 FROM score WHERE grade <70;
-- 3、将数据库中修改
UPDATE score SET grade=grade+10 WHERE grade <70;
UPDATE score SET grade=grade-10 WHERE grade=75;
-- 2、空 is null 和非空 is not null
select * from score where c_name is not null;
select * from score where c_name is null;
-- 3、查询指定范围之间的数据 : between 开始 and 结束
SELECT * FROM score WHERE grade>=80 AND grade <=90;
select * from score where grade BETWEEN 80 AND 90;
-- 4、下划线表示占位,百分号表示模糊匹配
SELECT * FROM student WHERE name LIKE '张%'; -- 匹配开头为张的
SELECT * FROM student WHERE name LIKE '%张'; -- 匹配结尾为张的
SELECT * FROM student WHERE name LIKE '%张%'; -- 匹配有张字的,模糊匹配
select * from student where name like '张_'; -- 只能查询到2个字的,因为1个下划线占位一个字
select * from student where name like '张__'; -- 只能查询到3个字的,因为2个下划线占位两个字
-- 5、并且(AND)和或者(OR)
select * from score where grade<90 AND c_name='英语'; -- AND 表示两边的条件都需要满足
select * from score where grade<90 OR c_name='英语'; -- OR 表示任意满足一边的表达式
-- 6、NOT 相当于取反
select * from score where grade NOT BETWEEN 80 AND 90;
-- 7、数学函数
select ceil(12.32);
select 10/30;
select 10 DIV 30; -- 和/的区别是:/会保留小数, DIV 舍去小数
select 10%2;
select 10%3;
select 10 MOD 3;
SELECT POWER(2,3) -- 2表示基数,3表示幂
SELECT TRUNCATE(123.213, 0); -- 123.213 ==》 123
SELECT TRUNCATE(123.213, 1); -- 123.213 ==》 123.2
SELECT TRUNCATE(123.213, 2); -- 123.213 ==》 123.21
SELECT TRUNCATE(123.213, 3); -- 123.213 ==》 123.213
SELECT TRUNCATE(123.213, 4); -- 123.213 ==》 123.2130
SELECT TRUNCATE(123.213, 5); -- 123.213 ==》 123.21300
-- 平均数
select avg(grade) from score;
-- 将平均数取整
select TRUNCATE(avg(grade),1) from score;
select TRUNCATE(avg(grade),0) from score;
select ROUND(avg(grade)) from score;
select FLOOR(avg(grade)) from score;
-- 求一张表的总条数
SELECT COUNT(id) FROM student;
-- 最大值
SELECT MAX(grade) FROM score;
-- 最小值
SELECT MIN(grade) FROM score;
-- 求和
SELECT SUM(grade) FROM score;
-- 8、字符函数
-- 1)链接字符串
select CONCAT('A','B') AS '字串';
-- 2)用指定字符链接字符串
select CONCAT_WS('+','A','B') AS '字串';
select CONCAT_WS('+','A','B','C','D') AS '字串';
select CONCAT_WS('-',c_name,grade) from score ;
-- 3)字母转换大小写
select lower('Hello World');
select upper('Hello World');
-- 4)求长度
select length(' hello ');
-- 5)删除空格
-- 5-1)去掉左边的空格
select ltrim(' hello ');
length(ltrim(' hello '));
-- 5-2)去掉右边的空格
select rtrim(' hello ');
length(rtrim(' hello '));
-- 5-3)去掉左右的空格
select trim(' hello ');
length(trim(' hello '));
-- 6)截取字符串
select substring('hello world',1,5);
select substring('hello world',-5,2);
-- 7)获取指定长度的字符串
select left('hello world', 5);
select right('hello world', 5);
-- 8)替换函数
-- 语法:REPLACE('字符串','被替换字符','替换字符');
select replace('hello world','world','mysql');
-- 去掉中间的空格
select replace('hello world',' ','');
-- 字符串数字格式化
select format(1234.5678,2),format(1234.5,2),format(1234.5678,0);
-- 等同于
select format(1234.5678,2)
select format(1234.5,2)
select format(1234.5678,0);
-- 9、日期时间函数
-- 1)查看当前的系统日期
select curdate();
-- 2)查看当前的系统时间
select curtime();
-- 3)查看当前的系统日期和时间
select now();
-- 4)查看当前的系统日期和时间
select sysdate();
-- 5)日期的加运算
-- 语法格式:select date_add(时间, interval 时间 单位);
select date_add('2017-01-01', interval 5 month);
select date_add('2017-01-01', interval 5 year);
select date_add('2017-01-01', interval 5 day);
-- 6)计算两个日期之间间隔的天数
-- 语法格式:select datediff(日期1,日期2);
select datediff('2017-02-10','2017-02-01');
-- 7)日期格式化
select date_format('2017-02-01', '%Y%m');
select date_format('2017-02-01', '%Y%m');
+-----------------------------------+
| date_format('2017-02-01', '%Y%m') |
+-----------------------------------+
| 201702 |
+-----------------------------------+
select date_format('2017-02-01', '%Y-----%m');
+----------------------------------------+
| date_format('2017-02-01', '%Y-----%m') |
+----------------------------------------+
| 2017-----02 |
+----------------------------------------+
select date_format('2017-02-01', '%Y-----%m----%d');
+----------------------------------------------+
| date_format('2017-02-01', '%Y-----%m----%d') |
+----------------------------------------------+
| 2017-----02----01 |
+----------------------------------------------+
-- 10、聚合函数
-- 1、求图书信息表中,所有图书的平均价格。
select avg(price) from bookinfo;
-- 2、求图书信息表中,所有图书的总价格。
select sum(price) from bookinfo;
-- 3、求图书信息表中的最大库存。
select max(store) from bookinfo;
-- 4、求图书信息表中的最小库存。
select min(store) from bookinfo;
-- 5、求图书信息表中有多少种图书。
select count(id) from bookinfo;
-- 11、系统信息函数
-- 查看当前MySQL服务器版本的版本号
select version();
-- 查看MySQL服务器当前连接的次数
select connection_id();
-- 查看当前的数据库名
select schema();
-- 查看当前登录的用户名
select user();
-- 12、加密函数
select md5('test');
select * from user;
+----+----------+----------------------------------+
| id | username | pwd |
+----+----------+----------------------------------+
| 1 | 涛哥 | e10adc3949ba59abbe56e057f20f883e |
| 2 | 涛哥 | d6a8fc71357f84eab97f65075d895d49 |
+----+----------+----------------------------------+
mysql> select * from user where username='涛哥' and pwd='123456';
Empty set (0.00 sec)
mysql> select * from user where username='涛哥' and pwd=md5('123456');
+----+----------+----------------------------------+
| id | username | pwd |
+----+----------+----------------------------------+
| 1 | 涛哥 | e10adc3949ba59abbe56e057f20f883e |
+----+----------+----------------------------------+
-- 修改密码:SET PASSWORD = PASSWORD('123456')
-- 创建自定义函数
-- 1、创建语法
CREATE FUNCTION 函数名([变量1 数据类型1,变量2 数据类型2,……,变量N 数据类型N])
RETURNS VARCHAR(15) -- retruns 确定返回类型
RETURN 返回值;
-- 例子:格式化时间函数
create function f_date(mydate date)
returns varchar(15)
return date_format(mydate,'%Y-%m')
-- 例子:无参数的函数
create function newdate()
returns varchar(20)
return date_format(curdate(),'%Y年%m月%d日');
-- 调用
select newdate();
-- 例子:创建带有参数的函数(查询例子)
create function show_name(sid int)
returns varchar(50)
return (select concat_ws('----',name,birth) from student where id= sid);
-- 2、delimiter 自定义结束符
-- 如果说代码有多行的话,那就需要使用begin end 包裹,包裹的部分就是代码块,相当于java中的{}
delimiter //
create function f_date(mydate date)
returns varchar(15)
begin
return date_format(mydate,'%Y-%m');
end//
delimiter ;
-- 使用(调用)自定义函数
select ym_date('2018-10-1')
-- 删除函数
drop function newdate;
drop function if exists ym_date;
-- 3、声明变量:采用 declare关键字声明变量
-- create function 函数名(变量名 变量类型)
-- returns 返回类型
-- declare 变量名2 变量类型
-- select concat_ws('----',name,birth) into 变量名2 from student where id= sid;
-- return 变量名2;
-- 1)例子
delimiter //
create function show_sex(username varchar(10))
returns varchar(10)
begin
-- 声明一个varchar(10)类型的thisSex变量
declare thisSex varchar(10);
-- into 关键字,将查询出来的值赋给变量
SELECT sex into thisSex FROM student WHERE name=username;
return thisSex;
end//
-- 建议执行完后使用delimiter 改回结束符
delimiter ;
-- 2)例子
delimiter //
create function show_name(sid int)
returns varchar(50)
begin
declare rsl varchar(50);
select concat_ws('----',name,birth) into rsl from student where id= sid;
return rsl;
end//
delimiter ;
-- 4、if 条件表达式 then
/*
要求如下:
1、根据学生姓名查询学生的成绩
2、当学生的成绩大于等于95时为优秀
3、当学生的成绩大于等于85时为良好
4、当学生的成绩大于等于70时为及格
5、当学生的成绩小于70时为不及格
*/
delimiter //
create function show_level(stu_name varchar(18))
returns varchar(10)
begin
declare lev varchar(10); -- 声明变量 作为返回值
declare temp_grade int(10); -- 存储查询出来的成绩,用来比较
-- 根据学生的姓名查询
select score.grade into temp_grade from student inner join score where student.id=score.stu_id and student.name=stu_name;
-- if 条件表达式 then 语句块;
if temp_grade>=95 then
-- set 设置值
set lev = '优秀';
-- elseif
elseif temp_grade>=85 then
set lev = '良好';
elseif temp_grade>=70 then
set lev = '及格';
else
set lev = '不及格';
end if;
return lev;
end//
delimiter ;
select show_level(name) from student where id=1;
---------------- 华丽的分割线 : case……when ------------------------------
delimiter //
create function show_level2(temp_stu_name varchar(18))
returns varchar(10)
begin
declare lev varchar(10);
declare num int;
select id into num from student where name=temp_stu_name;
-- 根据学生的ID判断学生的排列顺序
case num
when 1 then set lev = '大哥';
when 2 then set lev = '二哥';
when 3 then set lev = '三哥';
when 4 then set lev = '四哥';
when 5 then set lev = '五哥';
else set lev = '涛哥';
end case;
return lev;
end//
delimiter ;
select show_level2('王六');
---------------- 华丽的分割线 : case……when ------------------------------
/*
要求如下:
1、根据学生姓名查询学生的成绩
2、当学生的成绩大于等于95时为优秀
3、当学生的成绩大于等于85时为良好
4、当学生的成绩大于等于70时为及格
5、当学生的成绩小于70时为不及格
*/
delimiter //
create function show_level3(stu_name varchar(20))
returns varchar(10)
begin
declare lev varchar(10);
declare temp_grade int;
-- 根据学生的姓名查询
select score.grade into temp_grade from student inner join score where student.id=score.stu_id and student.name=stu_name;
case
when temp_grade>=90 then set lev = '优秀';
when temp_grade>=80 then set lev = '良好';
when temp_grade>=70 then set lev = '一般';
else set lev = '还需要努力';
end case;
return lev;
end//
delimiter ;
------------------------------------------------------------------------------
--------------------------------- WHILE循环 ----------------------------------
(1) WHILE循环
[label:] WHILE expression DO
statements
END WHILE [label];
-- 求N以内数的和
-- while循环语句
delimiter //
create function testfunc(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
-- 循环开始
while num
set sum = sum + num;
end while;
-- 循环结束
return sum;
end//
delimiter ;
select testfunc(20);
------------------------------------------------------------------------------
--------------------------------- LOOP循环 -----------------------------------
(2) LOOP循环
[label:] LOOP
statements
END LOOP [label];
-- loop循环语句
delimiter //
-- drop function if exists testfunc//
create function testfunc2(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
-- 循环开始
lab1:loop
set num = num + 1;
set sum = sum + num;
if num>=n then
leave lab1;
end if;
end loop lab1;
-- 循环结束
return sum;
end//
delimiter ;
select testfunc2(20);
------------------------------------------------------------------------------
---------------------------------- REPEAT UNTIL 循环 -------------------------
(3)REPEAT UNTIL循环
[label:]REPEAT
statements
UNTIL expression
END REPEAT [label];
-- repeat循环语句
delimiter //
drop function if exists testfunc//
create function testfunc(n int)
returns int
begin
declare num int default 0;
declare sum int default 0;
-- 循环开始
repeat
set num = num +1;
set sum = sum + num;
until num>=n
end repeat;
-- 循环结束
return sum;
end//
delimiter ;
select testfunc(20);
-------------------------------------------------------------------
--------------------------------视图--------------------------------
-------------------------------------------------------------------
-- 1、视图创建语法:CREAT VIEW 视图名(属性列) AS 查询语句
mysql> select * from student;
+----+--------+------+-------+------------+--------------+---------------------+
| id | name | sex | birth | department | address | create_time |
+----+--------+------+-------+------------+--------------+---------------------+
| 1 | 张老大 | 男 | 1985 | 计算机系 | 北京市海淀区 | 2018-09-23 10:48:40 |
| 2 | 张老二 | 男 | 1986 | 中文系 | 北京市昌平区 | 2018-09-23 10:48:40 |
| 3 | 张三 | 女 | 1990 | 中文系 | 湖南省永州市 | 2018-09-23 10:48:40 |
| 4 | 李四 | 男 | 1990 | 英语系 | 辽宁省阜新市 | 2018-09-23 10:48:40 |
| 5 | 王五 | 女 | 1991 | 英语系 | 福建省厦门市 | 2018-09-23 10:48:40 |
| 6 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | 2018-09-23 10:48:40 |
+----+--------+------+-------+------------+--------------+---------------------+
-- 例子
CREATE VIEW show_student(id,name,sex,department)
AS SELECT id, name, sex, department FROM student;
-- 删除视图
DROP VIEW [IF EXISTS] 视图名
DROP VIEW show_student
-- 修改视图
ALTER VIEW 视图名 AS
CREATE OR REPLACE VIEW 视图名 AS
-- 查看视图结构
DESCRIBE 视图名
可简写为DESC
-------------------------------------------------------------------
--------------------------------索引--------------------------------
-------------------------------------------------------------------
-- 1、普通索引
-- 语法:
-- 创建索引: CREATE INDEX 索引名 ON 表名(列名);
-- 修改索引: ALTER TABLE 表名 ADD INDEX 自己取得索引名( 列名 )
-- 例子:
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
主键索引是一种特殊的唯一索引,不允许有空值
-- 查看索引:
show INDEX FROM table_name
-- 删除索引
DROP INDEX index_name ON table_name
-------------------------------------------------------------------
--------------------------------数据库备份--------------------------------
-------------------------------------------------------------------
-- 1、语法
-- 备份单个数据库
语法:mysqldump -u username -p 数据库名 table1 table2... tableN > D:\数据库名.sql
例子:mysqldump -uroot -p y04 student > d:\y04.sql
-- 备份整个数据库(全部表)
语法:mysqldump -u root -p -all-databases > D:\all.sql
例子:mysqldump -uroot -p -all y04 > D:\all.sql
-- 备份多个数据库(多个数据库的表)
mysqldump -u 用户名 -p --databases 数据库名1 数据库名2 > D:\数据库名.sql
-- 恢复数据库:
语法: mysql -u root -p 数据库名< C:\backup.sql
例子:mysql -uroot -p y04 < d:\y04.sql
-- 通过这种方式还原时,必须保证两个MySQL数据库的版本号是相同的。
-- MyISAM类型的表有效,对于InnoDB类型的表不可用,InnoDB表的表空间不能直接复制。
------------------------------------------------------------------------------
------------------------------------------------事务---------------------------
------------------------------------------------------------------------------
-- 创建银行卡表
CREATE TABLE bank(
id int primary key auto_increment,
name varchar(20) not null,
money int
)
INSERT INTO bank VALUES(DEFAULT, '小明', 1000),(DEFAULT, '汤少', 1000);
-- 例子
小明给汤少转钱1000?
小明的账户:UPDATE bank SET money=money-1000 WHERE name='小明';
汤少的账户:UPDATE bank SET money=money+1000 WHERE name='汤少';
-- 事务
-- 提交事物:
-- mysql在没有使用START TRANSACTION; 的时候,每一条语句都有自动提交事务
-- 注意:BEGIN 和 START TRANSACTION 都可以开始一个事务,但是建议使用START TRANSACTION,因为BEGIN在mysql中有 BEGIN ……END 语句块的概念
-- 开启事务:START TRANSACTION; 开启事务后,那么sql将不会自动提交
-- -- 开启事务:
-- SET AUTOCOMMIT=0 禁止自动提交
-- SET AUTOCOMMIT=1 开启自动提交, 为什么平时每次操作都可以自动执行?因为mysql默认为 SET AUTOCOMMIT=1
-- 注意:如果使用这种方式,一定注意,禁止自动提交后,最后一定要改回
-- 提交事务:COMMIT; 若开启了事务后,默认的自动提交事务将会关闭,那么就需要使用commit手动提交事务
-- 回滚事务:ROLLBACK; 开启事务之后,若在执行过程中,只要有一句语句执行失败,那么就可以使用rollback执行回滚操作,表示全部sql语句都失效
START TRANSACTION;
UPDATE bank SET money=money-1000 WHERE name='小明';
UPDATE bank SET money=money+1000 WHERE name='汤少';
COMMIT;
-- 回滚事物:
START TRANSACTION;
UPDATE bank SET money=money-1000 WHERE name='小明';
UPDATE bank SET money=money+1000 WHERE name='汤少';
ROLLBACK;
-- 挂起自动提交 0 手动提交
set autocommit = 0;
UPDATE bank SET money=money-1000 WHERE name='小明';
UPDATE bank SET money=money+1000 WHERE name='汤少';
COMMIT; -- 提交事务
set autocommit = 1; -- 恢复自动提交 1 自动提交
-- 事务保存点:
-- SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
SAVEPOINT identifier 01;
-- 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
RELEASE SAVEPOINT identifier;
-- 把事务回滚到标记点;
ROLLBACK TO identifier;
-- 例子:
START TRANSACTION;
UPDATE bank SET money=money-1000 WHERE name='小明';
UPDATE bank SET money=money+1000 WHERE name='汤少';
UPDATE bank SET money=money+1000 WHERE name='汤少';
SAVEPOINT test01;
UPDATE bank SET money=money+1000 WHERE name='汤少';
UPDATE bank SET money=money+1000 WHERE name='汤少';
ROLLBACK TO test01;
-- SET TRANSACTION;用来设置事务的隔离级别。
-- InnoDB存储引擎提供事务的隔离级别有:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
-----------------------------------------------------------------------------------
-------------------------------------存储过程--------------------------------------
-----------------------------------------------------------------------------------
1、创建存储过程语法:
CREATE [DEFINER = {user | CURRENT_USER}] PROCEDURE sp_name([in | out | inout ]参数 类型,参数 类型)
[characteristic ……] routine_body
参数:
[IN | OUT | INOUT ] param_name type
1)IN:表示该参数的值必须在调用存储过程时指定
2)OUT:表示该参数的值可以被存储过程改变,并且可以返回
3)IN,OUT:表示两个参数混合使用,可以同事传入和返回
4)INOUT:表示该参数的调用时指定,并且可以被改变和返回
-- 1-1) 存储过程初体验
-- 不带参数的存储过程
-- 创建一个查询全部学生的存储过程。
delimiter //
create procedure pro_findStudent()
begin
select * from student;
end//
delimiter ;
-- 调用存储过程:带括号和不带括号都可以
call pro_findStudent;
call pro_findStudent();
-- 1-2) in 的应用
delimiter //
create procedure proc2_in(in stu_name varchar(18))
begin
select se.grade from student sd, score se where sd.id=se.stu_id AND sd.name=stu_name;
end//
delimiter ;
-- 调用存储过程
call proc2_in('张老大');
-- 1-3) out的应用
-- 得到id为1的用户名
delimiter //
create procedure proc2_out( out student_name varchar(20))
begin
-- into 表示将返回的结果给student_name
select name into student_name from student sd where sd.id=1;
end//
delimiter ;
-- @grade 相当于声明了一个变量,接受返回的值
call proc2_out(@stu_name);
-- 根据变量得到返回值
select @stu_name;
-- 注意:
-- 1)out表示返回参数,当调用存储过程时需要使用@自定义名 获取out返回的参数,在使用select @自定名查看返回的内容
-- 2)into 表示将得到的值赋给out变量
-- 1-3) in 和 out的应用
delimiter //
create procedure proc2(in stu_name varchar(18), out grade int)
begin
select se.grade into grade from student sd, score se where sd.id=se.stu_id AND sd.name=stu_name;
end//
delimiter ;
-- @grade 相当于声明了一个变量,接受返回的值
call proc2('张老大', @grade);
-- 根据变量得到返回值
select @grade;
-- 1-4)INOUT:inout的应用
-- 设计一个存储过程,实现交换两个数的处理。
delimiter //
create procedure proc3(inout num1 int, inout num2 int)
begin
declare t int default 0;
set t = num1;
set num1 = num2;
set num2 = t;
end//
delimiter ;
-- 设置变量
set @n1 = 3, @n2 = 5;
-- 调用存储过程传入,3,5
call proc3(@n1,@n2);
-- 查看返回结果,为:@n1=5 @n2=3表示交换成功
select @n1,@n2;
-- 存储过程的查看
select name from mysql.proc where db='数据库名' and type= 'PROCEDURE';
-- 例子:
select name from mysql.proc where db='y04' and type= 'PROCEDURE';
-- 查看存储过程的详细
show create procedure proc_name;
-- 例子:
show create procedure proc2_in;
-- 存储过程的删除
DROP PROCEDURE [IF EXISTS] 存储过程名;
-- 例子:
DROP PROCEDURE IF EXISTS pro_findStudent;
-----------------------------------------------------------------------------------
-------------------------------------授权操作--------------------------------------
-----------------------------------------------------------------------------------
-- 1、授权操作:
-- MySQL 默认是不允许远程连接的(另外一台主机远程连接自己),想要在远程连接自己需要对其进行授权
-- 授权给所有主机的密码为`admin`的root用户
grant all on hive.* to 'root'@'%' identified by 'admin'; -- admin 你设定的密码和登录密码无关,别人链接你就需要根据此密码
-- 刷新权限:授权操作后需要刷新
flush privileges;