mysql基础理论

第一章 初识数据库MySQL
一、数据库基础知识
Mysql是一个开放源代码的数据库管理系统(DBMS),它是由Mysql AB公司开发、发布并支持的。Mysql是一个跨平台的开源关系数据库管理系统,广泛地应用在Internet上的中小型网站公司开发中。那么本章主要介绍数据库的基础知识,通过本章的学习,我们可以了解数据库的基本概念,数据库的构成和Mysql的基础知识。
数据库是由一批数据构成的有序的集合。这些数据被存放在结构化的数据表里。数据表之间互相关联,反映了客观事物间的本质联系。数据库系统提供对数据的安全控制和完整性控制。本节将介绍数据库中的一些基本概念,包括:数据库的定义、数据表的定义和数据类型等。
1.1.1 什么是数据库
数据库的概念诞生于60年前,随着信息技术和市场的快速发展,数据库技术层出不穷,随着应用的扩展和深入,数据库的数量和规模越来越大,其诞生和发展给计算机信息管理带来了一场巨大的革命。
数据库的发展大致划分为以下几个阶段:人工管理阶段、文件系统阶段、数据库系统阶段、高级数据库阶段。其种类大概有3种:层次式数据库、网络式数据库和关系式数据库。不同种类的数据库按不同的数据结构来联系和组织。
对于数据库的概念,没有一个完全固定的定义,随着数据库历史的发展,定义的内容也有很大的差异,其中一种比较普遍的观点认为,数据库(DataBase,DB)是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。它是一个按数据结构来存储和管理数据的计算机软件系统。即数据库包含两层含义:保管数据的“仓库”,以及数据管理的方法和技术。
数据库的特点包括:实现数据共享,减少数据冗余;采用特定的数据类型;具有较高的数据独立性;具有统一的数据控制功能。
1.1.2 表
在关系数据库中,数据库的表是一系列二维数组的集合,用来存储数据和操作数据的逻辑结构。它是由纵向的列和横向的行组成,行被称为记录,是组织数据的单位;列被称为字段,每一列表示记录的一个属性,都有相应的描述信息,如数据类型、数据宽度等。
例如一个有关作者信息的名为authors的表中,每个列包含所有作者的某个特定类型的信息,比如“姓名”,而每行则包含了某个特定作者的所有信息:编号、姓名、性别、专业,如图1.1所示

1.1.3 数据类型
数据类型决定了数据在计算机中的存储格式,代表不同的信息类型。常用的数据类型有:整数数据类型、浮点数数据类型、精确小数类型、二进制数据类型、日期/时间数据类型、字符串数据类型。表中的每一个字段就是某种指定数据类型,例如图1.1中“编号”字段为整数数据,“性别”字段为字符型数据。

1.1.4 主键
主键(Primary Key)用于唯一地标识表中的每一条记录。可以定义表中的一列或者多列为主键。主键列上不能有两行相同的值,也不能为空值。

1.2 数据库技术构成
数据库系统由硬件部分和软件部分共同构成,硬件主要用于存储数据库中的数据,包括计算机、存储设备等。软件部分则主要包括DBMS、支持DBMS运行的操作系统,以及支持多种语言进行应用开发的访问技术等。

1.2.1 数据库系统
数据库系统有3个主要的组成部分。
数据库:用于存储数据的地方。
数据库管理系统:用于管理数据库的软件。
数据库应用程序:为了提高数据库系统的处理能力所使用的管理数据库的软件补充。
数据库(Database System)提供了一个存储空间以存储各种数据,可以将数据库视为一个存储数据的容器。一个数据库可能包含许多文件,一个数据库系统中通常包含许多数据库。
数据库管理系统(Database Management System,DBMS)是用户创建、管理和维护数据库时所使用的软件,位于用户与操作系统之间,对数据库进行统一管理。DBMS能定义数据存储结构,提供数据的操作机制,维护数据库的安全性、完整性和可靠性。
数据库应用程序(Database Application)虽然已经有了DBMS,但是在很多情况下,DBMS无法满足对数据管理的要求。数据库应用程序的使用可以满足对数据管理的更高要,还可以使数据管理过程更加直观。数据库应用程序负责与DBMS进行通信,访问和管理DBMS中存储的数据,允许用户插入、修改、删除DB中的数据。
数据库系统如图1.2所示:

1.2.2 SQL语言
对数据库进行查询和修改操作的语言叫SQL。SQL的含义是结构化查询语句(Structured Query Languate)。SQL有许多不同的类型,有3个主要的标准:ANSI(美国国家标准机构)SQL,对ANSI SQL修改后在1992年采纳的标准,称为SQL-92或SQL2。最近的SQL-99标准,SQL-99标准从SQL2扩充而来并添加了对象关系特征和许多其他新的功能。其次,各大数据库厂商提供不同版本的SQL,这些版本的SQL不但能包括原始的ANSI标准,而且在很大程度上支持新退出的SQL-92标准。
SQL语言包含以下4个部分:
(1)数据定义语言(DDL):DROP、CREATE、ALTER等语句。
(2)数据操作语言(DML):INSERT、UPDATE、DELETE语句。
(3)数据查询语言(DQL):SELECT语句。
(4)数据控制语言(DCL):GRANT、REVOKE、COMMIT、ROLLBACK等语句。
mysql> CREATE TABLE student
-> (
-> student_id INT UNSIGNED,
-> name VARCHAR(30),
-> sex CHAR(1),
-> birth DATE,
-> PRIMARY KEY(student_id)
-> );
Query OK, 0 rows affected (0.10 sec)

上表包含4个字段,分别为student_id、name、sex、birth,其中student_id定义为表的主键。现在只是定义了一张表格,但并没有任何数据,接下来这条SQL声明语句,将在student表中插入一条记录:
mysql> INSERT INTO student(student_id,name,sex,birth) VALUES(1,‘JACK’,‘m’,‘1999-09-19’);
Query OK, 1 row affected (0.01 sec)

