盘点MySQL数据库的数据类型、库和表常见操作、索引、视图、函数等知识点

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 盘点MySQL数据库的数据类型、库和表常见操作、索引、视图、函数等知识点

前言


在日常开发中,存储数据的最常用的方式便是数据库了,其中最为著名的便是MySQL数据库,因它简便易于上手而且可扩展性强大,跨平台使得它广为使用。上一篇文章,我们讲到了它的安装,今天我们就来具体聊聊它的这篇文章分为11个部分,分别包括MySQL数据库的数据类型、库和表常见操作、索引、视图、函数、游标、触发器、存储过程、事务、备份与还原、用户账号、其它等知识点。

一、mysql 数据类型


1.数值类型

7MySQL支持所有标准SQL数值数据类型。


这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。


关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。


BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。


作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32   767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8   388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967   295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744   073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494   351 E-38,3.402 823 466 E+38) 单精度   浮点数值
DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073   858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073   858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度   浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值


2.日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。


每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。


TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小   (*字节)** 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

3.字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

   

CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

   

BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

   

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

   

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

Enum('fds','fsa','fasf') :枚举类型

set(val1,val2,val3):集合类型


二、库表操作


1.数据库操作

显示全部数据库:         SHOW DATABASES;创建数据库:       CREATE DATABASE IF NOT EXISTS people;          切换数据库:       USE people;删除数据库:       DROP DATABASE IF EXISTS people;查看当前数据库库信息:        SHOW CREATE DATABASE people;修改数据库的选项信息:       ALTER DATABASE people;

2.数据表操作

显示数据库里所有数据表的信息:       SHOW TABLE STATUS FROM people;显示全部数据表:     SHOW TABLES; 单张表:show tables from df   清空数据表:      TRUNCATE df;表检测:      CHECK TABLE df;  表优化:       OPTIMIZE TABLE df;表修复:    REPAIR TABLE df;表分析:      ANALYZE TABLE df;分析表 键状态是否正确:     ANALYZE TABLE orders;检查表是否存在错误:  check TABLE orders,orderitems QUICK;# QUICK只进行快速扫描优化表OPTIMIZE TABLE,消除删除和更新造成的磁盘碎片,从而减少空间的浪费:OPTIMIZE TABLE orders;查询表结构:   DESC df;DESCRIBE df; EXPLAIN df;SHOW COLUMNS FROM df;复制表:   CREATE TABLE de LIKE df; SELECT * INTO  IN 'hw' FROM df;修改表名:   RENAME TABLE de TO people.dh;(可将表移动到另一个数据库)修改表字段:   ALTER TABLE df ADD/DROP/CHANGE 拼接字段:SELECT CONCAT(us,'(',tim,')') FROM df ORDER BY us ASC;result=>us(tim)
添加主键约束:alter TABLE 表名 ADD CONSTRAINT 主键 (形如:PK_表名) PRIMARY KEY 表名(主键字段);添加外键约束:alter TABLE 从表 ADD CONSTRAINT 外键(形如:FK_从表_主表) FOREIGN KEY 从表(外键字段) REFERENCES 主表(主键字段);删除主键约束:alter TABLE 表名 DROP PRIMARY KEY;删除外键约束:alter TABLE 表名 DROP FOREIGN KEY 外键(区分大小写);
-- 添加外键约束CREATE TABLE stu(sid INT PRIMARY KEY,NAME VARCHAR(50) NOT NULL);-- 添加外键约束方式一CREATE TABLE score1(score DOUBLE,sid INT,CONSTRAINT fk_stu_score1_sid FOREIGN KEY(sid) REFERENCES stu(sid));-- 添加外键约束方式二(若表已存在,可用这种)CREATE TABLE score1(score DOUBLE,sid INT);ALTER TABLE score1 ADD CONSTRAINT fk_sid FOREIGN KEY(sid) REFERENCES stu(sid)


三、索引


CREATE UNIQUE INDEX qw ON df(us); #创建不重复索引ALTER TABLE df ADD UNIQUE INDEX wq(id); #添加索引SHOW INDEX FROM df;#检索索引DROP INDEX qw ON people.df; #删除索引ALTER TABLE df DROP INDEX wq; #删除索引


