MySQL数据库可以说是日常开发中最常用的数据存储方式之一。它以简便易用和强大的可扩展性著称,并且能够跨平台使用。在使用MySQL数据库的过程中,需要了解数据类型、库和表的常见操作、索引、视图和函数等知识要点。

2024-07-01 23:02:35 作者:6kYzQ!yIEmp_M6UkZ
在之前的文章中,我们已经介绍了它的安装。今天我们来详细讨论它的内容,该文章分为11个部分,包括MySQL数据库的数据类型、库和表的常见操作、索引、视图、函数、游标、触发器、存储过程、事务、备份和恢复、用户账号以及其他知识点。一、MySQL数据类型1.数值类型MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),还有近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

INT关键字是表示整数的关键字,DEC关键字是表示十进制数的关键字。

BIT数据类型用来存储位字段数值,并兼容MyISAM、MEMORY、InnoDB和BDB表格。MySQL作为SQL标准的扩展,同样支持TINYINT、MEDIUMINT和BIGINT这几种整数类型。以下表格显示了每种整数类型所需的存储空间和取值范围。

类型 大小 范围(带符号) 范围(无符号) 应用 小整数 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2字节 (-32,768,32,767) (0,65,535) 大整数值 MEDIUMINT 3字节 (-8,388,608,8,388,607) (0,16777215 整型数值 整数或整型 4 位字节 (-2147483648,2147483647) (0,4,294,967,295 是一个大整数值,也称为 BIGINT,它占用 8 字节,取值范围为 -9,233,372,036,854,775,808 到 9,223,372,036,854,775,807。18 446 744 073 709 551 615 是一个极大整数值。这是一个 4 字节的 FLOAT 值。它的取值范围是 (-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)。3.402 823 466亿) \n单精度   浮点数 \nDOUBLE \n8字节 \n(-1.797 693 134 862 315 7亿至-2.225 073 858 507 201 4亿),0,(2.225 073至1.797 693 134 862 315 7亿) \n0,(2.225 073 到 1.797 693 134 862 315 7 之间。 这是双精度浮点数值的范围。 它也可以表示为 DECIMAL(M,D),其中M>D时。如果M+2,则为D+2 取决于M和D的值

2. 指定日期和时间类型

表示时间值的日期和时间类型有DATETIME、DATE、TIMESTAMP、TIME和YEAR。每种时间类型都有一个有效值范围和一个“零”值,在指定无法由MySQL表示的非法值时会使用“零”值。每个时间类型都有一个有效的值范围和一个“零”值,如果指定了MySQL无法表示的值,就会使用“零”值。TIMESTAMP类型具有专门的自动更新特性,将在后续部分详细描述。

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

3. 文本类型

文本类型包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。本节内容介绍了这些类别的运作原理,以及如何在查询中应用这些类别。

字段类型 数据大小 作用 定长字符串 0-255字节的长度 用于保存定长字符串数据 变长字符串 长度为0-65535字节 用于保存变长字符串数据 不超过 255 个字符的二进制字符串 长度为0-255字节 用于保存不超过255个字符的二进制字符串数据 短文本字符串 长度为0-255字节 用于保存短文本字符串数据 二进制形式的长文本数据 长度为0-65,535字节 用于保存二进制形式的长文本数据 长文本数据 长度为0-65,535字节 用于保存长文本数据 二进制形式的中等长度文本数据 长度为0-16,777,215字节 用于保存二进制形式的中等长度文本数据 中等长度文本数据 长度为0-16,777,215字节 用于保存中等长度文本数据 二进制形式的极大文本数据 长度为0-4,294,967,295字节 用于保存二进制形式的极大文本数据 极大文本数据 长度为0-4,294,967,295字节 用于保存极大文本数据

CHAR和VARCHAR类型有相似之处,它们的保存和检索方式各有不同。它们的最大长度和尾部空格是否被保留等方面也有所不同。它们的长度和尾部空格的保留情况也不一样。在存储或检索时不进行大小写转换。

BINARY和VARBINARY类似于CHAR和VARCHAR,区别在于它们存储二进制字符串而不是非二进制字符串。换句话说,它们包含的是字节串而不是字符串。这表明它们没有字符集,并且排序和比较是基于列值字节的数值大小。BLOB即二进制大对象,可存储不确定数量的数据。BLOB类型有4种:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是具有不同的最大长度值。

有四种TEXT类型:分别是TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些与4种BLOB类型相对应,具有相同的最大长度和存储需求。Enum('fds','fsa','fasf'):枚举类型\nset(val1,val2,val3):集合类型\n二、库表操作\n1.数据库操作\n数据库:      展示数据库:\nSHOW DATABASES;\n创建数据库:\nCREATE DATABASE IF NOT EXISTS people;\n切换数据库:\nUSE people;\n删除数据库:\nDROP DATABASE IF EXISTS people;\n查看当前数据库信息:\nSHOW CREATE DATABASE people;\n修改数据库的选项信息:\nALTER DATABASE people;\n数据表操作:\n显示数据库里所有数据表的信息:\nSHOW TABLE STATUS FROM people;\n显示全部数据表:\nSHOW TABLES;\n单张表:\nshow tables from df;\n清空数据表:\nTRUNCATE df;\n表检测:\nCHECK TABLE df;\n表优化:\nOPTIMIZE TABLE df;\n表修复:\nREPAIR TABLE df;\n表分析:\nANALYZE TABLE df;\n分析表键状态是否正确:\nANALYZE TABLE orders;\n检查表是否存在错误:\nCHECK TABLE orders; 订单项目 QUICK;# 对于优化表进行快速扫描 OPTIMIZE TABLE, 以消除由删除和更新操作造成的磁盘碎片,用中文简化:通过优化表结构,减少空间浪费:\nOPTIMIZE TABLE orders; \n查询表结构:DESC df; DESCRIBE df; EXPLAIN df; SHOW COLUMNS FROM df;\n复制表:CREATE TABLE de LIKE df; SELECT * INTO IN 'hw' FROM df;\n修改表名:RENAME TABLE de TO people.dh;(可移动到另一个数据库)\n修改表字段:ALTER TABLE df ADD/DROP/CHANGE\n拼接字段:SELECT CONCAT(us,(" ,提姆。(前面文本不全),\n')',大括号的内容替换为"将p转为空格":添加了主键约束:alter表名ADD主键(形如:PK_表名)PRIMARY KEY表名(主键字段);添加外键约束:alter从表ADD外键(形如:FK_从表_主表)FOREIGN KEY从表(外键字段)REFERENCES主表(主键字段);删除主键约束:alter表名DROP PRIMARY KEY;删除外键约束:alter表名DROP FOREIGN KEY外键(区分大小写);--添加外键约束CREATE TABLE stu(sid INT PRIMARY KEY,名字 VARCHAR(50) NOT NULL); -- 添加外键约束方式一 \nCREATE TABLE score1(score DOUBLE, sid INT, CONSTRAINT fk_stu_score1_sid FOREIGN KEY(sid) REFERENCES stu(sid)); -- 添加外键约束方式二(若表已存在,可用这种) \nCREATE TABLE score1(score DOUBLE, sid INT,CONSTRAINT fk_stu_score1_sid FOREIGN KEY(sid) REFERENCES stu(sid));INT);\nALTER TABLE score1 ADD CONSTRAINT fk_sid FOREIGN KEY(sid) REFERENCES stu(sid);\n三、索引\nCREATE UNIQUE INDEX qw ON df(us); #创建不重复索引\nALTER TABLE df ADD UNIQUE INDEX wq(id); #添加索引\nSHOW INDEX FROM df; #检索索引\nDROP INDEX qw ON people.df; #删除索引\nALTER TABLE df DROP INDEX wq; #删除索引\n四、视图\nCREATE VIEW shitu AS SELECT us FROM df; 创建视图\nALTER VIEW shitu AS SELECT us FROM df WHERE us='gf'; 修改视图\nSELECT * FROM shitu; 查看视图结果\nDROP VIEW IF EXISTS shitu; 删除视图\n五、函数\n文本处理函数\nASCII(CHAR)返回字符的ASCII码值\nBIT_LENGTH(str)返回字符串的比特长度\nCONCAT(s1,s2...CONCAT_WS(sep, s1, ..., sn)函数将s1, ..., sn连接成字符串,并用sep字符间隔 INSERT(str, X, Y, INSTR)函数从第x位置开始,y个字符长的子串替换为字符串instr,返回结果 FIND_IN_SET(str, LIST)函数分析逗号分隔的list列表,如果发现str,返回str在list中的位置 LCASE(str)或LOWER(str)函数返回将字符串str中所有字符改变为小写后的结果 LEFT(str, 返回字符串str左边的x个字符 计算字符串str中字符的数量 查找str中的一个子串 将str转换为小写 去除str开头的空格 返回子串substr在字符串str中第一次出现的位置 用反斜杠转义str中的单引号 重复str,指定重复次数srchstr替换) 将字符串str重复x次后的输出为  反转(str) 返回字符串str颠倒后的结果  右边(str, X) 返回字符串str最右边的x个字符  去掉右边的空格(str) 返回字符串str尾部的空格  SOUNDEX(str) 返回str串的SOUNDEX值  STRCMP(s1,s2) 比较字符串s1和s2,使用SUBSTRING()函数返回子串的字符。使用TRIM(str)函数去除字符串首部和尾部的所有空格。使用UCASE(str)或UPPER(str)函数将字符串str中所有字符转变为大写。日期和时间处理函数包括ADDDATE()用来增加一个日期(天、周等),以及ADDTIME()用来增加一个时间(时、分等)。使用CURDATE()或CURRENT_DATE()函数返回当前的日期,而CURTIME()或CURRENT_TIME()函数返回当前的时间。使用DATE()函数返回日期时间的日期部分,使用DATE_ADD(DATE, …)函数给日期增加指定的时间。INTERVAL INT keyword) will return the result of date date plus the interval time int (int should be formatted according to the keyword), for example: SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH); DATE_FORMAT(DATE,fmt)   will format the date value according to the specified fmt format  DATE_SUB(DATE,INTERVAL INT keyword) returns the result of date date plus the interval time int (int must be formatted according to the keyword), for example: SELECTDATE_SUB(CURRENT_DATE,每隔六个月的天数; 返回日期的天数部分;返回日期所代表的星期中的第几天(1~7);返回日期是一个月的第几天(1~31);返回日期是一年的第几天(1~366);返回日期的星期名,例如:根据指定的格式fmt,通过UNIX时间戳返回日期。格式化UNIX时间戳ts HOUR(TIME)   返回time的小时值(0~23) MINUTE(TIME)   返回time的分钟值(0~59) MONTH(DATE)   返回date的月份值(1~12) MONTHNAME(DATE)   返回date的月份名,例如:查询 MONTHNAME(CURRENT_DATE); NOW()    返回当前的日期和时间 QUARTER(DATE)   返回date在一年中的季度(1~4)。获取当前日期的季度部分:SELECT QUARTER(CURRENT_DATE);\n获取一个时间的秒部分:SECOND();\n获取一个日期时间的时间部分:TIME();\n获取一个日期的年份部分:YEAR(DATE);\n获取一个日期的周数部分:WEEK(DATE);\n获取当前系统时间:SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());\n获取当前日期的年月部分:SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE);\n获取当前日期的天数秒数部分:SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE);(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返回八进制, 将原文转换为简体中文后如下:\nHEX(返回十六进制):返回大于x的最小整数值\nCOS(X):返回角度x的余弦\nEXP(X):返回值e(自然对数的底)的x次方\nFLOOR(X):返回小于x的最大整数值\nGREATEST(x1,x2,...,xn):返回集合中最大的值\nLEAST(x1,x2,...,xn):返回集合中最小的值\nLN(X):返回x的自然对数\nLOG(X,Y):返回x的以y为底的对数\nMOD(X,返回x除以y的余数模p()\nPI()函数返回圆周率pi的值\nRAND()函数返回0到1之间的随机值,可以通过提供一个参数(种子)来指定RAND()函数生成的随机数。使用 `ROUND(X, Y)` 返回 x 参数四舍五入到小数位 y 的值。使用 `SIGN(X)` 返回表示数字 x 符号的值。使用 `SIN(X)` 获取角度 x 的正弦值。使用 `SQRT(X)` 获取数字的平方根。使用 `TAN(X)` 获取角度 x 的正切值。使用 `TRUNCATE(X, Y)` 返回 x 参数截断到小数位 y 的值。返回小数x截断至y位的结果   聚合函数(常用于SELECT查询的GROUP BY子句中) AVG(col) - 返回指定列的平均值 COUNT(col) - 返回指定列中非NULL值的数量 MIN(col) - 返回指定列的最小值 MAX(col) - 返回指定列的最大值 SUM(col) - 返回指定列的所有值的总和 GROUP_CONCAT(col) - 返回由属于一组的列值连接组合而成的结果   加密函数 AES_ENCRYPT(str,KEY) - 返回字符串str使用密钥key进行高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储。当使用AES_DECRYPT(str,KEY)时, 会返回利用密钥key对字符串str利用高级加密标准算法解密后的结果。DECODE(str,KEY)会使用key作为密钥解密加密字符串str。而ENCRYPT(str,salt)会使用UNIXcrypt()函数和关键词salt(一个可以唯一确定口令的字符串,就像钥匙一样)来加密字符串str。另外,ENCODE(str,KEY)会使用key作为密钥加密字符串str,调用ENCODE()的结果是一个二进制字符串。它使用BLOB类型存储 MD5()    来计算字符串str的MD5校验和 PASSWORD(str)   以返回字符串str的加密版本。这种加密过程是不可逆的,并且与UNIX密码加密过程使用了不同的算法。 对字符串str进行SHA安全散列算法的校验和计算 SELECT ENCRYPT('root','salt'); SELECT 使用'key'对'xufeng'进行编码; SELECT 对使用'key'对'xufeng'进行编码的结果进行解码;#加密和解密操作放在一起 SELECT 使用'key'对'root'进行AES加密; SELECT 对使用'key'对'root'进行AES加密的结果进行AES解密;'key'参数);$ 选取MD5('123456')结果;$ 选取SHA('123456')结果;$ 格式化函数DATE_FORMAT(DATE,fmt),$ 按照字符串fmt格式化日期date值$ 格式化X为以逗号隔开的数字序列,Y是结果的小数位数$ 转换IP地址为数字表示$ 转换数字为IP地址$ 格式化TIME,根据格式字符串fmt对时间time值进行格式化 选择FORMAT(34234.34323432,3); 选择DATE_FORMAT(NOW(),'%W,%D %M %Y %r'); 选择DATE_FORMAT(NOW(),'%Y-%m-%d'); 选择DATE_FORMAT(19990330,'%Y-%m-%d'); 选择DATE_FORMAT(NOW()%h:%i %p'); SELECT INET_ATON('10.122.89.47'); SELECT INET_NTOA(175790383);   类型转换函数 CAST() 能够转换的类型包括:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0; SELECT 'f'=BINARY 'F','f'=转换为二进制('F'); 系统信息函数 DATABASE() 返回当前数据库名 BENCHMARK(COUNT,expr) 将表达式expr重复运行count次 CONNECTION_ID() 返回当前客户的连接ID FOUND_ROWS() 返回最后一个SELECT查询进行检索的总行数 USER()或SYSTEM_USER() 返回当前登录用户名 VERSION() 返回MySQL服务器的版本 SELECT DATABASE()获取版本信息,用户信息;执行一个长时间的SQL查询;创建、打开、关闭游标;以名称"ordernumbers"定义游标。查询所有订单\n//创建过程处理订单\nBEGIN\n--声明游标\n声明游标ordernumbers FOR SELECT order_num FROM orders;\n--打开游标\n打开游标ordernumbers;\n--关闭游标\n关闭游标ordernumbers;\nEND\n//;\n--使用游标数据\n#例1:检索当前行的order_num列,数据未进行实际处理。 DELIMITER // 创建过程processorders() { 开始 --声明局部变量 DECLARE o INT; --声明游标 declare ordernumbers CURSOR FOR SELECT order_num FROM orders; --打开游标 open ordernumbers; --获取订单号 FETCH ordernumbers INTO o; /* 将当前行的order_num列(将自动从第一行开始)检索到名为o的局部声明变量中。不对检索出的数据进行任何处理。关闭游标\n关闭订单编号\nEND\nDELIMITER\n#\n例2: 循环检索数据,从起始行至终止行,对数据不进行实际处理\nDELIMITER:\n//\n创建过程处理订单\nBEGIN\n-- 声明局部变量\nDECLARE done BOOLEAN DEFAULT 0;\nDECLARE o INT;\n-- 声明游标\nDECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders;\n-- 声明继续处理\nDECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;\n-- SQLSTATE '02000' 表示未找到条件当REPEAT在没有更多的行可供循环时,就会出现这种情况。打开光标 浏览编号遍历所有的行\n重复\n获得订单号\n把订单号取出到o中\n在重复内部使用FETCH 因此它会重复执行直到done变为true。结束循环;关闭游标ordernumbers。结束。例3:通过循环检索数据,从第一行到最后一行。对提取出来的数据进行实际处理,通过创建一个名为processorders的过程来进行。在这个过程中,首先声明一些本地变量,然后将一个叫做done的布尔变量值设为默认的0。接着声明o和t为整型和小数的变量。声明游标\nDECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders;\n声明continue handler\nDECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;\n新建表以保存数据\n创建表以存储结果数据\nCREATE TABLE IF NOT EXISTS ordertotals (order_num INT,总计 小数(8,打开游标\nOPEN 订单号;\n遍历所有行\nREPEAT\n获取订单号\nFETCH 订单号 INTO o;\n计算订单金额\nCALL 订单总额(o,请参考第23章的代码,已经创建了一个可以插入订单号和金额到ordertotals表中的插入命令,如下:\nINSERT INTO ordertotals(order_num, total) VALUES (订单号, 金额)-- 循环\n循环\n重复\n重复\n直到\n完成\n结束\n重复\n关闭游标\n关闭游标 ordernumbers\n结束\n分隔符\n调用存储过程\n调用 processorders()\n输出结果\n从 ordertotals 中选择 *\n七、触发器\n1、MySQL触发器的创建语法:\n创建触发器 trigger_name\n触发时间 trigger_time\n触发事件 trigger_event\n在表 table_name 上\n对每一行进行触发\n[trigger_order] 触发顺序\n触发体\n2、MySQL创建语法中的关键词解释:\n字段 含义 可能的值\nDEFINER= 可选参数指定创建者,通常为DEFINER='root@%',默认值为当前登录用户(CURRENT_USER);该触发器将由指定的用户执行。当前用户定义者,因此需要考虑权限问题;触发器名称最好由表名、触发事件关键词和触发时间关键词组成;触发时间在某个事件之前或之后;在执行INSERT、LOAD DATA、REPLACE时触发的插入操作触发器;在执行UPDATE时触发的更新操作触发器;触发事件,如在插入时触发、删除时触发;在执行DELETE时触发的删除操作触发器。DELETE、REPLACE操作会在触发时执行;表名INSERT、UPDATE、DELETE会触发操作时间;这是可选参数,如果有多个触发事件和触发时间相同的触发器(例如:在UPDATE之前),默认触发顺序会按照创建触发器的顺序进行,可以使用trigger_order参数来改变它们的触发顺序。MySQL 5.7.2版本开始支持这个选项。触发器可以在已有触发器之后激活,也可以在已有触发器之前激活。在触发执行的SQL语句中一般以begin开头,end结尾。触发执行语句中的OLD可以表示旧值。触发器执行语句(trigger_body)中可使用OLD和NEW:在trigger_body中,我们可以使用NEW代表即将插入的新记录(类似于MS SQL的INSERTED),OLD代表即将删除的旧记录(类似于MS SQL的DELETED)。通过OLD,NEW中提取字段内容,以便在触发操作中使用。下面是对应事件支持OLD、NEW的关系:\n事件 OLD NEW\nINSERT × ✓\nDELETE ✓ ×\nUPDATE ✓ ✓\n因为UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE语句同时支持OLD和NEW;\n定义DELIMITER为${},然后...,再将DELIMITER设为空;\n执行创建触发器语句;\n查询信息模式数据库中的触发器:select * FROM information_schema.triggers;\n显示触发器:SHOW TRIGGERS;\n通过information_schema.triggers表查看触发器:select * FROM information_schema.triggers;\n使用SHOW TRIGGERS命令查看当前数据库的触发器;\n使用SHOW TRIGGERS FROM命令查看指定数据库"people"的触发器。创建测试表tb;\nIF NOT EXISTS tb(id INT,username CHAR(10),pass VARCHAR(20),ct INT);\n创建测试表bt;\nIF NOT EXISTS bt(fid INT,username CHAR(10),pass VARCHAR(20); DROP TRIGGER IF EXISTS df_names;\nCREATE DEFINER = CURRENT_USER TRIGGER df_names BEFORE INSERT ON tb AFTER UPDATE ON bt FOR EACH ROW BEGIN\n SET new.ct=new.id*5;\n SET @ct=12;\n SET @pass='hjfd';\n IF old.type=1 THEN\n UPDATE bt SET ct=old.ct WHERE fid=old.id;\n ELSE\n IF old.type=2 THEN\n UPDATE bt SET pass=old.pass WHERE fid=old.id;\n END\n END IF;\nEND;\n测试\nINSERT INTO tb(id) VALUES(4);\nSELECT * FROM tb;\n创建存储过程\n返回产品平均价格的存储过程\nDELIMITER //\nCREATE PROCEDURE productpricing()\nBEGIN\n select AVG(prod_price) AS priceaverage FROM products;\nEND\n//\nDELIMITER ;\n调用上述存储过程\nCALL productpricing();\n删除存储过程请注意: 不要使用括号中的内容,只提供存储过程名称。定义存储过程productpricing重置使用参数out#;重新定义存储过程productpricing。DELIMITER//创建存储过程productpricing(OUT pl DECIMAL(8,2), OUT ph DECIMAL(8,2), OUT pa DECIMAL(8,2)开始\n选择产品的最低价格放入pl中,从产品中\n选择最高价格放入ph中\n选择产品的平均价格放入pa中\n结束\n//\n;\n#来调用以上存储过程需要指定3个变量名称  CALL  productpricing(@pricelow,@pricehigh,@priceaverage); # 显示检索出的产品平均价格  SELECT  @priceaverage; # 获取3个值  SELECT  @pricehigh,@pricelow,@priceaverage;  -- 使用参数 in 和 out # 使用IN和OUT参数,存储过程ordertotal的功能是接受订单号作为输入参数,并返回该订单的合计金额。DELIMITER被用作分隔符。创建存储过程ordertotal,其中in参数onumber被定义为IN,因为它是作为输入传入存储过程的订单号。同时,ototal参数被定义为OUT,它是返回的DECIMAL(8,2)类型的合计金额。为了从存储过程中返回合计值,需要进行以下操作: \nCREATE PROCEDURE ordertotal(onumber INT, OUT ototol DECIMAL(10,2))\nBEGIN\nSELECT SUM(item_price * quantity)\nFROM orderitems\nWHERE order_num = onumber\nINTO ototol;\nEND\nDELIMITER //\nDELIMITER ;\n然后使用以下语句调用 ordertotal 存储过程,传递订单号和变量名两个参数:CALL ordertotal(20005, 合计变量名)@total); # 用于显示合计 SELECT @total; # 用于获取另一个订单的合计 CALL ordertotal(20009,@total); SELECT @total;  -- 创建智能存储过程  # 获取与以前相同的订单合计,仅针对特定客户,对订单总额增加营业税  -- 名称:ordertotal -- 参数: 订单编号 = 订单号 --                 如果不应纳税,则taxable = 0 1. 如果可征税——则\n2. 总订单总额变量DELIMITER//\n3. CREATE PROCEDURE ordertotal(in onumber INT, in taxable BOOLEAN, OUT ototal DECIMAL(8,2) ) COMMENT '获取订单总额,可选地添加税' BEGIN     --声明用于total的变量 DECLARE total DECIMAL(8,2) 声明税率百分比\n定义局部变量税率\nDECLARE taxrate INT 默认值为6;\n获取订单总额\nSELECT SUM(item_price * quantity)\nFROM orderitems\nWHERE order_num = onumber INTO total;\n这是否应缴税?需不需要增加营业税?如果可征税,则将税率添加到总额中。给订单合计增加税率。选择 total+(total/100*taxrate) INTO total; 最后,保存到输出变量。将以下文字重新解释和改写成简体中文:\n将输出变量传递给      SELECT total INTO ototal; END // DELIMITER ; # 执行上述存储过程,不包含税收  CALL ordertotal(20005,0,@total); SELECT @total; # 执行上述存储过程,包含税收  CALL ordertotal(20005,1,@total); SELECT @total;  # 用于创建存储过程的CREATE语句的显示 显示 CREATE PROCEDURE ordertotal;  # 获取包括创建时间和创建者等详细信息的存储过程列表  该语句列出所有存储过程 SHOW PROCEDURE STATUS; # 过滤模式  SHOW PROCEDURE STATUS LIKE 'ordertotal'; 

九、事务

SET AUTOCOMMIT=off ;禁用或启用事务的自动提交模式  off ON SET SESSION AUTOCOMMIT = OFF;禁用或启用session的自动提交事务模式 off ON SHOW VARIABLES LIKE '%auto%'; -- 查看变量状态  执行DML语句实际上是开启一个事务 仅可回滚insert、delete和update语句 对于create、drop、alter等操作无法回滚,事务仅适用于DML语句 rollback;或者在提交之后,事务将结束。自动提交模式用于决定何时以及如何启动新的事务。可以使用START TRANSACTION在启用自动提交模式的情况下显式启动事务,并使用COMMIT和ROLLBACK来对其进行操作。禁用自动提交模式后需要显式地进行提交或回滚。事务是一组SQL语句的集合。回滚是指撤销特定SQL语句的过程,而提交是指将未存储的SQL语句结果写入数据库表。保留点指在事务处理中设置的点。这是一个临时的占位符。 可以对其进行撤销(与撤销整个事务处理不同)控制事务处理。开始事务并进行回退:\n```sql\nSELECT * FROM ordertotals;\n```\n如果查看ordertotals表不为空,则开始事务处理:\n```sql\nSTART TRANSACTION;\n```\n然后:\n```sql\nDELETE FROM ordertotals;\n```\n从ordertotals表中删除所有行:\n```sql\nSELECT * FROM ordertotals;\n```\n如果查看ordertotals表为空,进行回退:\n```sql\nROLLBACK;\n```\n回退语句:\n```sql\nSELECT * FROM ordertotals;\n```\n回退后,可以查看ordertotals表。再次检查ordertotals表,确认不为空。\n提交事务;\n开始事务;\n删除orderitems中order_num为20010的记录;\n删除orders中order_num为20010的记录;\n提交事务。\n只有在上述两条语句没有错误时,才能写下更改。\n保存点;\n创建保存点delete1;\n回退到保存点delete1;\n释放保存点delete1。\n设置autocommit为0,表示MySQL不会自动提交更改。\n备份与还原\n备份一个数据库:mysqldump -u root -p --opt people > df.txt # --opt优化执行速度\n备份两个数据库:mysqldump -u root -p --opt --databases people hw > all.txt\n备份全部数据库:mysqldump -u root -p --opt --all-DATABASES > all.txt\n恢复数据库:mysqldump -u root -p --opt --databases people hw < all.txt\n导出一张表:mysqldump -u 用户名 -p 密码 库名 表名 > 文件名(D:/a.sql)\n导出多张表:mysqldump -u 用户名 -p 密码 库名 表1 表2 表3 > 文件名(D:/a.sql)\n导出所有表:mysqldump -u 用户名 -p 密码 库名 > 文件名(D:/a.sql)\n导出一个库:mysqldump -u 用户名 -p 密码 --lock-ALL-TABLES --database 库名 > 文件名(D:/a.sql);可以-w携带WHERE条件\n用户账号\n创建账户: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';如果希望用户能够在任何机器上登陆mysql,则需将localhost改为%。将localhost改为 "%"  授权给其他用户 允许 GRANT OPTION  特权包括:     alter:变更数据库的表     create:新建数据库或表     delete:删除表数据     drop:删除数据库/表     index:建立/移除索引     insert:加入表数据     select:查询表数据     update:更新表数据     all:允许所有操作     usage:仅允许登录  刷新权限,创建新用户并授予权限:\nFLUSH PRIVILEGES;\n回收用户权限:\nREVOKE ALL PRIVILEGES ON people.df FROM 'root'@'localhost';\n删除用户:\nDROP USER IF EXISTS 'hw'@'localhost';\n设置指定用户的密码:\nSET PASSWORD FOR 'hw'@'localhost' = PASSWORD('123321');\n更新用户密码:\nUPDATE USER SET PASSWORD = PASSWORD('123321') WHERE USER = 'hw';\n设置密码:\nSET PASSWORD = PASSWORD('123321');\n其他操作:\nSHOW STATUS; 显示服务器状态信息\nSHOW PROCEDURE STATUS; 显示过程状态信息\nSHOW GRANTS; 显示用户授予的安全权限\nSHOW ERRORS; 显示服务器错误信息\nSHOW WARNINGS; 显示服务器警告信息\nSHOW PROCESSLIST; 显示运行的线程信息\nSHOW VARIABLES; 显示系统变量信息\nSELECT DATABASE(); 查看当前数据库\nSELECT NOW();用户(),VERSION():展示当前时间、用户名、以及数据库版本\nSHOW ENGINES:显示不同存储引擎的列表\nLOGS/STATUS:展示存储引擎的日志和状态信息\nSHOW VARIABLES LIKE 'character%':确定系统所使用的字符集和校对\nSHOW VARIABLES LIKE 'collation%':确定系统所使用的字符集和校对\nSHOW VARIABLES LIKE 'character_set_client%':展示客户端向服务器发送数据时所使用的编码\nSHOW VARIABLES LIKE 'character_set_results%':展示服务器端返回给客户端结果时所使用的编码\nSHOW VARIABLES LIKE 'character_set_connection%':展示连接层所使用的编码\nSHOW CHARACTER SET:展示支持的字符集列表\nSHOW 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共享之家」,可扫描以下二维码关注。本文内容来自微信公众号「IT共享之家」,可通过以下二维码关注。如需转载请联系IT共享之家公众号。

 

在线咨询 拨打电话

电话

02088888888

微信二维码

微信二维码