执行完上面的SQL语句之后,student表中就会增加一行新记录,该记录中student_id为1,姓名为JACK,性别为男,生日为1999.9,19.
那么我们在使用SELECT查询语句获取刚才插入的数据。
mysql> SELECT name FROM student WHERE student_id=1;
±-----+
| name |
±-----+
| JACK |
±-----+
1 row in set (0.06 sec)

1.2.3 数据库访问技术
不同的程度设计语言会有各自不同的数据库访问技术,程序语言通过这些技术,执行SQL语句,进行数据库管理。主要的数据库访问技术有:
1、ODBC
Open Database Connectivity(开放数据库互联)技术为访问不同的SQL数据库提供了一个共同的接口。ODBC使用SQL作为访问数据的标准。这一接口提供了最大限度的互操作性;一个应用程序可以通过共同的一组代码访问不同的SQL数据库管理系统DBMS。
2、JDBC
Java Data Base Connectivity(java数据库连接)用于java应用程序连接数据库的标准方法,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成。

3、ADO.NET
ADO.NET是微软在.NET框架下开发设计的一组用于和数据源进行交互的面向对象类库。ADO.NET提供了对关系数据、XML和应用程序的访问,允许和不同类型的数据源以及数据库进行交互。

4、PDO
PDO(PHP Data Object)为PHP访问数据定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。PDO是PHP 5新加入的一个重大功能。

1.3 什么是Mysql
SQL Server等相比,Mysql规模小,功能有限,但是体积小、速度快、成本低,且它提供的功能对稍微复杂的应用来说已经够用了,这些特性使得Mysql成为世界上最受欢迎的开放源代码数据库。

1.3.1客户机-服务器软件
主从式架构(Client-server model)或客户端-服务器(Client/Server)结构简称C/S架构,是一种网络架构,通常在该网络架构下软件分为客户端(Client)和服务端(Server)
服务器是整个应用系统资源的存储于管理中心,多个客户端则各自处理相应的功能,共同实现完整的应用。在客户/服务器结构中,客户端用户的请求被传送到数据库服务器,数据库服务器进行处理后,将结果返回给用户,从而减少了网络数据传输量。
用户使用应用程序时,首先启动客户端通过有关命令告知服务器进行连接以完成各种操作,而服务器则按照此请求提供相应的服务。每一个客户端软件的实例都可以向一个服务器或应用程序服务器发出请求。这种系统的特点就是,客户端和服务器程序不在同一台计算机上运行,这些客户端和服务器程序通常归属不同的计算机。

1.3.2 Mysql版本
针对不同用户,Mysql分为2个不同的版本:
MySQL Community Server(社区版):该版本完全免费,但是官方不提供技术支持
MySQL Enterprise Server(企业版服务器):它能够以很高的性价比为企业提供数据仓库应用,支持ACID事务处理,提供完整的提交、回滚、崩溃恢复和行级锁定功能。但是该版本需付费使用,官方提供电话技术支持。
MySQL的命名机制由3个数字和1个后缀组成,例如mysql-5.5.13.
(1)第一个数字(5)是主版本号,描述了文件格式,所有版本5的发行版都有相同的文件格式。
(2)第二个数字(5)是发行级别,主版本号和发行级别组合在一起便构成了发行序列号
(3)第三个数字(13)是在此发行系列的版本号,随每次新发布版本递增。通常选择已经发行的最新版本。

1.3.3 MySQL的优势
MySQL的主要优势如下:
(1)速度:运行速度快。
(2)价格:MySQL对多数个人用来说是免费的。
(3)容易使用:与其他大型数据库的设置和管理相比,其复杂程度较低,易于学习。
(4)可移植性:能够工作在众多不同的系统平台上,例如:Windows、Linux、Unix等
(5)丰富的接口:提供了用于C、C++、Eiffel、Java、Perl、PHP、Ruby、Python等语言的API
(6)支持查询语言:MySQL可以利用标准SQL语法和支持ODBC(开放式数据库连接)的应用程序
(7)安全性和连续性:十分灵活和安全的权限和密码系统,允许基于主机的验证。连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码安全。并且由于Mysql是网络化的,因此可以在因特网上的任何地方访问,提高数据共享的效率。

1.4 MySQL工具
MySQL数据库管理系统提供了许多命令行工具,这些工具可以用来管理MySQL服务器、对数据库进行访问控制、管理MySQL用户以及数据库备份和恢复工具等。而且MySQL提供图形化的管理工具,这使得对数据库的操作更加简单。

1.4.1 MySQL命令行实用程序
MySQL服务器端实用工具程序如下:
(1)mysqld:SQL后台程序。该程序必须运行之后,客户端才能通过连接服务器来访问数据库。
(2)mysqld_safe:服务器启动脚本。在Unix和Net Ware中使用mysqld_safe来启动mysqld服务器。
(3)mysql.server:服务器启动脚本。该脚本用于使用包含为特定级别的、运行启动服务的脚本、运行目录的系统。它调用mysqld_safe来启动MySQL服务器。
(4)mysqld_multi:服务器启动脚本,可以启动或停止系统上安装的多个服务器。
(5)myisamchk:用来描述、检查、优化和维护MyISAM表的实用工具。
(6)mysqlbug:MySQL缺陷报告脚本。它可以用来向MySQL邮件系统发送缺陷报告。
(7)mysql_install_db:该脚本用默认权限创建MySQL授权表。通常只是在系统上首次安装MySQL时执行一次。