四、视图


CREATE VIEW shitu AS SELECT us FROM df; 创建视图ALTER VIEW shitu AS SELECT us FROM df WHERE us='gf'; 修改视图SELECT * FROM shitu; 查看视图结果DROP VIEW IF EXISTS shitu;删除视图


五、函数


文本处理函数ASCII(CHAR)返回字符的ASCII码值BIT_LENGTH(str)返回字符串的比特长度CONCAT(s1,s2...,sn)将s1,s2...,sn连接成字符串CONCAT_WS(sep,s1,s2...,sn)将s1,s2...,sn连接成字符串,并用sep字符间隔INSERT(str,X,Y,INSTR) 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果FIND_IN_SET(str,LIST)分析逗号分隔的list列表,如果发现str,返回str在list中的位置LCASE(str)或LOWER(str) 返回将字符串str中所有字符改变为小写后的结果LEFT(str,X)返回字符串str中最左边的x个字符LENGTH(s)返回字符串str中的字符数LOCATE(str)  找出str串的一个子串LOWER(str)  将str串转换为小写LTRIM(str) 从字符串str中切掉开头的空格POSITION(SUBSTR,str) 返回子串substr在字符串str中第一次出现的位置QUOTE(str) 用反斜杠转义str中的单引号REPEAT(str,srchstr,rplcstr)返回字符串str重复x次的结果REVERSE(str) 返回颠倒字符串str的结果RIGHT(str,X) 返回字符串str中最右边的x个字符RTRIM(str) 返回字符串str尾部的空格SOUNDEX(str)  返回str串的SOUNDEX值STRCMP(s1,s2)比较字符串s1和s2SUBSTRING()  返回子串的字符TRIM(str)去除字符串首部和尾部的所有空格UCASE(str)或UPPER(str) 返回将字符串str中所有字符转变为大写后的结果
日期和时间处理函数ADDDATE()  增加一个日期(天、周等)ADDTIME()  增加一个时间(时、分等)CURDATE()或CURRENT_DATE() 返回当前的日期CURTIME()或CURRENT_TIME() 返回当前的时间DATE()  返回日期时间的日期部分DATE_ADD(DATE,INTERVAL INT keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);DATE_FORMAT(DATE,fmt)  依照指定的fmt格式格式化日期date值DATE_SUB(DATE,INTERVAL INT keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);DAY()  返回一个日期的天数部分DAYOFWEEK(DATE)   返回date所代表的一星期中的第几天(1~7)DAYOFMONTH(DATE)  返回date是一个月的第几天(1~31)DAYOFYEAR(DATE)   返回date是一年的第几天(1~366)DAYNAME(DATE)   返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);FROM_UNIXTIME(ts,fmt)  根据指定的fmt格式,格式化UNIX时间戳tsHOUR(TIME)   返回time的小时值(0~23)MINUTE(TIME)   返回time的分钟值(0~59)MONTH(DATE)   返回date的月份值(1~12)MONTHNAME(DATE)   返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);NOW()    返回当前的日期和时间QUARTER(DATE)   返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);SECOND()  返回一个时间的秒部分TIME()  返回一个日期时间的时间部分WEEK(DATE)   返回日期date为一年中第几周(0~53)YEAR(DATE)   返回日期date的年份(1000~9999)
获取当前系统时间:SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE);SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE);SELECT EXTRACT(HOUR_MINUTE FROM CURRENT_DATE);
返回两个日期值之间的差值(月数):SELECT PERIOD_DIFF(200302,199802);
在Mysql中计算年龄:SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(tim)),'%Y')+0 AS us FROM df;
常用数值处理函数ABS(X)   返回x的绝对值BIN(X)   返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(X)   返回大于x的最小整数值COS(X)  返回角度x的余弦EXP(X)   返回值e(自然对数的底)的x次方FLOOR(X)   返回小于x的最大整数值GREATEST(x1,x2,...,xn)返回集合中最大的值LEAST(x1,x2,...,xn)  返回集合中最小的值LN(X)  返回x的自然对数LOG(X,Y)返回x的以y为底的对数MOD(X,Y)返回x/y的模(余数)PI()返回pi的值(圆周率)RAND()返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。ROUND(X,Y)返回参数x的四舍五入的有y位小数的值SIGN(X) 返回代表数字x的符号的值SIN(X)  返回角度x的正弦SQRT(X) 返回一个数的平方根TAN(X)  返回角度x的正切TRUNCATE(X,Y) 返回数字x截短为y位小数的结果
聚合函数(常用于GROUP BY从句的SELECT查询中)AVG(col)返回指定列的平均值COUNT(col)返回指定列中非NULL值的个数MIN(col)返回指定列的最小值MAX(col)返回指定列的最大值SUM(col)返回指定列的所有值之和GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果
加密函数AES_ENCRYPT(str,KEY)  返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储AES_DECRYPT(str,KEY)  返回用密钥key对字符串str利用高级加密标准算法解密后的结果DECODE(str,KEY)   使用key作为密钥解密加密字符串strENCRYPT(str,salt)   使用UNIXcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串strENCODE(str,KEY)   使用key作为密钥加密字符串str,调用ENCODE()的结果是一个二进制字符串,它以BLOB类型存储MD5()    计算字符串str的MD5校验和PASSWORD(str)   返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。SHA()    计算字符串str的安全散列算法(SHA)校验和SELECT ENCRYPT('root','salt');SELECT ENCODE('xufeng','key');SELECT DECODE(ENCODE('xufeng','key'),'key');#加解密放在一起SELECT AES_ENCRYPT('root','key');SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key');SELECT MD5('123456');SELECT SHA('123456');
格式化函数DATE_FORMAT(DATE,fmt)  依照字符串fmt格式化日期date值FORMAT(X,Y)   把x格式化为以逗号隔开的数字序列,y是结果的小数位数INET_ATON(ip)   返回IP地址的数字表示INET_NTOA(num)   返回数字所代表的IP地址TIME_FORMAT(TIME,fmt)  依照字符串fmt格式化时间time值SELECT FORMAT(34234.34323432,3);SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r');SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');SELECT DATE_FORMAT(19990330,'%Y-%m-%d');SELECT DATE_FORMAT(NOW(),'%h:%i %p');SELECT INET_ATON('10.122.89.47');SELECT INET_NTOA(175790383);
类型转化函数CAST() 类型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNEDSELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
系统信息函数DATABASE()   返回当前数据库名BENCHMARK(COUNT,expr)  将表达式expr重复运行count次CONNECTION_ID()   返回当前客户的连接IDFOUND_ROWS()   返回最后一个SELECT查询进行检索的总行数USER()或SYSTEM_USER()  返回当前登陆用户名VERSION()   返回MySQL服务器的版本SELECT DATABASE(),VERSION(),USER();SELECTBENCHMARK(9999999,LOG(RAND()*PI()));


