本教程来自我的github nightttt7/MySQL-tutorial, 使用python脚本定时更新在此

本教程用于:
1. 入门学习
2. 快速查询
- 初稿完成于2018/3/13 by nightttt7 and lotus3333

todo

  1. 完善 游标
  2. 触发器
  3. 函数
  4. 引擎
  5. 数据库设置与安全
  6. 范式
  7. 更多的实战

目录

  • 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双精度
  1. bool值等于tinyint(1)。0是False,非0是True;但是False是0,True是1。
  2. 个人看法是尽量不要使用UNSIGNED,因为可能会带来一些意想不到的的效果,对于INT类型可能存放不了的数据,INT UNSIGNED同样可能存放不了,与其如此,还不如在数据库设计阶段将INT类型提升为BIGINT类型 来源
  3. [(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.
  4. [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字节 极大文本数据
  1. 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.
  2. 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.
  3. BINARY的不同是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
  4. 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.
  5. VARCHAR(M) M represents the maximum column length in characters. The range of M is 0 to 65,535.
  6. 还有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

数据预览

题目

  1. 将数据表deposite中孙杨的所有存款金额加10000
  2. 将数据表deposite中所属账户为工商银行并且存入日期为2011-04-05的人员的存款金额加1000
  3. 将数据表deposite中郭海的银行标识改为建设银行
  4. 查询孙杨的存款信息(显示信息:客户ID,客户姓名,银行名称,存款金额)
  5. 查询日期为2011-04-05这一天进行过存款的客户ID,客户姓名,银行名称,存款金额
  6. 查询工商银行存款大于等于一万的客户姓名(使用表链接和子查询两种方式实现)
  7. 查询在农业银行存款前五名的客户存款信息(显示信息:客户姓名,银行名称,存款金额)
  8. 创建存储过程update_salary,更新customer表的salary属性,将salary低于5000的客户的salary变为原来的2倍

参考答案

  1. 将数据表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
  1. 将数据表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
  1. 将数据表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
  1. 查询孙杨的存款信息(显示信息:客户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)
  1. 查询日期为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)
  1. 查询工商银行存款大于等于十万的客户姓名(每个客户在每个银行只有一个账户)
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   |
+--------+
| 孙杨   |
| 郭惠   |
+--------+
  1. 查询在农业银行存款前两名的客户存款信息(显示信息:客户姓名,银行名称,存款金额)
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)
  1. 创建存储过程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简明教程-下相关推荐

  1. 高等代数第3版下 [丘维声 著] 2015年版_机器学习与线性代数简明教程(下)

    机器学习与线性代数简明教程(上) 线性代数在机器学习(ML)和深度学习(DL)中是必不可少的.即使我们努力为许多理论创建精确的机器学习模型,线性代数仍然是这些研究中的重要工具. 正交矩阵 如果方形矩阵 ...

  2. MySQL全文索引应用简明教程

    MySQL全文索引应用简明教程 本文从以下几个方面介绍下MySQL全文索引的基础知识: MySQL全文索引的几个注意事项 全文索引的语法 几种搜索类型的简介 几种搜索类型的实例 全文索引的几个注意事项 ...

  3. centos得mysql安装教程_Centos下Mysql安装图文教程_MySQL

    Mysql是比较常用的数据库,日常开发中也是采用地比较多.工欲善其事必先利其器,本文特地来讲解下如何在centos(其他linux发行版类似)下安装Mysql.首先准备的材料:Mysql,我这里采用的 ...

  4. Linux下CMake简明教程(二)同一目录下多个源文件

    代码在git 接下来进入稍微复杂的例子:在同一个目录下有多个源文件.在之前的目录下添加2个文件,testFunc.c和testFunc.h.添加完后整体文件结构如下, (base) ledi@ledi ...

  5. mysql安装教程8.0.21安装,Windows系统下MySQL8.0.21安装教程(图文详解)

    安装建议:尽量不要用.exe进行安装,用压缩包安装,对日后的卸载/版本升级更为方便 下载地址:https://dev.mysql.com/downloads/mysql/ 1.点击上面的下载地址得到z ...

  6. Windows环境下smarty安装简明教程

    整个配置过程分为九步走,文章看起来比较长,那是因为站长对每一个步骤都给出了没法再详细的解释,非常浅显,绝对是名副其实的"最简明教程".按照这个教程,智商大于零的用户都能顺利配置好S ...

  7. centos7环境下MySQL安装教程

    Linux centos7环境下MySQL安装教程 作者:随缘相识-(志同道合) 字体:[增加 减小] 类型:转载 时间:2017-03-17 我要评论 这篇文章主要为大家详细介绍了Linux cen ...

  8. Windows环境下smarty安装最简明教程 分享

    记得去年写过一个windows+IIS的PHP4安装最简明教程,那天去baidu搜了一下,竟然查到了好几页,这篇文章被很多网站.blog转载,在论坛上的阅读次数截至今日更是让人难以置信的达到1800多 ...

  9. GCC编译器简明教程(Linux下C语言开发环境的搭建)

    GCC编译器简明教程(Linux下C语言开发环境的搭建) 市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境(例如GNOME.KDE.Unity等)和各种常用的必 ...

  10. Linux/Unix系统下nginx+php安装简明教程

    本文转载自Linux/Unix系统下nginx+php安装简明教程,请保留转载信息~ 一.安装nginx: 1. 安装pcre库,nginx的rewrite模板需用到pcre库: mkdir -p / ...

最新文章

  1. 电池pack结构_PACK仿真电池分析新能源汽车整车碰撞
  2. groovy怎样从sql语句中截取表名_SQL基础教程学习笔记
  3. 关于语音发送/接收 方法和装置发明专利正式发布
  4. 处理Akka应用程序中的每个事件
  5. [html] 元素的alt和title有什么区别?
  6. python控制流代码怎么用_Python-11:Python语法基础-控制流
  7. 985 硕士待业200天,工作 10 年存款 2W : 累死你的不是工作,而是“选择”
  8. 主从同步redis和mysql的区别_mysql主从复制、redis基础、持久化和主从复制
  9. java异步编程书籍_《Java异步编程实战》(翟陆续)【摘要 书评 试读】- 京东图书...
  10. CCAI 2017 | 澳大利亚新南威尔士大学教授 Toby Walsh 将带来精彩演讲
  11. python之路金角大王_python 之路,致那些年,我们依然没搞明白的编码
  12. 如何做一个真正的男人
  13. android DevAppsDirect开源项目
  14. windows大小写,切换键修改lock or shift
  15. BWAI学习记录001_星际争霸BWAPI 4.4.0下AI(ualbertabot)配置安装
  16. 两行CSS代码实现瀑布流
  17. 51单片机学习笔记之新建工程、点亮一盏小灯
  18. 【观察】数据中心从制冷到“智冷”,华为践行“双碳”更进一步
  19. 手柄的姿态算法_VR手柄姿态初始算法、VR手柄及存储介质的制作方法
  20. Hdu-5050 Divided Land(Java高精度)

热门文章

  1. 在linux下运行锐捷客户端,锐捷Linux客户端使用方法(基于ubuntu16.04)
  2. Open3D绘制3D坐标,绘制点云
  3. Spring boot 开发 GA/T1400 协议之注册、保活、注销、校时功能
  4. user_agent
  5. 真人秀制作网站_真人秀正在毁掉中国的明星
  6. Tcpip详解卷一第3章(2)
  7. 全球国家(和地区)信息JSON数据
  8. 地理信息系统(GIS)系列——ArcGIS API for JavaScript 3.9(2)
  9. 天锐绿盾加密系统是做什么用的?
  10. Java程序员必看的 14 本 Java 书籍!