MySQL客户端实用工具程序如下:
(1)myisampack:压缩MyISAM表以产生更小的只读表的一个工具。
(2)mysql:交互式输入SQL语句或从文件以批处理模式执行它们的命令行工具。
(3)mysqlaccess:检查访问主机名、用户名和数据库组合的权限的脚本。
(4)mysqladmin:执行管理操作的客户程序,例如创建或删除数据库,重载授权表,将表刷新到硬盘上,以及重新打开日志文件。mysqladmin还可以用来检索版本、进程,以及服务器的状态信息。
(5)mysqlbinlog:从二进制日志读取语句的工具。在二进制日志文件中包含执行过的语句,可用来帮助系统从崩溃中恢复。
(6)mysqlcheck:检查、修复、分析以及优化表的表维护客户程序。
(7)mysqldump:将MySQL数据库转储到一个文件(例如SQL语句或tab分隔符文本文件)的客户程序
(8)mysqlhotcopy:当服务器在运行时,快速备份MyISAM或ISAM表的工具。
(9)mysql import:使用LOAD DATA INFILE将文本文件导入相关表的客户程序。
(10)mysqlshow:显示数据库、表、列以及索引相关信息的客户程序。
(11)perror:显示系统或MySQL错误代码含义的工具。

第二章 数据库的基本操作
3.1 创建数据库
MySQL安装好之后,首先需要创建数据库,这是使用MySQL各种功能的前提。本章将详细介绍数据的基本操作,主要内容包括:创建数据库、删除数据库、不同类型的数据存储引擎和存储引擎的选择。
MySQL安装完成之后,将会在其data目录下自动创建几个必需的数据库,可以使用SHOW DATABASES;
语句来查看当前所有存在的数据库,如下。
mysql> SHOW DATABASES;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
±-------------------+
4 rows in set (0.19 sec)

可以看到,数据库列表中包含了4个数据库,mysql是必需的,它描述用户访问权限,用户经常利用test数据库做测试的工作,其他数据库将在后面的章节中介绍。
创建数据库是在系统磁盘上划分一块区域用于数据的存储和管理,如果管理员在设置权限的时候为用户创建了数据库,则可以直接使用,否则,需要自己创建数据库。MySQL中创建数据库的基本SQL语句格式为:CREATE DATABASE [IF NOT EXISTS] <数据库名>
[[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];
<数据库名>:创建数据库的名称。MySQL 的数据存储区将以目录方式表示 MySQL 数据库,因此数据库名称必须符合操作系统的文件夹命名规则,注意在 MySQL 中不区分大小写。
IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作。此选项可以用来避免数据库已经存在而重复创建的错误。
[DEFAULT] CHARACTER SET:指定数据库的默认字符集。
mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.02 sec)
mysql> show create database xiyou;
±---------±----------------------------------------------------------------+
| Database | Create Database |
±---------±----------------------------------------------------------------+
| xiyou | CREATE DATABASE xiyou /*!40100 DEFAULT CHARACTER SET utf8 */ |
±---------±----------------------------------------------------------------+
1 row in set (0.00 sec)
3.2 删除数据库
删除数据库是将已经存在的数据库从磁盘空间上清除,清除之后,数据库中的所有数据也将一起被删除。删除数据库语句和创建数据库的命令相似,MySQL中删除数据库的基本语法格式为:
DROP DATABASE database_name;
“database_name”为要删除的数据库的名称,如果指定的数据库不存在,则删除出错。
mysql> DROP DATABASE test_db;
Query OK, 0 rows affected (0.04 sec)

3.3 数据库存储引擎
数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。

3.3.1 MySQL存储引擎简介
MySQL提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在MySQL中,不需要在整个服务器中使用一种引擎,针对具体要求可以对每一个表使用不同的存储引擎。MySQL5.5支持的存储引擎有:InnoDB、MyISAM、Memory等。查看引擎的命令用
SHOW ENGINES\G
mysql>SHOW ENGINES\G
*************************** 1. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 4. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
6 rows in set (0.00 sec)

查看默认存储引擎:
mysql> show variables like ‘default_storage_engine’;
±-----------------------±-------+
| Variable_name | Value |
±-----------------------±-------+
| default_storage_engine | InnoDB |
±-----------------------±-------+
1 row in set (0.02 sec)

一、存储引擎简介
(1) 存储引擎说白了就是数据存储的格式,不同的存储引擎功能不同,占用的空间大小不同,读取性能也不同
(2) 数据库存储引擎是数据库底层软件组件,不同的存储引擎提供不同的存储机制
(3) 在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,可以对每一个表使用不同的存储引擎
(4) MySQL 支持多种存储引擎,如 InnoDB 、MyISAM 、Memory 、Merge 、Archive 、CSV 、Federated 等等

MyISAM 存储引擎特点:
(1) MySQL 5.5 之前使用 MyISAM 引擎,MySQL 5.5 之后使用 InnoDB 引擎
(2) MyISAM 引擎读取速度较快,占用资源相对较少,不支持事务,不支持外键约束,但支持全文索引
(3) 读写互相阻塞,也就是说读数据的时候你就不能写数据,写数据的时候你就不能读数据
(4) MyISAM 引擎只能缓存索引,而不能缓存数据

MyISAM 适用场景:
(1) 不需要事务支持的业务,例如转账就不行
(2) 适用于读数据比较多的业务,不适用于读写频繁的业务
(3) 并发相对较低、数据修改相对较少的业务
(4) 硬件资源比较差的机器可以考虑使用 MyISAM 引擎

InnoDB 存储引擎特点:
(1) 事务型数据库的首选引擎,支持事务安全表,支持行锁定和外键,MySQL 5.5.5 版本之后,InnoDB 作为默认存储引擎
(2) 具有提交、回滚和崩溃恢复能力的事务安全存储引擎,能处理巨大数据量,性能及效率高,完全支持外键完整性约束
(3) 具有非常高效的缓存特性,能缓存索引也能缓存数据,对硬件要求比较高
(4) 使用 InnoDB 时,将在 MySQL 数据目录下创建一个名为 ibdata1 的 10MB 大小的自动扩展数据文件,以及两个名为 ib_logfile0 和 ib_logfile1 的 5MB 大小的日志文件