六、游标


创建、打开、关闭游标 # 定义名为ordernumbers的游标,检索所有订单DELIMITER //CREATE PROCEDURE processorders()BEGIN    -- decalre the cursor 声明游标     declare ordernumbers CURSOR    FOR    SELECT order_num FROM orders;        -- open the cursor 打开游标    open ordernumbers;    -- close the cursor 关闭游标    close ordernumbers;END //DELIMITER ;
-- 使用游标数据 # 例1:检索 当前行 的order_num列,对数据不做实际处理DELIMITER //CREATE PROCEDURE processorders()BEGIN
    -- declare local variables 声明局部变量    DECLARE o INT;        -- decalre the cursor 声明游标     declare ordernumbers CURSOR    FOR    SELECT order_num FROM orders;        -- open the cursor 打开游标    open ordernumbers;        -- get order number 获得订单号     FETCH ordernumbers INTO o;    /*fetch检索 当前行 的order_num列(将自动从第一行开始)到一个名为o的局部声明变量中。    对检索出的数据不做任何处理。*/            -- close the cursor 关闭游标    close ordernumbers;
END //DELIMITER ;
# 例2:循环检索数据,从第一行到最后一行,对数据不做实际处理DELIMITER //CREATE PROCEDURE processorders()BEGIN    -- declare local variables 声明局部变量    DECLARE done BOOLEAN DEFAULT 0;    DECLARE o INT;       -- decalre the cursor 声明游标     declare ordernumbers CURSOR    FOR    SELECT order_num FROM orders;       -- declare continue handler    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done =1;    -- SQLSTATE '02000'是一个未找到条件,当REPEAT由于没有更多的行供循环而不能继续时,出现这个条件。        -- open the cursor 打开游标    open ordernumbers;        -- loop through all rows 遍历所有行     REPEAT        -- get order number 获得订单号     FETCH ordernumbers INTO o;    -- FETCH在REPEAT内,因此它反复执行直到done为真        -- end of loop    UNTIL done END REPEAT;        -- close the cursor 关闭游标    close ordernumbers;
END //DELIMITER ;
# 例3:循环检索数据,从第一行到最后一行,对取出的数据进行某种实际的处理DELIMITER //CREATE PROCEDURE processorders()BEGIN    -- declare local variables 声明局部变量     DECLARE done BOOLEAN DEFAULT 0;    DECLARE o INT;    DECLARE t DECIMAL(8,2);        -- declare the cursor 声明游标    DECLARE ordernumbers CURSOR    FOR    SELECT order_num FROM orders;        -- declare continue handler    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;        -- create a table to store the results 新建表以保存数据    CREATE TABLE IF NOT EXISTS ordertotals    (order_num INT,total DECIMAL(8,2));        -- open the cursor 打开游标    OPEN ordernumbers;        -- loop through all rows 遍历所有行    REPEAT        -- get order number 获取订单号    FETCH ordernumbers INTO o;        -- get the total for this order 计算订单金额    CALL ordertotal(o,1,t);  # 参见23章代码,已创建可使用        -- insert order and total into ordertotals 将订单号、金额插入表ordertotals内    INSERT INTO ordertotals(order_num,total) VALUES(o,t);        -- end of loop    UNTIL done END REPEAT;        -- close the cursor 关闭游标    close ordernumbers;
END // DELIMITER ;# 调用存储过程 precessorders()CALL processorders();# 输出结果SELECT * FROM ordertotals;


