为了账号安全,请及时绑定邮箱和手机立即绑定

与MySQL的零距离接触

平然 学生
难度入门
时长 8小时29分
学习人数
综合评分9.67
943人评价 查看评价
9.9 内容实用
9.6 简洁易懂
9.5 逻辑清晰
  • 自定义函数的两个必要条件:参数,返回值

    03:35
    看视频
  • 1.连接 MySQL在SELECT语句、多表更新、多表删除语句中支持JOIN操作。 语法结构 table reference A {[INNER|CROSS] JOIN | {LEFT|RIGHT} [OUTER] JOIN} table_reference B ON condition_expr 2.数据表参照 table_reference tbl_name [[AS] alias] | table_subquery [AS] alias 数据表可以使用tbl_name AS alias_name 或 tbl_name alias_name赋予别名。 table_subquery可以作为子查询使用在FROM子句中,这样的子查询必须为其赋予别名。
    02:51
    看视频
  • 查看创建的函数和存储过程:SHOW FUNCTION STATUS;

    SHOW PROCEDURE STATUS;

  • DESC tbl_name;查看表结构,和show columns from tbl_name;一样

    MySQL中的ROW_COUNT()函数可以返回前一个SQL进行UPDATE,DELETE,INSERT操作所影响的记录总数。

  • create procedure removeUserByIdReturnNums(in u_id int unsigned,out nums int unsigned)

        -> begin

        -> delete from user where id = u_id;

        -> select count(id) from user into nums;

        -> end

        -> //

    SELECT count(id) FROM users INTO userNums;   INTO是将查询结果的表达式传给userNums这个参数。

    在begin end之间通过DECLARE创建的变量为局部变量,只在begin end中有效。

    用SELECT @,SELECT.... INTO ...和SET @... 创建的变量为用户变量,在当前客户端上均有效。

    call removeUserByIdReturnNums(27,@nums)

  • DELIMITER //

    CREATE PROCEDURE removeUserById(IN id INT UNSIGNED)

    ->BEGINE

    ->DELETE FROE users WHERE id=id;   我们认为第一个id指的是字段名称,第二个id指的是需要指定的参数,但是MySQL数据库认为这两个id都是字段,因此会删除全部记录。因此需注意,参数名不可以和记录名相同。将参数的id都改为p_id。

    ->END

    修改存储过程只能修改几个简单的选项,例如注释,内容的类型等。并不能修改过程体。如要修改过程体,则将原来的过程删除,然后重新创建。

    删除存储过程:DROP PROCEDURE [IF EXISTS] sp_name;


  • 调用存储过程:CALL sp_name([parameter[,...]]);

    CALL sp_name[()];

    存储过程在封装时没有参数的话,小括号可以省略。


  • 创建存储过程

    CREATE [ DEFINER = { user | CURRENT_USER } ] PROCEDURE sp_name ( [ proc_parameter[,...]]) [ characteristic ...] routine_body;

    proc_parameter:  [ IN | OUT | INOUT ] param_name type

    其中,sp_name 存储过程名。proc_parameter 参数,可以没有。

    DEFINER =user|CURRENT_USER表示创建者,若这句话省略的话,就默认为登陆到MySQL客户端的用户

    IN;该参数的值必须在存储过程时指定。

    OUT;该参数的值可以被存储过程改变,并且可以返回

    INOUT;改参数在调用时指定,并且可以被改变和返回

    特性:

    CONTAINS SQL : 包含SQL语句,但不包含读写数据的语句

    NO SQL : 不包含SQL语句

    READS SQL DATA : 包含读数据的语句

    MODIFIES SQL DATA :包含写数据的语句

    SQL SECURITY { DEFINER | INVOKER } 指明谁有权限来执行

    过程体:只能对数据表、库进行增删改查

  • <!--此处有图片-->        

    莨菽菽            

    替大家总结一下:declare可以声明变量,比如  declare @a  int,只不过声明全局变量可以省略declare,而在begin--end里面声明需要用declare,而且要放在第一行(而不是老师说的用declare声明的就是局部变量)

    你们肯定会赞我的,但是赞我又收不到通知。真是打击积极性


    转自评论区


  • 可以对全部记录做分组,也可以对部分记录做分组 对部分记录进行分组 就需要使用having

  • 分组时可以指定列名,列的位置和升序或降序

    00:31
    看视频
  • select 查询表达式的顺序将影响结果集的顺序

    字段集的别名也将影响结果集的别名

    06:06
    看视频
  • 当删除一条id=6的记录,最后的一条记录id=8,再插入一条记录id=9

  • DELIMITER //     修改结束符分号;为//

    CREATE FUNCTION adduser(username VARCHAR(20)) 
    ->RETURNS INT UNSIGNED

    ->BEGINE

    ->INSERT test(username) VALUES(username);

    ->RETURN LAST_INSERT_ID();

    ->END

    -> //


  • 删除函数:DROP FUNCTION f1;

    SET GLOBAL log_bin_trust_function_creators = 1;

    CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
        -> RETURNS FLOAT(10,2) UNSIGNED
        -> RETURN (num1+num2)/2;

    SELECT f2(1,2);
    +---------+
    | f2(1,2) |
    +---------+
    |    1.50 |
    +---------+


  •  CREATE FUNCTION f1() RETURNS VARCHAR(30)
     -> NO SQL
     -> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');

    在 MySQL中,函数的类别有:
    1.CONTAINS SQL 包含了SQL语句(函数默认为这种类型)
    2.READS SQL DATA 只是读取数据,不修改数据
    3.NO SQL 没有SQL语句(当然也不会修改数据)
    4.DETERMINISTIC 确定的
    5.MODIFIES SQL DATA 将修改数据

  • 用户自定义函数UDF

    函数一定有名字,后面跟小括号,括号内部是参数,执行函数后会得到返回值。

    参数和返回值之间没有必然的内在的联系,所有函数都有返回值,但并不一定有参数,比如显示当前数据库版本的VERSION()函数。

    参数的数量理论上不能超过1024个。

    创建自定义函数:CREATE FUNCTION function_name RETURNS { STRING | INTEGER | REAL | DECIMAL } routine_body;

    关于函数体

    1. 函数体有合法的SQL语法构成

    2. 函数体可以是简单的SELECT或INSERT语句

    3. 函数体如果为复合结构则使用BEGIN...END语句

    4. 复合结构可以包含声明,循环,控制结构

  • SELECT MD5('admin');返回32位的字符串

    SELECT PASSWORD('admin');新版中,该条语句报错,已废弃password字段和password()函数,改为用SELECT SHA('admin');

     SELECT SHA('admin');
    +------------------------------------------+
    | SHA('admin')                             |
    +------------------------------------------+
    | d033e22ae348aeb5660fc2140aec35850c4da997 |
    +------------------------------------------+

  • 聚合函数典型特点:只有一个返回值。需要配合数据表使用

    AVG()       平均值

     SELECT AVG(goods_price) AS avg_price FROM tdb_goods;返回所有价格的平均值

    COUNT()   计数

    SELECT COUNT(goods_id) AS counts FROM tdb_goods;返回所有记录的条数

    MAX()       最大值

    MIN()         最小值

    SUM()         求和

  • SELECT CONNECTION_ID();返回当前连接的ID,也是线程的ID。 

    SELECT DATABASE();返回当前打开的数据库的名称。

    SELECT LAST_INSERT_ID();返回最后插入的记录的ID号。必须存在自动编号的id。同时写入多条记录时,只返回第一条写入记录的ID号,不能得到后续记录的ID。

    SELECT USER();返回当前用户的名称。

    SELECT VERSION();返回当前MySQL数据库的版本号。

  • SELECT NOW(); 返回当前日期和时间,年-月-日 时:分:秒

    SELECT CURDATE(); 返回当前日期,年-月-日

    SELECT CURTIME(); 返回当前时间,时:分:秒

    SELECT DATE_ADD('2020-4-5', INTERVAL 365 DAY);返回2021-4-5,可以加-365 DAY,1 YEAR,3 WEEK,对日期进行变化

    SELECT DATEDIFF('2020-4-5','2022-3-16');返回710,两个日期的差值

    SELECT DATE_FORMAT('2020-4-5','%m/%d/%Y');返回04/05/2020,对日期进行格式化


  • [NOT] BETWEEN...AND...  [不]在范围之内

    例如:SELECT 15 BETWEEN 1 AND 22; 返回1。

    SELECT 35 BETWEEN 1 AND 22; 返回0。

    表示的是一个闭合区间,[1,22]。

    [NOT] IN()  [不]在取值范围内

    例如:SELECT 10 IN(5,10,15,20);返回1

    IS [NOT] NULL  [不]为空

    NULL为空,空字符''不为空,0不为空


  • SELECT CEIL(3.01); 返回:4,进一取整,向上取整

    SELECT FLOOR(3.97);返回:3,舍一取整,向下取整

    SELECT 3/4;返回:0.75

    SELECT 3 DIV 4;返回:0,整数除法

    SELECT 5 MOD 3;返回:2,取余数(取模),MOD可以写成%,也表示取余数,被除数也可为小数

    SELECT POWER(3,3);返回:27,3的3次幂运算

    SELECT ROUND(3.652,2); 返回:3.66,四舍五入,保留小数点后留两位

    SELECT TRUNCATE(125.89,1); 返回:125.8,直接截断小数位数,不进行四舍五入。

  • SELECT CONCAT('A','B'); 返回:AB,连接字符。

    SELECT CONCAT(first_name,last_name) AS full_name FROM test;把表test中的first_name和last_name两列连接起来,显示为full_name一列。

    CONCAT_WS('|','A','B','C');返回:A|B|C,使用指定分隔符连接字符串,至少需要三个参数。

    CONCAT_WS('|',id,username) FROM test;把表test中的id和username两列用分隔符|连接起来,显示为一列。

    SELECT FORMAT(12560.75,1);返回:12,560.8,数字格式化

    SELECT LOWER('MySQL');返回:mysql,全部转换成小写字母

    SELECT UPPER('MySQL');返回:MYSQL,全部转换成大写字母

    SELECT LEFT('MySQL',2);返回:My,获取从左侧第一位为起始的,指定长度的字符

    SELECT RIGHT('MySQL',2);返回:QL,获取从右侧第一位即最后一位为起始,往前数指定长度的字符

    SELECT LENGTH('My SQL'); 返回:6, 获取字符长度,空格也算

    LTRIM()  删除第一个字符之前的空格

    RTRIM()  删除最后一个字符之后的空格

    TRIM()  删除前导和后续空格,但是无法删除字符串中字符之间的空格

    SELECT REPLACE('??My??SQL???','?','');返回:MySQL,将字符?替换成空

    SELECT SUBSTRING('MySQL',1,2);返回:My,从第一位开始截取,取两位

    SELECT SUBSTRING('MySQL',3); 返回:SQL,代表从第三位开始截取,取到结尾

    SELECT SUBSTRING('MySQL',-3);返回:SQL,最后一位为-1,往前数到-3为起始位置,取到结尾

    SELECT SUBSTRING('MySQL',-3,2); 返回:SQ,第-3位为起始,取两个字符长度

    SELECT SUBSTRING('MySQL',-3,-1);  返回值为空,MySQL中不允许这种写法,只能起始位为负值,长度不能为负值

    SELECT 'MySQL' LIKE 'MS%'; 返回值为1代表true,0代表false。

    为了查找记录中first_name包含%的记录:

    SELECT * FROM test WHERE username LIKE '%%%';MySQL中认为三个百分号都是通配符,并不是我们所认为的第二个为字符串,其他两个为通配符,所以不能找到正确的记录

    SELECT * FROM test WHERE username LIKE '%1%%' ESCAPE '1'; 代表查找用户名中包含%字符的结果,1后边的%不需要再进行解析,直接认为是字符%,其中1可以为任意的一个字符。

    通配符:百分号%代表任意一个或者多个字符,下划线_代表任意一个字符。

  • 子查询是指出现在select语句中的,必须出现在小括号内。

    子查询的外层可以是select语句,insert语句、update语句及delete语句。

    子查询中可以包含多个关键字或条件,如group by、order by、limit以及相关函数等。

    使用子查询的环境:

    1. 比较运算符引发的子查询

    2. in或not in引发的子查询

    3. exist或not exist引发的子查询。

  • delete t1 from tdb_goods as t1  //从本表中删除,将tdb_goods看做t1
    left join (select goods_id,goods_name from tdb_goods group by goods_name having count(goods_name)>=2) as t2  //子查询得到重复条目
    on t1.goods_name=t2.goods_name  //t1和t2的连接条件
    where t1.goods_id>t2.goods_id;  //删除id号较大的条目

    删除表中名字相同的记录,删除id较大的记录。

首页上一页1234567下一页尾页

举报

0/150
提交
取消
课程须知
要想学习本课程,你只需要知道数据库是个什么东东就足够了,是不是很easy?!
老师告诉你能学到什么?
1、MySQL安装与配置 2、数据类型 3、流程控制与运算符 4、DDL、DCL、DQL、DML 5、常用函数 6、表类型(存储引擎) 7、图形化工具

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!