InnoDB 适用场景:
(1) 需要事务支持的业务、高并发的业务
(2) 数据更新较为频繁的场景,比如 BBS、SNS、微博等
(3) 数据一致性要求较高的业务,比如充值转账、银行卡转账

Memory 存储引擎特点:
(1) Memory 存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问
(2) Memory 存储引擎执行 HASH 和 BTREE 索引,不支持 BLOB 和 TEXT 列,支持 AUTO_INCREMENT 列和对可包含 NULL 值得列的索引
(3) 当不再需要 Memory 表的内容时,要释放被 Memory 表使用的内存,应该执行 DELETE FROM 或 TRUNCATE TABLE ,或者删除整个表

二、存储引擎的选择
(1) 如果要提供提交、回滚和崩溃恢复能力的事务安全能力,并要求实现并发控制,InnoDB 是个很好的选择
(2) 如果数据表主要用来插入和查询记录,则 MyISAM 引擎能提供较高的处理效率
(3) 如果只是临时存放数据,数据量不大,并且不需要较高的安全性,可以选择将数据保存在内存中的 Memory 引擎,MySQL 使用该引擎作为临时表,存放查询的中间结果
(4) 如果只有 INSERT 和 SELECT 操作,可以选择 Archive 引擎,支持高并发的插入操作,如记录日志信息可以使用 Archive 引擎
功能 MyISAM Memory InnoDB
存储限制 256TB RAM 64TB
支持事务 No No Yes
支持全文索引 Yes No No
支持数索引 Yes Yes Yes
支持哈希缓存 No Yes No
支持数据缓存 No N/A Yes
支持外键 No No Yes

课后填充:1、在mysql中,每个数据库最多可创建20亿个表,一个表允许定义1024列,每行的最大长度为8092字节(不包括文本和图像类型的长度)。当表中定义有varchar、nvarchar或varbinary类型列时,如果向表中插入的数据行超过8092字节时将导致语句失败,并产生错误信息。SQL Server对每个表中行的数量没有直接限制,但它受数据库存储空间的限制。每个数据库的最大空间1048516TB,所以一个表可用的最大空间为1048516TB减去数据库类系统表和其它数据库对象所占用的空间。理论上无限大 就看你硬片够不够大 大多数情况先是你的硬片不够
第三章 数据表的基本操作
4.1 创建数据表
在创建完数据库之后,接下来我们就需要创建数据表。创建数据表是指在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性约束的过程。
4.1.1 创建表的语法形式
数据表属于数据库,在创建数据表之前,应该使用语句“USE <数据库名>” 指定操作是从哪个数据库中进行,如果没有选择数据库,会报错
语法:
CREATE TABLE <表名>

字段名1, 数据类型 [列级别约束条件] [默认值],
字段名2, 数据类型 [列级别约束条件] [默认值],
… …
):
例如:
mysql> CREATE TABLE tb_emp1
-> (
-> id INT(11),
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> SHOW TABLES;
±---------------+
| Tables_in_test |
±---------------+
| tb_emp1 |
±---------------+
1 row in set (0.05 sec)

4.1.2 使用主键约束
主键约束要求主键列的数据唯一,并且不允许为空。
1、单字段主键
语法:
字段名 数据类型 PRIMARY KEY [默认值]
例如:
mysql> CREATE TABLE tb_emp2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptID INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.05 sec)

2、在定义完所有列之后指定主键
语法:
[CONSTRAINT <约束名>] PRIMARY KEY [字段名]
例如:
mysql> CREATE TABLE tb_emp3
-> (
-> id INT(11),
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.01 sec)

3、多字段联合主键
语法:
PRIMARY KEY [字段1,字段2,…]
例如:
mysql> CREATE TABLE tb_emp4
-> (
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> PRIMARY KEY(name,deptId)
-> );
Query OK, 0 rows affected (0.00 sec)

4.1.3 使用外键约束
外键用来在两个表数据之间建立连接,它可以是一列或者多列
语法:
[CONSTRAINT<外键名>] FOREIGN KEY [字段名1,字段名2…]
REFERENCES<主表名> 主键列1[主键列2…]
例如:
mysql> CREATE TABLE tb_dept1
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22) NOT NULL,
-> location VARCHAR(50)
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE tb_emp5
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
-> );
Query OK, 0 rows affected (0.06 sec)

4.1.4 使用非空约束
非空约束指字段的值不能为空。
语法:
字段名 数据类型 not null
例如:
mysql> CREATE TABLE tb_emp6
-> (
-> id INT(11) PRIMARY KEY ,
-> name VARCHAR(25) NOT NULL,
-> deptId INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.06 sec)
或者
语法:
[CONSTRATIN <约束名>] UNIQUE (<字段名>)
例如:
mysql> CREATE TABLE tb_dept3
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22),
-> location VARCHAR(50),
-> CONSTRAINT STH UNIQUE(name)
-> );
Query OK, 0 rows affected (0.00 sec)

4.1.6 使用默认约束
默认约束指定某列的默认值。
语法:
字段名 数据类型 DEFAULT 默认值
例如:
mysql> CREATE TABLE tb_emp7
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25) NOT NULL,
-> deptId INT(11) DEFAULT 1111,
-> salary FLOAT,
-> info VARCHAR(50)
-> );
Query OK, 0 rows affected (0.00 sec)

4.1.7 设置表的属性值自动增加
语法:
字段名 数据类型 AUTO_INCREMENT
例如:
mysql> CREATE TABLE tb_emp8
-> (
-> id INT(11) PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(25) NOT NULL,
-> deptId INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.00 sec)