七、触发器


1、MySQL触发器的创建语法:CREATE[DEFINER = { 'user' | CURRENT_USER }]TRIGGER trigger_nametrigger_time trigger_eventON table_nameFOR EACH ROW[trigger_order]trigger_body2、MySQL创建语法中的关键词解释:字段                      含义                                               可能的值DEFINER=            可选参数,指定创建者,                               DEFINER='root@%'              默认为当前登录用户(CURRENT_USER);              该触发器将以此参数指定的用户执行,                       DEFINER=CURRENT_USER                  所以需要考虑权限问题;
trigger_name   触发器名称,最好由表名+触发事件关键词+触发时间关键词组成; trigger_time     触发时间,在某个事件之前还是之后;BEFORE、AFTER
                   INSERT:插入操作触发器,INSERT、LOAD DATA、REPLACE时触发;                   UPDATE:更新操作触发器,UPDATE操作时触发;trigger_event  触发事件,如插入时触发、删除时触发;DELETE:删除操作触发器,DELETE、REPLACE操作时触发;                   INSERT、UPDATE、DELETEtable_name          触发操作时间的表名;     可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时(    如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以trigger_order   使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。    FOLLOWS:当前创建触发器在现有触发器之后激活;FOLLOWS、PRECEDES    PRECEDES:当前创建触发器在现有触发器之前激活;        trigger_body     触发执行的SQL语句内容,一般以begin开头,end结尾            BEGIN .. END     触发执行语句内容(trigger_body)中的OLD,NEW触发执行语句内容(trigger_body)中的OLD,NEW:在trigger_body中,我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED),OLD表示将要删除的旧行(相当于MS SQL的DELETED)。通过OLD,NEW中获取它们的字段内容,方便在触发操作中使用,下面是对应事件是否支持OLD、NEW的对应关系:事件     OLD   NEWINSERT    ×     √DELETE    √     ×UPDATE    √     √
