zoukankan      html  css  js  c++  java
  • mysql学习笔记

    ====================================系统相关=========================================
    
    使用CMD查看mysql版本
    
    -------------
    未登录到mysql服务器
    
    配置了环境变量才可用
    打开cmd
    输入
    mysql -V  
    或者
    mysql --version
    -------------
    
    登录到mysql服务器
    
    使用CMD进入到安装目录的bin
    使用mysql -u root -p
    输入密码
    输入 select version();
    
    +-----------+
    | version() |
    +-----------+
    | 5.7.29    |
    +-----------+
    
    -----------------------------------
    -- 查看数据库系统配置
    show engines;
    
    -----------------------------------
    
    查看当前用户
    select user();
    
    ----------------------------------
    使用MD5 加密
    select MD5('123456');
    结果:e10adc3949ba59abbe56e057f20f883e
    -----------------------------------
    退出CMD
    仅适用于ROOT用户
    exit;
    
    ---------------------------------------
    查看当前所有的数据库
    
    show databases;
    --------------------------------------
    打开指定的库
    
    use 库名
    ----------------------------------------
    查看当前所在的库
    
    select database();
    
    ----------------------------------------
    查看指定数据库中的表
    
    show tables from database_name;
    --------------------------------------
    查看表结构
    
    desc 表名
    ------------------------------------
    去重
    
    distinct
    --------------------------------
    
    
    
    
    ====================================查询相关模板=========================================
    
    -- 表查询
    SELECT * FROM table_name;
    
    -- 截取指定字符串的前3位
    SELECT LEFT("ABCDEFG",3);
    
    -- 字符串拼接
    SELECT CONCAT('Hello',' ','World!');
    
    -- 将字符串使用指定的连接符拼接
    SELECT CONCAT_WS('--','AAA','BBB','CCC');
    
    -- 查询以 java 字段开头的信息
    SELECT * FROM table_name WHERE title LIKE 'java%';
    
    -- 查询包含 java 字段的信息
    SELECT * FROM table_name WHERE title LIKE '%java%';
    
    -- 查询以 java 字段结尾的信息
    SELECT * FROM table_name WHERE title LIKE '%java';
    
    -- '_a_' 三位且中间字母是a的
    SELECT * FROM table_name WHERE title LIKE '_a_';
    
    -- '_a' 两位且结尾字母是a的
    SELECT * FROM table_name WHERE title LIKE '_a';
    
    -- 'a_' 两位且开头字母是a的
    SELECT * FROM table_name WHERE title LIKE 'a_';
    
    -- UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
    SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;
    
    -- UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
    SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;
    
    -- 排序 asc 正序
    SELECT * from runoob_tbl ORDER BY submission_date ASC;
    
    -- 排序 desc 倒序
    SELECT * from runoob_tbl ORDER BY submission_date DESC;
    
    -- 分组
    SELECT `name`, SUM(singin) as singin_count FROM  employee_tbl GROUP BY `name` WITH ROLLUP;
    
    -- 查询姓名中第二个字是小的学生
    select * from student where name like '_小%';
    
    -- 查询姓名中第三个字是小的学生
    select * from student where name like '__小%';
    
    -- 查询姓名中第三个字是a,第五个字是k的学生
    select * from student where name like '__a_k%';
    
    ---------------------------------
    转义
    
    使用excape关键字指定转义符
    select * from student where name like '_$_%' escape '$'
    ---------------------------------
    区间查询
    
    查询年龄在18到22岁之间的学生(前后包含)
    
    select * from student where age between 18 and 22;
     等价于
    select * from student where age >= 18 and age <=22;
    
    ----------------------------------------
    
    
    
    ======================字符函数=========================
    
    length 获取参数的字节个数
    
    select length('abcde');
    结果:5
    
    select length('哈哈哈');
    结果:
    在utf8下是:9
    在GBK下是:6
    
    注意:
    select LEFT('abcde',length('abcde')-1);
    返回abcd
    
    select LEFT('哈,哈,哈',length('哈,哈,哈')-1);
    返回'哈,哈,哈'
    
    这里需要使用char_length()函数
    
    -------------------------------------
    查看字符编码
    
    show variables like '%char%';
    ------------------------------------
    
    转大写
    upper();
    
    转小写
    lower();
    
    -----------------------------------
    
    字符串截取
    从指定索引出截取到后面的所有字符
    substr('ABCDE',3)
    结果:
    CDE
    注意:SQL语言中索引是从1开始的
    ------
    从指定索引开始截取指定长度
    
    substr('ABCDE',3,2)
    结果:
    CD
    -----------------------------------
    
    查询指定字符在字符串中第一次出现的索引
    
    select instr('我于杀戮之中盛放,亦如黎明中的花朵','杀戮');
    结果:
    3
    
    注意:如果没有找到,则返回0
    -------------------------------------
    
    去空格
    select trim('   亚索     ');
    结果:
    亚索
    
    ---------
    
    去掉前后指定字符
    select trim('a' from 'aaaaaaaaa德玛aa西亚aaaaaa');
    结果:
    德玛aa西亚
    
    
    ---------------------------------------
    
    用指定的字符实现“左”填充,实现满足指定长度
    
    select lpad('盖伦',4,'*');
    结果:
    **盖伦
    
    -----
    select lpad('艾欧尼亚昂扬不灭',4,'*');
    结果:
    艾欧尼亚
    
    -----------------
    
    
    用指定的字符实现“右”填充,实现满足指定长度
    
    select rpad('盖伦',4,'*');
    结果:
    盖伦**
    
    -----
    select rpad('艾欧尼亚昂扬不灭',4,'*');
    结果:
    昂扬不灭
    
    
    ----------------------------------------
    
    字符替换
    
    select replace('面向对向编程','对向','对象');
    结果:
    面向对象编程
    ----------------------------------------
    
    截取指定字符前或后的内容
    
    SUBSTRING_INDEX(str,delim,count)
    
    str 要截取的字段名
    delim 指定的字符
    count 大于0的话是截取左侧,小于0的话截取右侧
    
    
    ==============================数学函数=============================
     四舍五入
    
    select round(1.65);
    结果:
    2
    
    -----
    select round(-1.65);
    结果:
    -2
    
    -----
    
    保留两位小数
    select round(1.2345,2)
    结果:
    1.23
    -----
    
    向上取整(返回>=该参数的最小整数)
    select ceil(1.52);
    结果:
    2
    -----
    向下取整(返回<=该参数的最小整数)
    select ceil(1.999);
    结果:
    1
    -----
    截断
    
    select truncate(1.9999999999,1);
    结果:
    1
    ------
    取余
    select mod(10,3);
    结果:1
    
    相当于:
    select 10%3;
    -----------------------------------------
    
    ==================================日期函数============================================
    
    -- 查询指定日期距当前时间多少年
    SELECT TIMESTAMPDIFF( YEAR, '1994-10-22 00:00:00', DATE_FORMAT( NOW( ), '%Y-%m-%d %H:%i:%S' ) ) year_num;
    
    -- 查询指定日期距当前时间多少月
    SELECT TIMESTAMPDIFF( MONTH, '1994-10-22 00:00:00', DATE_FORMAT( NOW( ), '%Y-%m-%d %H:%i:%S' ) ) month_num;
    
    -- 查询指定日期距当前时间多少天
    SELECT TIMESTAMPDIFF( DAY, '1994-10-22 00:00:00', DATE_FORMAT( NOW( ), '%Y-%m-%d %H:%i:%S' ) ) day_num;
    
    -- 查询指定日期距当前时间多少小时
    SELECT TIMESTAMPDIFF(HOUR,'2021-05-20 00:00:00',DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S')) hour_num;
    
    -- 查询指定日期距当前时间多少分钟
    SELECT TIMESTAMPDIFF(MINUTE,'2021-05-20 00:00:00',DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S')) minute_num;
    
    -- 查询指定日期距当前时间多少秒
    SELECT TIMESTAMPDIFF(SECOND,'2021-05-20 00:00:00',DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S')) second_num;
    
    -- 查询当前日期时间
    SELECT NOW() now_datetime;
    
    --  获取指定日期中的年月日时分秒信息
    SELECT YEAR(NOW()) `year`, MONTH(NOW()) `month`, DAY(NOW()) `day`,HOUR(NOW()) `hours`,MINUTE(NOW()) `minute`,SECOND(NOW()) `second`;
    
    -- 获取系统日期,不包含时间
    select CURDATE();
    
    -- 获取系统时间,不包含日期
    select CURTIME();
    
    -- 获取当前日期的英文月
    select MONTHNAME(NOW());
    
    --  将字符通过指定的日期转换成日期
    select STR_TO_DATE('02-22 2008','%c-%d %Y');
    
    -- 将日期转为指定格式的字符串
    SELECT DATE_FORMAT(now(),'%Y年%m月%d日');
    
     
    
    =======================流程控制函数=====================
    
    
    -- if函数,相当于if else
    select if(10<5,'','');
    
    
    -- case 语句,类似java的多重IF
    case 要判断的字段或表达式
        when 常量1 then 要显示的值或语句1;
        when 常量2 then 要显示的值或语句2;
        else 要显示的值或者语句
    end;
    
    ----------------
    case 
        when 条件1 then 要显示的值或语句1;
        when 条件2 then 要显示的值或语句2;
        else 要显示的值或者语句
    end;
    
    =============================聚合函数==================================
    
    注意:
        1.SUMAVG,一般用于处理数值型;MAXMIN,count可以处理任何类型
        2.以上分组函数都忽略null值
        3.可以和关键组搭配
        4.使用count(*)代替count(字段)可提高效率
        5.和分组函数一同查询的字段要求是group by 之后的字段
    
    
    -- SUM 求和
    SELECT SUM(salary) FROM employees;
    
    -- AVG 平均
    SELECT AVG(salary) FROM employees;
    
    -- MIN 最小
    SELECT MIN(salary) FROM employees;
    
    -- AMX 最大
    SELECT MAX(salary) FROM employees;
    
    -- COUNT 统计条数
    SELECT COUNT(salary) FROM employees;
    
    -- COUNT 统计条数
    SELECT COUNT(1) FROM employees;
    
    -- COUNT 统计条数
    SELECT COUNT(*) FROM employees;
    
    效率:
     MYISAM存储引擎下,count(*)的效率高。
     INNODB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)的效率要高一些,
        因为如果按字段统计的话,函数会自动判断值是否为null。
    
    
    ==========================分组查询==========================
    -- 分组查询平均数
    SELECT
        AVG( salary ),
        department_id 
    FROM
        employees 
    GROUP BY
        department_id;
    
    -----------------------------------
    -- 使用where条件的分组查询(分组前筛选)
    SELECT
        AVG( salary ),
        department_id 
    FROM
        employees 
    WHERE
        email LIKE '%a%' 
        AND department_id IS NOT NULL
    GROUP BY
        department_id;
    
    
    ------------------------------------
    
    -- 使用where条件的分组查询(分组后筛选 “HAVING” )
    SELECT
        AVG( salary ),
        department_id 
    FROM
        employees 
    WHERE
        email LIKE '%a%' 
        AND department_id IS NOT NULL
    GROUP BY
        department_id
    HAVING AVG( salary ) > 8000
    
    --------------------------------------
    
    SELECT
        AVG(employees.salary) AS avg_salary, 
        employees.department_id AS department, 
        employees.job_id AS job
    FROM
        employees
    WHERE
        employees.department_id IS NOT NULL
    GROUP BY
        employees.department_id, 
        employees.job_id
    HAVING
        avg_salary > 10000
    ORDER BY
        avg_salary DESC
    
    -----------------------------------------
    
    注意:
        1.分组前筛选的数据源是原始表,条件是在group by前,使用关键字where
        2.分组后筛选的数据源是分组后的结果集,条件是在group by后,使用关键字having
        3.分组函数做条件,肯定是放在having子句当中
        4.能用分组前筛选的,尽量在分组前进行筛选
        5.group by子句支持单个字段分组,也支持多个字段分组(将要分组的字段写在group by关键字后,用逗号隔开)
        6.order by子句支持单个字段排序,也支持多个字段排序(将要排序的字段写在order by关键字后,用逗号隔开)
    
    
    
    ================================连接查询===============================
    
    按年代分类:
        sql92标准:仅仅支持内连接
            等值连接:
                多表等值连接的结果为多表的交集部分
                N表连接,至少需要N-1个连接条件
                多表的顺序没有要求 
                一般需要为表起别名
            非等值连接:
                
        
    
        sql99标准:【推荐】:支持内连接+外连接(左外,右外)+交叉连接
    
    按功能分类:
        内连接:
            等值连接
            非等值连接
            自连接
        外连接:
            左外连接
            右外连接
            全外连接
        交叉连接
    
    ----------------
    为表起别名
        1.提高语句的简介度
        2.区分多个重名的字段
    注意:
        如果为表起了别名,就不能用原来的表名
    
    ----------------------------------------------
    
    等值连接
    
    SELECT
        jobs.job_title, 
        COUNT(*)
    FROM
        jobs,
        employees
    WHERE
        jobs.job_id = employees.job_id
    GROUP BY
        jobs.job_title
    ORDER BY
        count(*) DESC
    
    结果:
    jobs.job_title            COUNT(*)
    ******************************************
    Sales Representative        30
    Stock Clerk            20
    Shipping Clerk            20
    Programmer            5
    Sales Manager            5
    Purchasing Clerk        5
    Stock Manager            5
    Accountant            5
    
    ----------------------------------------------
    
    非等值连接
    
    SELECT
        employees.salary, 
        job_grades.grade_level
    FROM
        employees,
        job_grades
    WHERE
        employees.salary BETWEEN job_grades.lowest_sal AND job_grades.highest_sal AND
        job_grades.grade_level = 'A'
    
    结果:
    employees.salary    job_grades.grade_level
    *************************************************
    2900.00            A
    2800.00            A
    2600.00            A
    2500.00            A
    2700.00            A
    2400.00            A
    
    
    ------------------------------------------------------------------
    自连接
    
    SELECT DISTINCT
        Province.`name` 省, 
        city.`name` 市, 
        district.`name` 区
    FROM
        area AS Province,
        area AS city,
        area AS district
    WHERE
        Province.id = city.pid AND
        city.id = district.pid
    结果:
    省    市    区
    ***************************
    北京市    北京市    东城区
    北京市    北京市    西城区
    北京市    北京市    崇文区
    北京市    北京市    宣武区
    北京市    北京市    朝阳区
    北京市    北京市    丰台区
    北京市    北京市    石景山区
    北京市    北京市    海淀区
    北京市    北京市    门头沟区
    
    
    =============外连接=============
    
    应用场景:用于查询一个表中有,另外一个表中没有的记录
    
    特点:
        1、外连接的查询结果为主表中的全部记录
            如果从表中有和它匹配的记录则显示该匹配的值
            如果从表中没有相匹配的值,显示null
            外连接查询结果=内连接结果+主表中有而从表没有的记录
        2、左外连接,left join左边的是主表
           右外连接,right join右边的是主表
        3、左外和右外交换两个表的顺序,可以实现同样的效果
    
    一般将作为主要数据来源的表作为主表
    
    
    ==================子查询====================
    
    分类:
        按子查询出现的位置:
            select后面
            from后面
            where或者having后面
            exists后面(相关子查询)
        按结果集的行列数不同:
            标量子查询(结果集只有一行一列)
            列子查询(结果集只有一列多行)
            行子查询(结果集只有一行多列)
            表子查询(结果集是多行多列的表)
    
    -------------
    
    where 或 having后面
    1、标量子查询(当行子查询)
    2、列子查询(多行子查询)
    3、行子查询(多列子查询)
    
    特点:
        1、子查询放在小括号内
        2、子查询一般放在条件的右侧
        3、标量子查询,一般搭配单行操作符使用
            > < >= <= = <>
    列子查询,一般搭配多行操作符使用
        inany/someall
    
    
    -------标量子查询--------
    
    
    子查询执行先于主查询,因为主查询要用到子查询返回的数据
    
    
    --------分页查询---------
    
    应用场景:当要显示的数据,一页显示不全或者数据量过大,可考虑使用分页的方式来显示
    
    语法:
        select 显示字段
        from 表
        【连接类型 join 表2 on 连接条件
        where 筛选条件
        group by 分组字段
        having 分组后筛选
        order by 排序字段列表】
        limit offset,size
        
        offset 表示要显示条目的起始索引(起始索引从0开始)
        size 表示要查询条目的数量
    
    案例1:查询前10条
        select * from employee limit 0,10;
    案例2:每页10条,查询第5页
        select * from employee limit (5-1)*10,10;
    
    --------------------------------
    联合查询union
    
    注意:
        1、使用union时两个结果集的字段和类型最好一致
        2、union会自动去重,如果要返回全部数据,使用union all
    
    
    ===================数据操作==================
    
    
    数据插入
    
    语法
    1insert into 表名 set 列1=值1,列2=值2 ……
    
    2insert into 表名 (列1,列2,列3 ……) values(值1,值2,值3 ……)
    
    3insert into 表名 values(值1,值2,值3 ……),(值11,值22,值33 ……),(值111,值222,值333 ……)
    
    从tab1查询数据插入到tab2
    4insert into tab2 (列1,列2,列3 ……) select 值1,值2,值3 …… from tab1
    
    5insert into tab2 select col01,col02,col03 from tab1 where id < 10
    
    插入数据 如果已存在则删除旧数据插入新数据
    6REPLACE INTO table_name(col1,col2,col3) values(val1,val2,val3);
    
        写法扩展:
        1. replace into tbl_name(col_name, ...) values(...)
    
        2. replace into tbl_name(col_name, ...) select ...
    
        3. replace into tbl_name set col_name=value, ...
    
    
    ------------
    数据修改
    
    修改单表
    UPDATE table_name SET f1=v1,f2=v2 WHERE f3=v3;
    
    
    修改多表
    
    SQL92语法
      update 表1 别名,表2 别名
      set=where 连接条件
      and 筛选条件
    
    SQL99语法
      update 表1 别名
      inner | left | right join 表2 别名 ON 连接条件
      set=where 筛选条件
    
     
    -------------
     数据删除
    
    方式一
    
    1、单表的删除
       delete from 表1 where 筛选条件;
    
    2、多表的删除
    
    SQL92语法
    
       delete 表1别名,表2别名
       from 表1 别名,表2 别名
       where 连接条件
       and 筛选条件
    
    SQL99语法
       
       delete 表1别名,表2别名
       from 表1 别名
       inner | left | right join 表2 别名 ON 连接条件
       where 筛选条件
    
    
    方式二
    
    truncate 语句
    
    全表删除
    truncate table 表名;
    
    注意:
    
    1、使用delete可以加where条件,truncate不能加条件
    2、truncate效率更高
    3、使用truncate删除之后自增长值列会重置
    4、使用delete删除之后有返回值,是用truncate删除之后没有返回值
    5、使用delete删除可以回滚,使用truncate删除之后无法回滚
    
    
    =========================数据定义=========================
    
    一、 库的管理
    
    1、库的创建(不存在则创建)
    create database if not exists 库名;
    
    2、库的修改
    
    重命名(已弃用)
    rename database books to 新库名;
    
    
    更改库的字符集
    alter database books character set gbk;
    
    3、库的删除(如果存在则删除)
    dorp database if exists books;
    
    
    二、表的管理
    
    1、表的创建
    
    create table if not exists 表名(
        列名 列的类型[(长度) 约束],
        列名 列的类型[(长度) 约束],
        列名 列的类型[(长度) 约束],
        ......
        
        列名 列的类型[(长度) 约束]2、表的修改
    
    1)修改列名
    alter table 表名 change column 旧列名 新列名 列类型;
    
    2)修改列的类型或约束
    alter table 表名 modify column 列名 类型;
    
    3)添加列(添加到指定位置)
    alter table 表名 add column 列名 类型 [first|after 列];
    
    4)删除列
    alter table 表名 drop column 列名;
    
    5)修改表名
    alter table 表名 rename to 新表名;
    
    
    3、表的删除
    drop table if exists 表名;
    
    
    4、表的复制
    
    1)复制表结构
    create table 新表名 like 原表;
    
    2)复制表结构和数据
    create table 新表名 select * from table_name;
    
    3)复制表结构和部分列的数据
    create table 新表名 select * from table_name where 筛选条件;
    
    4)仅复制某些字段,不复制数据
    create table 新表名 select 列1,列2 from table_name where 1 != 1;
    
    
    =========================数据约束========================
    
    六大约束
    
    1NOT NULL非空约束
    2DEFAULT 默认约束
    3PRIMARY KEY主键约束
    4UNIQUE 唯一约束
    5CHECK 检查约束【mysql不支持】
    6FOREIGN KEY 外键约束
    
    
    ==========================数据库的事务=========================
    
    原子性
    一致性
    隔离性
    持久性
    
    隐式事务:事务没有明显的开启和结束的标记
    比如insert、updatedelete
    
    显式事务:事务具有明显的开启和结束的标记
    前提:必须先设置自动提交功能为禁用
    
    set autocommit = 0;
    
    步骤1:开启事务
    set autocommit=0;
    start transaction;(可选)
    
    步骤2:编写事务中的sql语句;
    语句1;
    语句2;
    ...
    
    步骤3:结束事务
    commit;提交事务
    rollback;回滚事务
    
    savepoint 节点名; 设置保存点
    
    -------------
    设置当前MySQL连接的隔离级别:
    set transaction isolation level read committed;
    
    设置数据库系统的全局隔离级别:
    set global transaction isolation level read committed;
    
    查看当前隔离级别
    select @@tx_isolation;
    
    =====================视图=======================
    
    创建视图
    
    create view 视图名
    as
    查询语句;
    
    ========================变量==========================
    
    系统变量
        全局变量
        会话变量
    自定义变量
        用户变量
        局部变量
    
    ----------系统变量---------
    查看所有系统变量
        show global | [session] variable;
    
    查看满足条件的部分系统变量
        show global | [session] variable like '%char%';
    
    查看指定的某个系统变量的值
        select @@global | [session] .系统变量名;
    
    为某个系统变量赋值
        
        方式一
        set global | [session] 系统变量名 = 值;
        方式二
        set @@global | [session] .系统变量名 = 值;
    
    注意:
    如果是全局级别,则需要加global,如果是会话级别,则可选session,默认是session
    
    
    ----------自定义变量---------
    
    ---用户变量---
    
    一、声明并初始化
    1) set @用户变量名=值;
    2) set @用户变量名:=3) select @用户变量名:=值
    
    二、赋值
    
    方式一:
        1) set @用户变量名=值;
        2) set @用户变量名:=值;
        3) select @用户变量名:=值;
    
    方式二:
        select 字段名 into @变量名 from 表名;
    
    
    查看用户变量的值
    select @变量名;
    
    ---局部变量---
    
    一、声明
    
    declare 变量名 类型;
    declare 变量名 类型 default 值;
    
    二、赋值
    
    
    方式一:
        1) set @局部变量名=值;
        2) set @局部变量名:=值;
        3) select @局部变量名:=值;
    
    方式二:
        select 字段名 into @变量名 from 表名;
    
    
    三、使用
     只能在begin end语句中,且只能是第一句话!!!
    
    =======================存储过程======================
    
    
    一、创建语法
     create procedure 存储过程名(参数列表)
     begin
        存储过程体(一组合法的SQL语句)
     end;
    
     注意:
     1、参数列表包含三部分
     参数模式 参数名 参数类型
     
     eg:
     IN student_name varchar(20)
    
     参数模式:
    
     IN:该参数可以作为输入,也就是该参数需要调用方传入值
     OUT:该参数可以作为输出,也就是该参数可以作为返回值
     INOUT:该参数既可以作为输入又可以作为输出,也就是既需要传入值,有可以返回值
    
    
    2、如果存储过程体重仅仅只有一句话,begin end可以省略
    存储过程体中的每条SQL语句的结尾要求必须加分号。
    存储过程的结尾可以使用DELIMITER重新设置
    
    语法:DELIMITER 结束标记
    案例:DELIMITER $
    
    二、调用语法
    
    call 存储过程名(实参列表);
    
    案例1:(无参)
    
    创建
    DELIMITER $
    CREATE PROCEDURE myp1()
    begin
    
        insert into student(name,age)
        values
        ('张三',20),
        ('李四',20),
        ('王五',20);
    
    end $
    
    调用
    CALL myp1() $
    
    
    ---------------------
    案例2:(单个参数)
    
    创建
    DELIMITER $
    create procedure myp2(in name varchar(20))
    begin
        select s.* from student s where s.name = name;
    end $
    
    调用
    CALL myp12('张飞') $
    ---------------------
    
    案例3:(多个参数)
    
    创建
    DELIMITER $
    create procedure myp2(in name varchar(20),in age int(4))
    begin
        declare result varchar(20) default '';#声明并初始化
    
        select count(*) into result #赋值 
        from student s 
        where s.name = name AND s.age = age;
    
        select if(result > 0,'成功','失败'); #使用
    end $
    
    调用
    call myp3('赵云',20) $
    
    ----------------------
    
    创建带out的存储过程
    
    带一个输入一个输出:
    
        CREATE DEFINER=`root`@`localhost` PROCEDURE `myp2`(IN `username` varchar(20),OUT `user_id` int(5))
        BEGIN
            SELECT a.id INTO user_id
            FROM admin a 
            WHERE a.username like CONCAT("%",username,"%");
        END;
    
    调用:
        CALL myp2('lyt',@userid);
        SELECT @userid;
    
    带一个输入两个输出:
    
        CREATE DEFINER=`root`@`localhost` PROCEDURE `myp3`(IN `id` int(2),OUT `username` varchar(20),OUT `password` varchar(20))
        BEGIN
    
            SELECT a.username,a.password INTO username,password
            FROM admin a
            WHERE a.id = id;
    
        END;
    
    调用:
        CALL myp3(1,@a,@b);
        SELECT  @a,@b;
    
    带两个输入(将传入的参数翻倍):
        CREATE DEFINER=`root`@`localhost` PROCEDURE `myp4`(INOUT `inputA` int(5),INOUT `inputB` int(5))
        BEGIN
    
            SET inputA = inputA*2;
            SET inputB = inputB*2;
    
        END;
    
    调用:
        SET @A = 5;
        SET @B = 12;
    
        CALL myp4(@A,@B);
    
        SELECT @A,@B;
    
    创建存储过程,将日期格式化成字符串:
        CREATE DEFINER=`root`@`localhost` PROCEDURE `myp5`(IN `inDate` datetime,OUT `outDate` varchar(50))
        BEGIN
            SELECT DATE_FORMAT(inDate,'%Y年%m月%d日') INTO outDate;
        END;
    调用:
        CALL myp5(now(),@A);
        SELECT @A '日期';
    
    
    三、删除存储过程
    语法:drop procedure 存储过程名;
    
    
    四、查看存储过程的信息
    show create procedure 存储过程名;
    
    
    
    
    ======================函数=====================
    
    CREATE DEFINER=`root`@`localhost` FUNCTION `fun1`() RETURNS int(11)
    BEGIN
        DECLARE result int(5);
        SELECT count(*) INTO result FROM admin;
        RETURN result;
    END
    
    查看函数:
    show create function 函数名;
    
    删除函数:
    drop function 函数名;
    
    
    ======================流程控制结构=====================
    简单介绍:
    
        顺序结构:程序从上往下依次执行
        分支结构:程序从两条或多条路径中选择一条执行
        循环结构:程序在满足一定条件下,重复执行一段代码
    
    
    一、分支结构
    1.if函数
    if(表达式1,表达式2,表达式3)
    
    2.case结构
    等值判断,多重if
    
    case 变量|表达式|字段
        when 要判断的值 then 返回值1
        when 要判断的值 then 返回值2
        when 要判断的值 then 返回值3
        else 要返回的值n
    end
    
    3.if结构
    if 条件1 then 语句1;
    elseif 条件2 then 语句2;
    ……
    [else 语句n]
    
    应用场景:
    应用在begin end中
    
    二、循环结构
    分类:
    while,loop,repeat
    
    循环控制:
    iterate类似于continue,结束本次循环,继续下一次循环
    leave类似于break,结束当前所在的循环
    
    
    1.while 
    语法:
    【标签:】 while 循环条件 do
        循环体;
    end while 
    【标签】;
    
    2.loop 
    
    语法:
    【标签:】loop
        循环体;
    end loop
    【标签】;
    
    3.repeat
    语法:
    【标签:】repeat
        循环体;
     until 结束循环的条件
     end repeat
     【标签】;
    成功不是终点,失败也并非末日,重要的是前行的勇气!
  • 相关阅读:
    玩4K必备知识:HDMI1.4、2.0、2.0a、2.0b接口参数对比【扫盲贴】
    Gradle配置最佳实践
    Android Studio 中安装 apk 被拆分成多个 slice,如何禁止?
    编译不同平台 设定
    编译找错
    Delphi 中内存映射对于大文件的使用
    linux——nmap端口扫描命令
    Android 使用 adb命令 远程安装apk
    插件编译 版本问题
    2019 opensuse linux Eclipse
  • 原文地址:https://www.cnblogs.com/DSH-/p/14955265.html
Copyright © 2011-2022 走看看