插入数据验证:
mysql> INSERT INTO tb_emp8(name,salary)
-> VALUES(‘lucy’,1000),(‘lura’,1200),(‘kevin’,1500);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
查看:
mysql> SELECT * FROM tb_emp8;
±—±------±-------±-------+
| id | name | deptId | salary |
±—±------±-------±-------+
| 1 | lucy | NULL | 1000 |
| 2 | lura | NULL | 1200 |
| 3 | kevin | NULL | 1500 |
±—±------±-------±-------+
3 rows in set (0.00 sec)

4.2 查看数据表结构
4.2.1 查看表基本结构语句DESCRIBE
语法:
DESCRIBE 表名;

DESC 表名;

例如:
mysql> DESCRIBE tb_dept1;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
±---------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)
或者
mysql> DESC tb_dept1;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
±---------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)

4.2.2 查看表详细结构语句
语法:
SHOW CREATE TABLE <表名\G>
mysql> SHOW CREATE TABLE tb_emp1\G
*************************** 1. row ***************************
Table: tb_emp1
Create Table: CREATE TABLE tb_emp1 (
id int(11) DEFAULT NULL,
name varchar(25) DEFAULT NULL,
deptId int(11) DEFAULT NULL,
salary float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

4.3 修改数据表
4.3.1 修改表名
语法:
ALTER TABLE <旧表名> RENAME [TO] <新表名>.
例如:
mysql> SHOW TABLES;
±---------------+
| Tables_in_test |
±---------------+
| tb_dept1 |
| tb_dept3 |
| tb_emp1 |
| tb_emp2 |
| tb_emp3 |
| tb_emp4 |
| tb_emp5 |
| tb_emp7 |
| tb_emp8 |
±---------------+
9 rows in set (0.00 sec)

mysql> ALTER TABLE tb_dept3 RENAME tb_deptment3;
Query OK, 0 rows affected (0.05 sec)

mysql> SHOW TABLES;
±---------------+
| Tables_in_test |
±---------------+
| tb_dept1 |
| tb_deptment3 |
| tb_emp1 |
| tb_emp2 |
| tb_emp3 |
| tb_emp4 |
| tb_emp5 |
| tb_emp7 |
| tb_emp8 |
±---------------+
9 rows in set (0.00 sec)

4.3.2 修改字段的数据类型
语法:
ALTER TABLE <表名> MODIFY <字段名> <数据类型>
例如:
mysql> DESC tb_dept1;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
±---------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)

mysql> ALTER TABLE tb_dept1 MODIFY name VARCHAR(30);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC tb_dept1;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| location | varchar(50) | YES | | NULL | |
±---------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)

4.3.3 修改字段名
语法:
ALTER TABLE <表名> CHANGE<旧字段名><新字段名> <新数据类型>
例如:
mysql> ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50);
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC tb_dept1;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
±------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)

4.3.4 添加字段
语法:
ALTER TABLE <表名> ADD <新字段名><数据类型> [约束条件] [FIRST|AFTER 已存在字段名]
例如:
mysql> DESC tb_dept1;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
±------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)

mysql> ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) not null;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC tb_dept1;
±--------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
±--------±------------±-----±----±--------±------+
4 rows in set (0.00 sec)
或者
mysql> ALTER TABLE tb_dept1 ADD column2 INT(11) FIRST;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC tb_dept1;
±--------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±------+
| column2 | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
±--------±------------±-----±----±--------±------+
5 rows in set (0.00 sec)
或者
mysql> ALTER TABLE tb_dept1 ADD column3 INT(11) AFTER name ;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC tb_dept1;
±--------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±------+
| column2 | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
±--------±------------±-----±----±--------±------+
6 rows in set (0.00 sec)

4.3.5 删除字段
语法:
ALTER TABLE <表名> DROP <字段名>
例如:
mysql> ALTER TABLE tb_dept1 DROP column2;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC tb_dept1;
±--------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
±--------±------------±-----±----±--------±------+
5 rows in set (0.00 sec)

4.3.6 修改字段的排列位置
语法:
ALTER TABLE <表名> MODIFY <字段名> <数据类型> FIRST | AFTER <字段2>
例如:
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC tb_dept1;
±--------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±------+
| column1 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
±--------±------------±-----±----±--------±------+
5 rows in set (0.01 sec)
或者
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER loc;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC tb_dept1;
±--------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | YES | | NULL | |
±--------±------------±-----±----±--------±------+
5 rows in set (0.00 sec)