由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLD、NEW;DELIMITER $... --触发器创建语句;$   --提交创建语句;DELIMITER ;
select * FROM information_schema.triggers;SHOW TRIGGERS; #查看触发器-- 通过information_schema.triggers表查看触发器:select * FROM information_schema.triggers;-- mysql 查看当前数据库的触发器SHOW TRIGGERS;-- mysql 查看指定数据库"people"的触发器SHOW TRIGGERS FROM people;
创建测试表DROP TABLE IF EXISTS tb;CREATE TABLE IF NOT EXISTS tb(id INT,username CHAR(10),pass VARCHAR(20),ct INT);CREATE TABLE IF NOT EXISTS bt(fid INT,username CHAR(10),pass VARCHAR(20),ct INT);创建触发器DELIMITER $#drop trigger if exists df_names$ 删除前先判断触发器是否存在CREATE  DEFINER =CURRENT_USERTRIGGER df_namesBEFORE INSERT ON tbAFTER UPDATE ON btFOR EACH ROWBEGIN   #set new.ct=new.id*5;   #SET @ct=12; 变量   #SET @pass='hjfd';   IF old.type=1 THEN  UPDATE bt SET ct=old.ct WHERE fid=old.id;   ELSE IF old.type=2 THEN  UPDATE bt SET pass=old.pass WHERE fid=old.id;END$DELIMITER;
测试INSERT INTO tb(id) VALUES(4);SELECT *FROM tb;


八、存储过程


-- 创建存储过程 # 返回产品平均价格的存储过程DELIMITER //CREATE PROCEDURE productpricing()BEGIN    select AVG(prod_price) AS priceaverage FROM products;END //DELIMITER ;# 调用上述存储过程 CALL productpricing();
-- 删除存储过程,请注意:没有使用后面的(),只给出存储过程名。DROP PROCEDURE productpricing;
-- 使用参数 out# 重新定义存储过程productpricingDELIMITER //CREATE PROCEDURE productpricing(OUT pl DECIMAL(8,2), OUT ph DECIMAL(8,2), OUT pa DECIMAL(8,2))BEGIN    select MIN(prod_price) INTO pl FROM products;    SELECT MAX(prod_price) INTO ph FROM products;    select AVG(prod_price) INTO pa FROM products;END //DELIMITER ;
# 为调用上述存储过程,必须指定3个变量名CALL productpricing(@pricelow,@pricehigh,@priceaverage);# 显示检索出的产品平均价格SELECT @priceaverage;# 获得3个值SELECT @pricehigh,@pricelow,@priceaverage;
-- 使用参数 in 和 out# 使用IN和OUT参数,存储过程ordertotal接受订单号并返回该订单的合计DELIMITER //CREATE PROCEDURE ordertotal(    in onumber INT,                   # onumber定义为IN,因为订单号被传入存储过程    OUT ototal DECIMAL(8,2)            # ototal为OUT,因为要从存储过程返回合计)BEGIN    select SUM(item_price*quantity) FROM orderitems     WHERE order_num = onumber    INTO ototal;END //DELIMITER ;# 给ordertotal传递两个参数;# 第一个参数为订单号,第二个参数为包含计算出来的合计的变量名CALL ordertotal(20005,@total);# 显示此合计SELECT @total;# 得到另一个订单的合计显示CALL ordertotal(20009,@total);SELECT @total;
-- 建立智能存储过程 # 获得与以前一样的订单合计,但只针对某些顾客对合计增加营业税
-- Name:ordertotal-- Parameters: onumber = order number--                taxable = 0 if not taxable, 1 if taxable--                ototal  = order total variableDELIMITER //CREATE PROCEDURE ordertotal(    in onumber INT,    in taxable BOOLEAN,    OUT ototal DECIMAL(8,2)) COMMENT 'obtain order total, optionally adding tax'BEGIN    -- declare variable for total 定义局部变量total    DECLARE total DECIMAL(8,2);    -- declare tax percentage 定义局部变量税率     DECLARE taxrate INT DEFAULT 6;    -- get the order total 获得订单合计    SELECT SUM(item_price * quantity)    FROM orderitems    WHERE order_num = onumber INTO total;    -- is this taxable? 是否要增加营业税?     if taxable THEN        -- Yes,so add taxrate to the total 给订单合计增加税率        select total+(total/100*taxrate) INTO total;    end IF;    -- and finally,save to out variable 最后,传递给输出变量     SELECT total INTO ototal;END //DELIMITER ;# 调用上述存储过程,不加税 CALL ordertotal(20005,0,@total);SELECT @total;# 调用上述存储过程,加税 CALL ordertotal(20005,1,@total);SELECT @total;
# 显示用来创建一个存储过程的CREATE语句SHOW CREATE PROCEDURE ordertotal;
# 获得包括何时、由谁创建等详细信息的存储过程列表# 该语句列出所有存储过程SHOW PROCEDURE STATUS;# 过滤模式 SHOW PROCEDURE STATUS LIKE 'ordertotal';


