mysql语法大全,(不断更新)

-----------------------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 num = num +1;
            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; 

你可能感兴趣的:(mysql语法大全,(不断更新))