4.3.7 更改表的存储引擎
语法:
ALTER TABLE <表名> ENGINE=<更改后的存储引擎>
例如:
mysql> SHOW CREATE TABLE tb_deptment3\G
*************************** 1. row ***************************
Table: tb_deptment3
Create Table: CREATE TABLE tb_deptment3 (
id int(11) NOT NULL,
name varchar(22) DEFAULT NULL,
location varchar(50) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY STH (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> ALTER TABLE tb_deptment3 ENGINE=MyISAM;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> SHOW CREATE TABLE tb_deptment3\G
*************************** 1. row ***************************
Table: tb_deptment3
Create Table: CREATE TABLE tb_deptment3 (
id int(11) NOT NULL,
name varchar(22) DEFAULT NULL,
location varchar(50) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY STH (name)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

4.3.8 删除表的外键约束
语法:
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>
例如:
mysql> CREATE TABLE tb_emp9
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept1(id)
-> );
Query OK, 0 rows affected (0.04 sec)

mysql> SHOW CREATE TABLE tb_emp9\G
*************************** 1. row ***************************
Table: tb_emp9
Create Table: CREATE TABLE tb_emp9 (
id int(11) NOT NULL,
name varchar(25) DEFAULT NULL,
deptId int(11) DEFAULT NULL,
salary float DEFAULT NULL,
PRIMARY KEY (id),
KEY fk_emp_dept (deptId),
CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept1 (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> ALTER TABLE tb_emp9 DROP FOREIGN KEY fk_emp_dept;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> SHOW CREATE TABLE tb_emp9\G
*************************** 1. row ***************************
Table: tb_emp9
Create Table: CREATE TABLE tb_emp9 (
id int(11) NOT NULL,
name varchar(25) DEFAULT NULL,
deptId int(11) DEFAULT NULL,
salary float DEFAULT NULL,
PRIMARY KEY (id),
KEY fk_emp_dept (deptId)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

4.4 删除数据表
4.4.1 删除没有被关联的表
语法:
DROP TABLE [IF EXISTS]表1,表2…
例如:
mysql> DROP TABLE IF EXISTS tb_dept2;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW TABLES;
±---------------+
| Tables_in_test |
±---------------+
| tb_dept1 |
| tb_deptment3 |
| tb_emp1 |
| tb_emp2 |
| tb_emp3 |
| tb_emp4 |
| tb_emp5 |
| tb_emp7 |
| tb_emp8 |
| tb_emp9 |
±---------------+
10 rows in set (0.00 sec)

4.4.2删除被其他表关联的主表
先创建表tb_dept2
mysql> CREATE TABLE tb_dept2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22),
-> location VARCHAR(50)
-> );
Query OK, 0 rows affected (0.08 sec)

创建表tb_emp
mysql> CREATE TABLE tb_emp
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES tb_dept2(id)
-> );
Query OK, 0 rows affected (0.09 sec)

直接删除父表tb_dept2
mysql> DROP TABLE tb_dept2;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
可以看到在外键约束时,主表不能直接删除。

mysql> ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
解除关联子表tb_dept的外键约束

mysql> DROP TABLE tb_dept2;
Query OK, 0 rows affected (0.05 sec)
表就可以被删除

第五章 MySQL数据类型和运算符
5.1 MySQL数据类型介绍
一、数据类型简介
(1) 数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容
(2) 不同的数据类型也决定了 MySQL 在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算
(3) 数值数据类型:TINYINT 、SMALINT 、MEDIUMINT 、INT 、BIGINT 、FLOAT 、DOUBLE 、DECIMAL
(4) 日期/时间类型:YEAR 、TIME 、DATE 、DATETIME 、TIMESTAMP
(5) 字符串类型:CHAR 、VARCHAR 、BINARY 、VARBINARY 、BLOB 、TEXT 、ENUM 、SET

一、数值类型简介
(1) 数值类型主要用来存储数字,不同的数值类型提供不同的取值范围,可以存储的值范围越大,所需要的存储空间也越大
(2) 数值类型分为:①整数类型 ②浮点数类型 ③定点数类型

1、整数类型
类型名称 说明 存储需求 有符号的取值范围 无符号的取值范围
TINYINT 很小的整数 1个字节 -128 ~ 127 0 ~255
SMALLINT 小的整数 2个字节 -32768 ~ 32767 0 ~ 65535
MEDIUMINT 中等大小的整数 3个字节 -8388608 ~ 8388607 0 ~ 16777215
INT 普通大小的整数 4个字节 -2147483648 ~ 2147483647 0 ~ 4294967295
BIGINT 大整数 8个字节 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615

2、浮点数类型和定点数类型
(1) MySQL 中使用浮点数和定点数来表示小数,浮点数有两种类型:单精度浮点数(FLOAT)和双精度浮点数(DOUBLE),定点数只有 DECIMAL
(2) 浮点数和定点数都可以用 (M,N) 来表示,其中 M 是精度,表示总共的位数,N 是标度,表示小数的位数
(3) DECIMAL 实际是以字符串形式存放的,在对精度要求比较高的时候(如货币、科学数据等)使用 DECIMAL 类型会比较好
(4) 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围,它的缺点是会引起精度问题

类型名称 说明 存储需求 有符号的取值范围 无符号的取值范围
FLOAT 单精度浮点数 4个字节 -3.402823466EE+38 ~ -1.175494251E-38 0 和 1.175494351E-308 ~ 3.402823466EE+38
DOUBLE 双精度浮点数 8个字节 -1.7976931348623157E+308 ~ -2.2250738585072014E-308 0 和 2.2250738585072014E-308 ~ 1.7976931348623157E+308
DECIMAL 压缩的"严格"定点数 M+2个字节 不固定 不固定

MySQL 日期/时间类型
(1) MySQL 有多种表示日期的数据类型,比如,当只记录年信息的时候,可以使用 YEAR 类型,而没有必要使用 DATE 类型
(2) 每一个类型都有合法的取值范围,当指定确实不合法的值时系统将 “零” 值插入到数据库中

类型名称 日期格式 日期范围 存储需求
YEAR YYYY 1901 ~ 2155 1字节
TIME HH:MM:SS -838:59:59 ~ 838:59:59 3字节
DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-31 3字节
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC 4字节

1、YEAR
(1) 格式:以4位字符串格式表示的 YEAR ,范围为 ‘1901’ ~ ‘2155’
(2) 格式:以4位数字格式表示的 YEAR ,范围为 1901 ~ 2155
(3) 格式:以2位字符串格式表示的 YEAR ,范围为 ‘00’ ~ ‘99’ ,其中,‘00’ ~ ‘69’ 被转换为 2000 ~ 2069 ,‘70’ ~ ‘99’ 被转换为 1970 ~ 1999
(4) 格式:以2位数字格式表示的 YEAR ,范围为 1 ~ 99 ,其中,1 ~ 69 被转换为 2001 ~ 2069 ,70 ~ 99 被转换为 1970 ~ 1999

2、TIME
(1) TIME 类型的格式为 HH:MM:SS ,HH 表示小时,MM 表示分钟,SS 表示秒
(2) 格式:以 ‘HHMMSS’ 格式表示的 TIME ,例如 ‘101112’ 被理解为 10:11:12 ,但如果插入不合法的时间,如 ‘109712’ ,则被存储为 00:00:00
(3) 格式:以 ‘D HH:MM:SS’ 字符串格式表示的 TIME ,其中 D 表示日,可以取 0 ~ 34 之间的值,在插入数据库的时候 D 会被转换成小时,如 ‘2 10:10’ 在数据库中表示为 58:10:00 ,即 2x24+10 = 58

3、DATE
(1) DATE 类型的格式为 YYYY-MM-DD ,其中,YYYY 表示年,MM 表示月,DD 表示日
(2) 格式:‘YYYY-MM-DD’ 或 ‘YYYYMMDD’ ,取值范围为 ‘1000-01-01’ ~ ‘9999-12-3’
(3) 格式:‘YY-MM-DD’ 或 ‘YYMMDD’ ,这里 YY 表示两位的年值,范围为 ‘00’ ~ ‘99’ ,其中,‘00’ ~ ‘69’ 被转换为 2000 ~ 2069 ,‘70’ ~ ‘99’ 被转换为 1970 ~ 1999
(4) 格式:YY-MM-DD 或 YYMMDD ,数字格式表示的日期,其中 YY 范围为 00 ~ 99 ,其中,00 ~ 69 被转换为 2000 ~ 2069 ,70 ~ 99 被转换为 1970 ~ 1999

4、DATETIME
(1) DATETIME 类型的格式为 YYYY-MM-DD HH:MM:SS ,其中,YYYY 表示年,MM 表示月,DD 表示日,HH 表示小时,MM 表示分钟,SS 表示秒
(2) 格式:‘YYYY-MM-DD HH:MM:SS’ 或 ‘YYYYMMDDHHMMSS’ ,字符串格式,取值范围为 ‘1000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59’
(3) 格式:‘YY-MM-DD HH:MM:SS’ 或 ‘YYMMDDHHMMSS’ ,字符串格式,其中 YY 范围为 ‘00’ ~ ‘99’ ,其中,‘00’ ~ ‘69’ 被转换为 2000 ~ 2069 ,‘70’ ~ ‘99’ 被转换为 1970 ~ 1999
(4) 格式:YYYYMMDDHHMMSS 或 YYMMDDHHMMSS ,数字格式,取值范围同上

5、TIMESTAMP
(1) TIMESTAMP 类型的格式为 YYYY-MM-DD HH:MM:SS,显示宽度固定在19个字符
(2) TIMESTAMP 与 DATETIME 的区别在于,TIMESTAMP 的取值范围小于 DATETIME 的取值范围
(3) TIMESTAMP 的取值范围为 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC ,其中 UTC 是世界标准时间,存储时会对当前时区进行转换,检索时再转换回当前时区

二、字符串类型
(1) 字符串类型用来存储字符串数据,还可以存储比如图片和声音的二进制数据
(2) MySQL 支持两种字符串类型:文本字符串和二进制字符串
文本字符串类型 说明 存储需求
CHAR(M) 固定长度的文本字符串 M 字节,1 <= M <= 255
VARCHAR(M) 可变长度的文本字符串 L+1 字节,在此 L <= M 和 1 <= M <= 255
TINYTEXT 非常小的文本字符串 L+1 字节,在此 L < 2^8
TEXT 小的文本字符串 L+2 字节,在此 L < 2^16
MEDIUMTEXT 中等大小的文本字符串 L+3 字节,在此 L < 2^24
LONGTEXT 大的文本字符串 L+4 字节,在此 L < 2^32
ENUM 枚举类型,只能有一个枚举字符串值 1 或 2 个字节,取决于枚举值的数目(最大值 65535)
SET 一个设置,字符串对象可以有零个或多个SET成员 1, 2, 3, 4 或 8 个字节,取决于集合成员的数量(最多64个成员)
二进制字符串类型 说明 存储需求
BIT(M) 位字段类型 大约(M+7)/8 个字节
BINARY(M) 固定长度的二进制字符串 M个字节
VARBINARY(M) 可变长度的二进制字符串 M+1个字节
TINYBLOB(M) 非常小的BLOB L+1 字节,在此 L < 2^8
BLOB(M) 小的BLOB L+2 字节,在此 L < 2^16
MEIDUMBLOB(M) 中等大小的BLOB L+3 字节,在此 L < 2^24
LONGBLOB(M) 非常大的BLOB L+4 字节,在此 L < 2^32

1、CHAR 和 VARCHAR
(1) CHAR(M) 为固定长度的字符串,在定义时指定字符串列长,当保存时在右侧填充空格以达到指定的长度,M 表示列长度,取值范围是 0~255 个字符,例如,CHAR(4) 定义了一个固定长度的字符串列,其包含的字符个数最大为 4,当检索到 CHAR 值时,尾部的空格将被删掉
(2) VARCHAR(M) 为可变长度的字符串,M 表示最大列长度,取值范围是 0~65535 ,VARCHAR 的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加一(一个字符串结束符)
插入值 CHAR(4) 存储需求 VARCHAR(4) 存储需求
‘’ ’ ’ 4个字节 ’ 1个字节
‘ab’ 'ab ’ 4个字节 ‘ab’ 3个字节
‘abc’ ‘abc’ 4个字节 ‘abc’ 4个字节
‘abcd’ ‘abcd’ 4个字节 ‘abcd’ 5个字节
‘abcde’ ‘abcd’ 4个字节 ‘abcd’ 5个字节

2、TEXT
(1) TINYTEXT 最大长度为 255 个字符
(2) TEXT 最大长度为 65536 个字符
(3) MEDIUMTEXT 最大长度为 16777215 个字符
(4) LONGTEXT 最大长度为 4294967295 个字符

3、ENUM
(1) 在基本的数据类型中,无外乎就是些数字和字符,但是某些事物是较难用数字和字符来准确地表示的。比如一周有七天,分别是Sunday、Monday、Tuesday、Wednesday、Thursday、Friday 和 Saturday。如果我们用整数 0、1、2、3、4、5、6 来表示这七天,那么多下来的那些整数该怎么办?而且这样的设置很容易让数据出错,即取值超出范围。我们能否自创一个数据类型,而数据的取值范围就是这七天呢?因此有了 ENUM 类型(Enumeration,枚举),它允许用户自己来定义一种数据类型,并且列出该数据类型的取值范围。ENUM 是一个字符串对象,其值为表创建时在列规定中枚举(即列举)的一列值,语法格式为:字段名 ENUM (‘值1’, ‘值2’, … ‘值n’) 字段名指将要定义的字段,值 n 指枚举列表中的第 n 个值,ENUM类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个。如果创建的成员中有空格时,其尾部的空格将自动删除。ENUM 值在内部用整数表示,每个枚举值均有一个索引值:列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号。枚举最多可以有 65535 个元素。
mysql> CREATE TABLE tmp10
-> (
-> soc INT,
-> level ENUM(‘excellent’, ‘good’, ‘bad’) # 自定义枚举值
-> );
mysql> INSERT INTO tmp10 values (70,‘good’), (90,1), (75,2), (50,3) ; # 插入数据,后面三个是根据索引来插入的
mysql> INSERT INTO tmp10 values (100,‘best’) ; # 如果插入一个没有定义过的枚举值’best’会报错
ERROR 1265 (01000): Data truncated for column ‘level’ at row 1
mysql> SELECT * FROM tmp10;
±-----±----------+
| soc | level |
±-----±----------+
| 70 | good |
| 90 | excellent |
| 75 | good |
| 50 | bad |
±-----±----------+

4、SET
(1) SET 是一个字符串对象,可以有零个或多个值,SET 列最多可以有 64 个成员,其值为表创建时规定的一列值,语法:SET(‘值1’,‘值2’,… ‘值n’)
(2) 与 ENUM 类型相同,SET 值在内部用整数表示,列表中每一个值都有一个索引编号
(3) 与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合
(4) 如果插入 SET 字段中列值有重复,则 MySQL 自动删除重复的值,插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示
mysql> CREATE TABLE tmp11 ( s SET(‘a’, ‘b’, ‘c’, ‘d’) ); # 自定义SET字段的值
mysql> INSERT INTO tmp11 values (‘a’), (‘a,b,a’), (‘c,a,d’) ; # 只能插入自定义的SET字段的值
mysql> INSERT INTO tmp11 values (‘a,x,b,y’); # 如果插入的不是自定义的值会报错
ERROR 1265 (01000): Data truncated for column ‘s’ at row 1
mysql> SELECT * FROM tmp11;
±------+
| s |
±------+
| a |
| a,b |
| a,c,d |
±------+

5、BIT
(1) BIT 数据类型用来保存位字段值,即以二进制的形式来保存数据,如保存数据 13,则实际保存的是 13 的二进制值,即 1101
(2) BIT 是位字段类型,BIT(M) 中的 M 表示每个值的位数,范围为 1~64 ,如果 M 被省略,则默认为 1 ,如果为 BIT(M) 列分配的值的长度小于 M 位,则在值得左边用 0 填充
(3) 如果需要位数至少为 4 位的 BIT 类型,即可定义为 BIT(4) ,则大于 1111 的数据是不能被插入的

mysql> CREATE TABLE tmp12( b BIT(4) ) ;
mysql> INSERT INTO tmp12 VALUES (2), (9), (15) ;
mysql> SELECT BIN(b+0) FROM tmp12;
±---------+
| BIN(b+0) |
±---------+
| 10 |
| 1001 |
| 1111 |
±---------+

6、BINARY 和 VARBINARY
(1) BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字节字符串
(2) BINARY 类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充 ‘\0’ 以补齐指定长度
(3) VARBINARY 类型的长度是可变的,指定长度之后,其长度可以在 0 到最大值之间

mysql> CREATE TABLE tmp13
-> (
-> b BINARY(3), # 定义固定长度为3的BINARY类型
-> vb VARBINARY(30) # 定义可变长度为30的VARBINARY类型
-> );
mysql> INSERT INTO tmp13 VALUES(5,5);
mysql> SELECT * FROM tmp13;
±-----±-----+
| b | vb |
±-----±-----+
| 5 | 5 |
±-----±-----+
mysql> SELECT length(b), length(vb) FROM tmp13;
±----------±-----------+
| length(b) | length(vb) |
±----------±-----------+ # BINARY占用的空间为固定的指定的值
| 3 | 1 | # VARBINARY占用的空间为可变的插入的值
±----------±-----------+

7、BLOB
(1) BLOB 用来存储可变数量的二进制字符串,分为 TINYBLOB 、BLOB 、MEDIUMBLOB 、LONGBLOB 四种类型
(2) BLOB 存储的是二进制字符串,TEXT 存储的是文本字符串
(3) BLOB 没有字符集,并且排序和比较基于列值字节的数值;TEXT 有一个字符集,并且根据字符集对值进行排序和比较
数据类型 存储范围
TINYBLOB 最大长度为255
BLOB 最大长度为65535
MEDIUMBLOB 最大长度为16777215
LONGBLOB 最大长度为4294967295

三、运算符介绍
1、MySQL算术运算符
(1) + :加法运算
(2) - :减法运算
(3) * :乘法运算
(4) / :除法运算,返回商
(5) % :求余运算,返回余数

mysql> CREATE TABLE tmp14 ( num INT ) ;
mysql> INSERT INTO tmp14 VALUE(64);
mysql> SELECT num, num+10, num-3, num3, num/3, num%3 FROM tmp14;
±-----±-------±------±------±--------±------+
| num | num+10 | num-3 | num
3 | num/3 | num%3 |
±-----±-------±------±------±--------±------+
| 64 | 74 | 61 | 192 |

你可能感兴趣的:(mysql)