九、事务


SET AUTOCOMMIT=off ;禁用或启用事务的自动提交模式  off ONSET SESSION AUTOCOMMIT = OFF;禁用或启用事务的session自动提交模式 off ONSHOW VARIABLES LIKE '%auto%'; -- 查看变量状态
执行DML语句是其实就是开启一个事务只能回滚insert、delete和update语句对于create、drop、alter这些无法回滚事务只对DML有效果rollback,或者commit后事务就结束了自动提交模式用于决定新事务如何及何时启动START TRANSACTION; 启用自动提交模式下显式地启动事务COMMIT和ROLLBACK;  禁用自动提交模式显式地提交或回滚-- 事务 transaction 指一组sql语句-- 回退 rollback 指撤销指定sql语句的过程-- 提交 commit 指将未存储的sql语句结果写入数据库表-- 保留点 savepoint 指事务处理中设置的临时占位符,可以对它发布回退(与回退整个事务处理不同)
-- 控制事务处理# 开始事务及回退 SELECT * FROM ordertotals;   # 查看ordertotals表显示不为空START TRANSACTION;           # 开始事务处理 DELETE FROM ordertotals;     # 删除ordertotals表中所有行SELECT * FROM ordertotals;   # 查看ordertotals表显示 为空ROLLBACK;                     # rollback语句回退 SELECT * FROM ordertotals;   # rollback后,再次查看ordertotals表显示不为空
# commit 提交 START TRANSACTION;DELETE FROM orderitems WHERE order_num = 20010;DELETE FROM orders WHERE order_num = 20010;COMMIT;   # 仅在上述两条语句不出错时写出更改 
# savepoint 保留点 # 创建保留点SAVEPOINT delete1;# 回退到保留点 ROLLBACK TO delete1;# 释放保留点 RELEASE SAVEPOINT delete1;
-- 更改默认的提交行为 SET autocommit = 0;  # 设置autocommit为0(假)指示MySQL不自动提交更改


十、备份与还原


备份一个数据库:mysqldump -u root -p --opt people> df.txt  #--opt优化执行速度备份两个数据库:mysqldump -u root -p --opt --databases people hw > all.txt备份全部数据库:mysqldump -u root -p --opt --all-DATABASES > all.txt恢复数据库:mysqldump -u root -p --opt --databases people hw < all.txt1. 导出一张表mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql)2. 导出多张表mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql)3. 导出所有表mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql)4. 导出一个库mysqldump -u用户名 -p密码 --lock-ALL-TABLES --database 库名 > 文件名(D:/a.sql)可以-w携带WHERE条件


十一、用户账号


创建账户:CREATE USER IF NOT EXISTS 'hw'@'localhost' IDENTIFIED BY '5201314'; #创建用户hw,密码5201314
给该用户授予所有权限并可授权给其它用户:GRANT ALL PRIVILEGES ON people.df TO 'hw'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
重命名用户名: RENAME USER 'hw' TO 'gh'; 必须将localhost改为%如果希望该用户能够在任何机器上登陆mysql,则将localhost改为 "%" 授权给其它用户 WITH GRANT OPTION privileges包括:    alter:修改数据库的表    create:创建新的数据库或表    delete:删除表数据    drop:删除数据库/表    index:创建/删除索引    insert:添加表数据    select:查询表数据    update:更新表数据    all:允许任何操作    usage:只允许登录
刷新权限,使新创建的用户能够使用:    FLUSH PRIVILEGES;                   收回用户权限: REVOKE ALL PRIVILEGES ON people.df FROM 'root'@'localhost';      删除用户:    DROP USER IF EXISTS 'hw'@'localhost';
设置指定用户的密码:SET PASSWORD FOR'hw'@'localhost' = PASSWORD('123321');         UPDATE USER SET PASSWORD =  PASSWORD('123321') WHERE USER = 'hw';
            设置密码:    SET PASSWORD = PASSWORD('123321');


