MySQL简明教程-下
本教程来自我的github nightttt7/MySQL-tutorial, 使用python脚本定时更新在此
本教程用于:
1. 入门学习
2. 快速查询
- 初稿完成于2018/3/13 by nightttt7 and lotus3333
todo
- 完善 游标
- 触发器
- 函数
- 引擎
- 数据库设置与安全
- 范式
- 更多的实战
目录
- todo
- 目录
- 事务
- 示例代码
- 1. 数值类型
- 2. 日期和时间类型
- 3. 字符串类型
- 文本文档的导入导出
- 批处理
- 实战1
- 初始化
- 数据预览
- 题目
- 参考答案
事务
- TRANSACTION
- 管理必须成批执行的SQL语句,要么全部成功,要么全部失败
- 事务开启
START TRANSACTION;
# 或者
BEGIN;
- 事务提交
COMMIT;
- 事务回滚
ROLLBACK;
- 设置保存点
SAVEPOINT 保存点名称;
- 回滚到保存点
ROLLBACK TO SAVEPOINT 保存点名称;
- 删除保存点
RELEASE SAVEPOINT 保存点名称;
- 创建/删除/更改结构等语句不能被回滚
- 事务不能嵌套
示例代码
mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> insert into test value('英文');
Query OK, 1 row affected (0.05 sec)mysql> insert into test value('挪威语');
Query OK, 1 row affected (0.01 sec)mysql> commit;
Query OK, 0 rows affected (0.05 sec)mysql> select * from test;
+-----------+
| name |
+-----------+
| 中文 |
| 英文 |
| 挪威语 |
+-----------+
3 rows in set (0.00 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> insert into test value('法语');
Query OK, 1 row affected (0.05 sec)mysql> rollback;
Query OK, 0 rows affected (0.07 sec)mysql> select * from test;
+-----------+
| name |
+-----------+
| 中文 |
| 英文 |
| 挪威语 |
+-----------+
3 rows in set (0.00 sec)mysql> begin ;
Query OK, 0 rows affected (4.01 sec)mysql> insert into test value('俄罗斯语');
Query OK, 1 row affected (0.01 sec)mysql> savepoint yaou;
Query OK, 0 rows affected (0.00 sec)mysql> insert into test value('西班牙语');
Query OK, 1 row affected (0.00 sec)mysql> savepoint xiou;
Query OK, 0 rows affected (0.02 sec)mysql> insert into test value('阿拉伯语');
Query OK, 1 row affected (0.00 sec)mysql> savepoint dongou;
Query OK, 0 rows affected (0.00 sec)mysql> rollback to savepoint xiou;
Query OK, 0 rows affected (0.00 sec)mysql> select * from test;
+--------------+
| name |
+--------------+
| 中文 |
| 英文 |
| 挪威语 |
| 法语 |
| 粤语 |
| 瑞典语 |
| 芬兰语 |
| 俄罗斯语 |
| 西班牙语 |
+--------------+
9 rows in set (0.00 sec)
详细docs地址
1. 数值类型
类型 | 大小 | 备注 |
---|---|---|
BIT[(M)] | ||
TINYINT[(M)] | 1字节 | (-128,127) |
SMALLINT[(M)] | 2字节 | (-32 768,32 767) |
MEDIUMINT[(M)] | 3字节 | (-8 388 608,8 388 607) |
INT或INTEGER[(M)] | 4字节 | (-2 147 483 648,2 147 483 647) |
BIGINT[(M)] | 8字节 | 极大整数值 |
DECIMAL[(M[,D])] | M是数字的总数,D是小数点后的数字 | |
FLOAT[(M,D)] | 4字节 | 单精度浮点数值 |
DOUBLE[(M,D)] | 8字节 | 双精度浮点数值 |
FLOAT[(p)] | 0-24单精度,25-53双精度 |
- bool值等于tinyint(1)。0是False,非0是True;但是False是0,True是1。
- 个人看法是尽量不要使用UNSIGNED,因为可能会带来一些意想不到的的效果,对于INT类型可能存放不了的数据,INT UNSIGNED同样可能存放不了,与其如此,还不如在数据库设计阶段将INT类型提升为BIGINT类型 来源
- [(M)] 对于bit指bit数,最大63,默认1。M indicates the maximum display width for integer types. For floating-point and fixed-point types, M is the total number of digits that can be stored (the precision). For string types, M is the maximum length. The maximum permissible value of M depends on the data type.
- [UNSIGNED]无符号 [ZEROFILL]自动补零(自动unsigned)只有BIT没有这两个选项
BIGINT FLOAT DOUBLE DECIMAL
类型 | 大小 | 范围(有符号) | 范围(无符号) |
---|---|---|---|
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,3.402 823 466 351 E+38) | (0,3.402 823 466 E+38) |
DOUBLE | 8 字节 | (-1.797 693 134 862 315 7 E+308,1.797 693 134 862 315 7 E+308) | (0,1.797 693 134 862 315 7 E+308) |
2. 日期和时间类型
当指定不合法的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 | 0-255字节 | 定长字符串 | |
VARCHAR | 0-65535字节 | 变长字符串 | |
BINARY | 二进制 | ||
VARBINARY | 二进制 | ||
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 | |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 | |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 | |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 | |
TINYTEXT | 0-255字节 | 短文本字符串 | |
TEXT | 0-65 535字节 | 长文本数据 | |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 | |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
- The CHARACTER SET attribute specifies the character set, and the COLLATE attribute specifies a collation for the character set.CHARSET is a synonym for CHARACTER SET.
- CHARACTER SET binary attribute for a character string data type causes the column to be created as the corresponding binary string data type: CHAR becomes BINARY, VARCHAR becomes VARBINARY, and TEXT becomes BLOB.
- BINARY的不同是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
- CHAR[(M)] M represents the column length in characters. The range of M is 0 to 255. If M is omitted, the length is 1.
- VARCHAR(M) M represents the maximum column length in characters. The range of M is 0 to 65,535.
- 还有ENUM(枚举)和SET两种字符串形式。
文本文档的导入导出
- my.ini文件设置可访问路径
[mysqld]
secure-file-priv = C:\Users\Administrator\Desktop
- 导出为TXT文档
select * into outfile '文件路径' from 表名;
# windows下用\\
# linux下用/
- 导入TXT文档
load data local infile '文件路径' into table 表名;
- 分隔符号
默认按制表符和换行符分隔
FIELDS TERMINATED BY '\t';
LINES TERMINATED BY '\n';
windows下
LINES TERMINATED BY '\r\n';
mac下
LINES TERMINATED BY '\r';
批处理
- 批处理-shell https://dev.mysql.com/doc/refman/5.7/en/batch-mode.html
shell> mysql -h host -u user -p < batch-file
Enter password: ********
- 如果您希望脚本继续,即使其中的某些语句产生错误,则应使用 –force命令行选项。
- 如果要以批处理方式获取交互式输出格式,请使用mysql -t。要输出执行的语句输出,请使用mysql -v
- 您还可以使用命令或命令从mysql提示符中使用脚本:source\\.
实战1
- 原文地址:http://blog.csdn.net/fuchunyuan0/article/details/51883889?locationNum=3&fps=1
初始化
C:\Users\Administrator>mysql -uroot -pSqq123456!mysql> create database if not exists customdb;
Query OK, 1 row affected (0.05 sec)mysql> use customdb;
Database changedmysql> create table if not exists customer(-> c_id char(6) primary key,
-> name varchar(30)not null,
-> location varchar(30),
-> salary decimal(8,2)
-> );
Query OK, 0 rows affected (0.47 sec)mysql> create table if not exists bank(-> b_id char(5) primary key,
-> bank_name char(30) not null
-> );
Query OK, 0 rows affected (0.34 sec)mysql> create table if not exists deposite(-> d_id int(10) auto_increment primary key,
-> c_id char(6),
-> b_id char(5),
-> dep_date date,
-> amount decimal(8,2),
-> constraint FK_c_id foreign key(c_id) references customer(c_id)
-> );
Query OK, 0 rows affected (0.32 sec)mysql> insert into customer-> values('101001','孙杨','广州',1234),
-> ('101002','郭海','南京',3526),
-> ('101003','卢江','苏州',6892),
-> ('101004','郭惠','济南',3492);
Query OK, 4 rows affected (0.15 sec)
Records: 4 Duplicates: 0 Warnings: 0mysql> insert into bank-> values('B0001','工商银行'),
-> ('B0002','建设银行'),
-> ('B0003','中国银行');
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0mysql> insert into bank-> values('B0004','农业银行');
Query OK, 1 row affected (0.04 sec)mysql> insert into deposite-> values(1,'101001','B0001','2011-04-05',42526),
-> (2,'101002','B0003','2012-07-15',66500),
-> (3,'101003','B0002','2010-11-24',42366),
-> (4,'101004','B0004','2008-03-31',62362),
-> (5,'101001','B0003','2002-02-07',56346),
-> (6,'101002','B0001','2004-09-23',353626),
-> (7,'101003','B0004','2003-12-14',36236),
-> (8,'101004','B0002','2007-04-21',26267),
-> (9,'101001','B0002','2011-02-11',435456),
-> (10,'101002','B0004','2012-05-13',234626),
-> (11,'101003','B0003','2001-01-24',26243),
-> (12,'101004','B0001','2009-08-23',45671);
Query OK, 12 rows affected (0.09 sec)
Records: 12 Duplicates: 0 Warnings: 0
数据预览
题目
- 将数据表deposite中孙杨的所有存款金额加10000
- 将数据表deposite中所属账户为工商银行并且存入日期为2011-04-05的人员的存款金额加1000
- 将数据表deposite中郭海的银行标识改为建设银行
- 查询孙杨的存款信息(显示信息:客户ID,客户姓名,银行名称,存款金额)
- 查询日期为2011-04-05这一天进行过存款的客户ID,客户姓名,银行名称,存款金额
- 查询工商银行存款大于等于一万的客户姓名(使用表链接和子查询两种方式实现)
- 查询在农业银行存款前五名的客户存款信息(显示信息:客户姓名,银行名称,存款金额)
- 创建存储过程update_salary,更新customer表的salary属性,将salary低于5000的客户的salary变为原来的2倍
参考答案
- 将数据表deposite中孙杨的所有存款金额加10000
mysql> update deposite set amount = amount + 10000-> where c_id = (select c_id from customer where name = '孙杨');
Query OK, 3 rows affected (0.12 sec)
Rows matched: 3 Changed: 3 Warnings: 0
- 将数据表deposite中所属账户为工商银行并且存入日期为2011-04-05的人员的存款金额加1000
mysql> update deposite set amount = amount + 1000-> where dep_date = '2011-04-05' and-> b_id = ( select b_id from bank where bank_name = '工商银行');
Query OK, 1 row affected (0.11 sec)
Rows matched: 1 Changed: 1 Warnings: 0
- 将数据表deposite中郭海的银行标识改为建设银行
mysql> update deposite set b_id =-> (select b_id from bank where bank_name = '建设银行')-> where c_id =-> (select c_id from customer where name = '郭海')-> ;
Query OK, 3 rows affected (0.06 sec)
Rows matched: 3 Changed: 3 Warnings: 0
- 查询孙杨的存款信息(显示信息:客户ID,客户姓名,银行名称,存款金额)
mysql> select deposite.c_id,name,bank_name,amount from deposite,customer,bank
-> where name = '孙杨' and deposite.c_id=customer.c_id and bank.b_id=deposite.b_id;
+--------+--------+--------------+-----------+
| c_id | name | bank_name | amount |
+--------+--------+--------------+-----------+
| 101001 | 孙杨 | 工商银行 | 42526.00 |
| 101001 | 孙杨 | 建设银行 | 435456.00 |
| 101001 | 孙杨 | 中国银行 | 56346.00 |
+--------+--------+--------------+-----------+
3 rows in set (0.01 sec)
或者
mysql> select customer.c_id,name,bank_name,amount from
-> deposite inner join customer inner join bank
-> on deposite.c_id = customer.c_id and deposite.b_id = bank.b_id
-> where name = '孙杨';
+--------+--------+--------------+-----------+
| c_id | name | bank_name | amount |
+--------+--------+--------------+-----------+
| 101001 | 孙杨 | 工商银行 | 42526.00 |
| 101001 | 孙杨 | 建设银行 | 435456.00 |
| 101001 | 孙杨 | 中国银行 | 56346.00 |
+--------+--------+--------------+-----------+
3 rows in set (0.00 sec)
- 查询日期为2011-04-05这一天进行过存款的客户ID,客户姓名,银行名称,存款金额
mysql> select deposite.c_id,name,bank_name,amount from
-> deposite inner join customer inner join bank
-> on deposite.c_id = customer.c_id and deposite.b_id = bank.b_id
-> where dep_date = '2011-04-05';
+--------+--------+--------------+----------+
| c_id | name | bank_name | amount |
+--------+--------+--------------+----------+
| 101001 | 孙杨 | 工商银行 | 42526.00 |
+--------+--------+--------------+----------+
1 row in set (0.00 sec)
- 查询工商银行存款大于等于十万的客户姓名(每个客户在每个银行只有一个账户)
mysql> select name from
-> deposite inner join customer inner join bank
-> on deposite.c_id = customer.c_id and deposite.b_id = bank.b_id
-> where bank_name = '工商银行' and amount >= 10000;
+--------+
| name |
+--------+
| 孙杨 |
| 郭惠 |
+--------+
- 查询在农业银行存款前两名的客户存款信息(显示信息:客户姓名,银行名称,存款金额)
mysql> select name from
-> deposite inner join customer inner join bank
-> on deposite.c_id = customer.c_id and deposite.b_id = bank.b_id
-> where bank_name='农业银行'
-> order by amount limit 2
-> ;
+--------+
| name |
+--------+
| 卢江 |
| 郭惠 |
+--------+
2 rows in set (0.06 sec)
- 创建存储过程update_salary,更新customer表的salary属性,将salary低于5000的客户的salary变为原来的2倍
mysql> CREATE PROCEDURE update_salary()-> UPDATE customer set salary = salary * 2-> WHERE salary < 5000;
Query OK, 0 rows affected (0.00 sec)mysql> call update_salary();
Query OK, 3 rows affected (0.09 sec)mysql> select * from customer;
+--------+--------+----------+---------+
| c_id | name | location | salary |
+--------+--------+----------+---------+
| 101001 | 孙杨 | 广州 | 2468.00 |
| 101002 | 郭海 | 南京 | 7052.00 |
| 101003 | 卢江 | 苏州 | 6892.00 |
| 101004 | 郭惠 | 济南 | 6984.00 |
+--------+--------+----------+---------+
4 rows in set (0.00 sec)
MySQL简明教程-下相关推荐
- 高等代数第3版下 [丘维声 著] 2015年版_机器学习与线性代数简明教程(下)
机器学习与线性代数简明教程(上) 线性代数在机器学习(ML)和深度学习(DL)中是必不可少的.即使我们努力为许多理论创建精确的机器学习模型,线性代数仍然是这些研究中的重要工具. 正交矩阵 如果方形矩阵 ...
- MySQL全文索引应用简明教程
MySQL全文索引应用简明教程 本文从以下几个方面介绍下MySQL全文索引的基础知识: MySQL全文索引的几个注意事项 全文索引的语法 几种搜索类型的简介 几种搜索类型的实例 全文索引的几个注意事项 ...
- centos得mysql安装教程_Centos下Mysql安装图文教程_MySQL
Mysql是比较常用的数据库,日常开发中也是采用地比较多.工欲善其事必先利其器,本文特地来讲解下如何在centos(其他linux发行版类似)下安装Mysql.首先准备的材料:Mysql,我这里采用的 ...
- Linux下CMake简明教程(二)同一目录下多个源文件
代码在git 接下来进入稍微复杂的例子:在同一个目录下有多个源文件.在之前的目录下添加2个文件,testFunc.c和testFunc.h.添加完后整体文件结构如下, (base) ledi@ledi ...
- mysql安装教程8.0.21安装,Windows系统下MySQL8.0.21安装教程(图文详解)
安装建议:尽量不要用.exe进行安装,用压缩包安装,对日后的卸载/版本升级更为方便 下载地址:https://dev.mysql.com/downloads/mysql/ 1.点击上面的下载地址得到z ...
- Windows环境下smarty安装简明教程
整个配置过程分为九步走,文章看起来比较长,那是因为站长对每一个步骤都给出了没法再详细的解释,非常浅显,绝对是名副其实的"最简明教程".按照这个教程,智商大于零的用户都能顺利配置好S ...
- centos7环境下MySQL安装教程
Linux centos7环境下MySQL安装教程 作者:随缘相识-(志同道合) 字体:[增加 减小] 类型:转载 时间:2017-03-17 我要评论 这篇文章主要为大家详细介绍了Linux cen ...
- Windows环境下smarty安装最简明教程 分享
记得去年写过一个windows+IIS的PHP4安装最简明教程,那天去baidu搜了一下,竟然查到了好几页,这篇文章被很多网站.blog转载,在论坛上的阅读次数截至今日更是让人难以置信的达到1800多 ...
- GCC编译器简明教程(Linux下C语言开发环境的搭建)
GCC编译器简明教程(Linux下C语言开发环境的搭建) 市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境(例如GNOME.KDE.Unity等)和各种常用的必 ...
- Linux/Unix系统下nginx+php安装简明教程
本文转载自Linux/Unix系统下nginx+php安装简明教程,请保留转载信息~ 一.安装nginx: 1. 安装pcre库,nginx的rewrite模板需用到pcre库: mkdir -p / ...
最新文章
- 电池pack结构_PACK仿真电池分析新能源汽车整车碰撞
- groovy怎样从sql语句中截取表名_SQL基础教程学习笔记
- 关于语音发送/接收 方法和装置发明专利正式发布
- 处理Akka应用程序中的每个事件
- [html] 元素的alt和title有什么区别?
- python控制流代码怎么用_Python-11:Python语法基础-控制流
- 985 硕士待业200天,工作 10 年存款 2W : 累死你的不是工作,而是“选择”
- 主从同步redis和mysql的区别_mysql主从复制、redis基础、持久化和主从复制
- java异步编程书籍_《Java异步编程实战》(翟陆续)【摘要 书评 试读】- 京东图书...
- CCAI 2017 | 澳大利亚新南威尔士大学教授 Toby Walsh 将带来精彩演讲
- python之路金角大王_python 之路,致那些年,我们依然没搞明白的编码
- 如何做一个真正的男人
- android DevAppsDirect开源项目
- windows大小写,切换键修改lock or shift
- BWAI学习记录001_星际争霸BWAPI 4.4.0下AI(ualbertabot)配置安装
- 两行CSS代码实现瀑布流
- 51单片机学习笔记之新建工程、点亮一盏小灯
- 【观察】数据中心从制冷到“智冷”,华为践行“双碳”更进一步
- 手柄的姿态算法_VR手柄姿态初始算法、VR手柄及存储介质的制作方法
- Hdu-5050 Divided Land(Java高精度)
热门文章
- 在linux下运行锐捷客户端,锐捷Linux客户端使用方法(基于ubuntu16.04)
- Open3D绘制3D坐标,绘制点云
- Spring boot 开发 GA/T1400 协议之注册、保活、注销、校时功能
- user_agent
- 真人秀制作网站_真人秀正在毁掉中国的明星
- Tcpip详解卷一第3章(2)
- 全球国家(和地区)信息JSON数据
- 地理信息系统(GIS)系列——ArcGIS API for JavaScript 3.9(2)
- 天锐绿盾加密系统是做什么用的?
- Java程序员必看的 14 本 Java 书籍!