十二、其他


SHOW STATUS;显示广泛的服务器状态信息SHOW PROCEDURE STATUS;SHOW GRANTS;显示授予用户的安全权限SHOW ERRORS;显示服务器的错误信息SHOW WARNINGS;显示服务器的警告信息SHOW PROCESSLIST;显示哪些线程正在运行SHOW VARIABLES;显示系统变量信息SELECT DATABASE(); 查看当前数据库SELECT NOW(), USER(), VERSION():显示当前时间、用户名、数据库版本SHOW ENGINES 引擎名 {LOGS|STATUS}:显示存储引擎的日志和状态信息SHOW VARIABLES LIKE 'character%'; SHOW VARIABLES LIKE 'collation%'; 确定所用系统的字符集和校对SHOW VARIABLES LIKE 'character_set_client%';        客户端向服务器发送数据时使用的编码SHOW VARIABLES LIKE 'character_set_results%';       服务器端将结果返回给客户端所使用的编码SHOW VARIABLES LIKE 'character_set_connection%';    连接层编码SHOW CHARACTER SET;查看所支持的字符集完整列表SHOW COLLATION;查看所支持校对的完整列表,以及它们适用的字符集
SET character_set_client = gbk;   SET character_set_results = gbk;SET character_set_connection = gbk;SET NAMES GBK;  -- 相当于完成以上三个设置
创建window服务:sc CREATE mysql binPath= mysqld_bin_path数据文件目录:DATA DIRECTORY='目录'索引文件目录:INDEX DIRECTORY = '目录'


十三、总结


这篇文章主要讲解了MySQL数据库的数据类型、库和表常见操作、索引、视图、函数、游标、触发器、存储过程、事务、备份与还原、用户账号、其它等知识点,希望对大家的学习有帮助。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
87 4
|
3月前
|
SQL 关系型数据库 MySQL
MySQL 常用函数
我们这次全面梳理 MySQL 中的常用函数,涵盖 聚合函数、字符串函数、日期时间函数、数学函数 和 控制流函数 等五大类。每类函数均配有语法说明与实用示例,帮助读者提升数据处理能力,如统计分析、文本处理、日期计算、条件判断等。文章结尾提供了丰富的实战练习,帮助读者巩固和应用函数技巧,是进阶 SQL 编程与数据分析的实用工具手册。
259 2
|
3月前
|
存储 算法 关系型数据库
数据库主键与索引详解
本文介绍了主键与索引的核心特性及其区别。主键具有唯一标识、数量限制、存储类型和自动排序等特点,用于确保数据完整性和提升查询效率;而索引通过特殊数据结构(如B+树、哈希)优化查询速度,适用于不同场景。文章分析了主键与索引的优劣、适用场景及工作原理,并对比两者在唯一性、数量限制、功能定位等方面的差异,为数据库设计提供指导。
|
6月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL field 函数的改写方法
【YashanDB知识库】MySQL field 函数的改写方法
|
6月前
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因?
● B+树更便于遍历:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。 ● B+树的磁盘读写代价更低:B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。 ● B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条
|
6月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL field 函数的改写方法
本文来自YashanDB官网,介绍将MySQL的FIELD函数改写到YashanDB的方法。MySQL中,FIELD函数用于自定义排序;而在YashanDB中,可使用DECODE或CASE语句实现类似功能。示例展示对表`t1`按指定顺序排序的过程,提供两种改写方式,结果均符合预期。
|
3月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
639 1
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
3月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
247 62
|
2月前
|
SQL 存储 关系型数据库
MySQL功能模块探秘:数据库世界的奇妙之旅
]带你轻松愉快地探索MySQL 8.4.5的核心功能模块,从SQL引擎到存储引擎,从复制机制到插件系统,让你在欢声笑语中掌握数据库的精髓!

热门文章

最新文章

推荐镜像

更多