1、创建数据库
创建数据库是在系统磁盘上划分一块区域用于数据的存储和管理
mysql安装完成以后,将会在其data目录下自动创建几个必须的数据库,可以使用 show databases语句查看。
通过执行show databases 可以看到 mysql 安装自带的数据库是:information_schema、mysql、performance_schema、sakila、test、word,其中mysql是必须的,此数据库描述了用户的访问权限。
创建mysql数据库的语法格式是: create database database_name,其中database_name是数据库名称。数据库创建完成以后可以执行 show create database 查看数据库的定义。
创建数据库:create database database_name
查看数据库:show create databases
查看数据库的定义:show create database database_name
以上不在举例
2、删除数据库
删除数据库是将已存在的数据库从磁盘空间上清除,清除之后,数据库中所有的数据也将一同被删除。
mysql中删除数据库的语法是:drop database database_name,其中database_name 为数据库名称,若要删除的数据库不存在,则删除出错。是否删除成功可执行 show databases查看。
提示:使用 drop database命令要非常的谨慎,因为执行此命令时,mysql不会给出任何的提醒确认信息,执行命令后,数据库中存储的所有数据表和数据将一同被删除,且不可恢复。
3、数据库的储存引擎
数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。MySQL提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在mysql中,同一个服务器中可以针对具体的要求对每一张库表使用不同的存储引擎。
MySQL 5.7 支持存储引擎:InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、Blackhole等。
可以使用 show engines 命令查看系统所支持的存储引擎。
我通过navicat工具执行 show engines命令,结果如下图:
其中support列的值:YES表示此引擎可以使用,NO表示不可以被使用,default表示该引擎是当前默认存储引擎。
简述InnoDB和MyISAM存储引擎:
InnoDB引擎
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,MySQL 5.5.5版本之后,InnoDB作为默认的存储引擎,InnoDB的主要特性有:
MyISAM引擎
MyISAM基于ISAM的存储引擎,并对其进行扩展。它是在web、数据存储和其他应用环境下最常用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。在MySQL5.5.5之前的版本中,MyISAM是默认的存储引擎。MyISAM主要特性有:
使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表的名字开始,扩展名指出文件类型:frm存储表定义,数据文件的扩展名为.MYD(MYData),索引文件的扩展名是.MYI(MYIndex)。
存储引擎的选择
不同的存储引擎都有各自的特点,以适应不同的需求,下面是每种引擎可以提供的功能:
功能 | InnoDB | MyISAM | Memory | Archive |
存储限制 | 64TB | 256TB | RAM | None |
支持事务 | YES | NO | NO | NO |
支持全文索引 | NO | YES | NO | NO |
支持数索引 | YES | YES | YES | NO |
支持哈希索引 | NO | NO | YES | NO |
支持数据缓存 | NO | N/A | YES | NO |
支持外键 | YES | NO | NO | NO |
一、创建数据表
二、查看数据表结构
三、修改表结构
四、删除数据表
一、创建数据表
1.1、表的创建:
数据表属于数据库,建表之前,应使用 use database_name 选择将要建表的数据库。
建表语法格式:
create table <表名>(
字段名1,数据类型 [列级别的约束条件] [默认值],
字段名2,数据类型 [列级别的约束条件] [默认值],
......
[表级别的约束条件]
)
使用create table 创建表时,要注意:
命令查看数据库中所有的表: show tables
1.2、主键约束
主键又称主码,是表中一列或多列的组合。主键约束(primary key)要求主键列的数据唯一且不允许为空。主键能够唯一地标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询速度。主键分为两种类型:单字段主键和多字段联合主键。
单字段主键:由一个字段组成
语法格式:1、 字段名 数据类型 primary key [默认值] 2、[constraint<约束名>] primary key [字段名]
示例:id为主键
//单主键 格式1
create table user(
id int(11) primary key,
name varchar(20),
phone varchar(11)
)
//单主键格式2
create table student(
id int(11),
name varchar(20),
phone varchar(11),
primary key(id)
)
多字段联合主键:由多个字段组成
格式:primary key [字段1,字段2,...,字段n]
示例:name和phone作为联合主键
create table test(
name varchar(20),
phone varchar(11),
address varchar(50),
primary key(name,phone)
)
1.3、外键约束
外键释义:
语法格式:
constraint 外键名 foreign key (字段名) references 主表名(主键列名)
语法释义:
实例:
a表中字段b_id作为外键关联b表中的主键id,外键名是fk_a_b,
CREATE TABLE `a` (
`id` int(10) NOT NULL,
`name` varchar(20) NOT NULL,
`b_id` int(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_a_b` (`b_id`),
CONSTRAINT `fk_a_b` FOREIGN KEY (`b_id`) REFERENCES `b` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `b` (
`id` int(10) NOT NULL,
`name` varchar(20) NOT NULL,
`address` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
提示:
1.4非空约束
非空约束指字段的值不能为空,对于非空约束的字段,在添加数据没有指定值,数据库则会报错。
语法格式:
字段名 数据类型 not null
实例:
创建test表,并指定name字段不能为空
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
1.5 唯一性约束
唯一性约束要求该列唯一,允许为空,但是只能出现一个空值。唯一约束可以确保一列或者多列不出现重复值
语法格式:
字段名 数据类型 unique 定义完列直接指定唯一约束
constraint 约束名 unique(字段名) 定义完所有列之后指定唯一约束(可以多字段使用唯一性约束,这样多字段确定一条数据,即唯一)
实例:
//指定完列直接使用唯一约束 UNIQUE
create table test1(
id int(11) PRIMARY key,
name varchar(20) UNIQUE
)
//指定完所有列再使用唯一约束 约束名为aa
create table test2(
id int(11) PRIMARY key,
address varchar(20),
CONSTRAINT aa UNIQUE(address)
)
//指定完所有列可以给多字段使用唯一约束 下面 约束名为cc 则 test3表中name+phone 唯一
create table test3(
id int(11) PRIMARY key,
name varchar(20) NOT NULL,
phone VARCHAR(20) NOT null ,
CONSTRAINT cc UNIQUE(`name`,`phone`)
)
UNIQUE与PRIMARY KEY的区别:
1.6 默认约束
默认约束指定某列的默认值。
语法格式:
字段名 数据类型 default 默认值
实例:
address默认值为null,remark的默认值是‘1111’
create table test2(
id int(11) PRIMARY key,
address varchar(20) default null,
remark varchar(20) default '1111'
)
1.7 主键自增
主键自增:
语法格式:
字段名 数据类型 auto_increment
实例:
create table exp(
id BIGINT(20) PRIMARY KEY auto_increment,
name VARCHAR(50) DEFAULT NULL
)
设置id为主键的时候执行insert插入操作时不用管id字段
1.1查看表结构
语法格式:desc 表名 或者 describe 表名
1.2查看表的详细结构
语法格式: show create table 表名
1.1实例:
desc test3
释义:
1.2 实例:
show create table test3
释义:简单的说就是得到的是得到的建表语句,初次之外就是库表的存储引擎和编码格式
修改表是指修改已存在数据表的结构,MySQL使用alter table 语句修改表。
常用修改表的操作:
1.1修改表名
语法格式: alter table 旧表名 rename to 新表名
实例:将test3表名更改为test表名 >> alter table test3 rename to test
1.2 修改字段名
语法格式: alter table 表名 change 旧字段名 新字段名 新数据类型
实例:表test3,表结构如下图
将name字段修改为address 类型是字符串
alter table test3 change name address varchar(50)
结果:
将test3的phone字段的数据类型由varchar(20)修改为int(11)
alter table test3 change phone phone int(11)
备注: change 不仅可以修改字段名也可以只修改字段类型,实现和modify同样的效果。
1.3修改字段类型
语法格式:alter table 表名 modify 字段名 数据类型
或 alter table 表名 change 字段名a 字段名a 数据类型 change上述已经陈述过了
将test3表中的phone字段的数据类型由int(11)更改为varchar(11)
alter table test3 modify phone varchar(11)
change和modify的区别:
1.4 增加字段
语法格式:alter table 表名 add 新字段名 数据类型 [约束条件] [first | after 已存在字段]
括号内为可选参数
实例:给test3表添加一个新字段name, 数据类型varchar(20),在phone字段后面
alter table test3 add name varchar(20) after phone
在test3的第一列添加 email字段,数据类型varchar(30),唯一约束
alter table test3 add email varchar(30) unique first
1.5删除字段
语法格式: alter table 表名 drop 字段名
将test3中的email字段删除
alter table test3 drop email
1.6 修改字段的位置
语法格式: alter table 表名 modify 字段名 数据类型 [first | after 已存在字段]
实例:将test3中的name字段放置id后面
alter table test3 modify name varchar(20) after id
1.7 修改存储引擎
语法格式: alter table 表名 engine=<新的存储引擎>
用show create table test3查看test3的存储引擎,将InnoDB改为MyISAM
alter table test engine=MyISAM
1.8 外键的删除
语法格式:alter table 表名 drop foreign key 外键名称
删除数据表就是将数据库中已存在的表从数据库中删除。
表的删除主要分为两种情况:
第一种:没有被其他的表关联
第二种:有被其他的表关联
第一种 没有被其他的表关联:
语法格式:drop table [if exists] 表1,...表n;
第二种删除被关联的表
数据表如果存在关联的情况下,若直接删除父表,结果会显示失败。原因是直接删除,将破坏表的参照完整性,若果必须删除,可以先删除与其关联的子表,再删除父表,只是这样同时删除了两个表中的数据。但有的情况写可能要保留子表,这事如要单独删除父表,只需将关联的表的外键条件取消,然后就可以删除父表。
语法格式:先删除外键约束 alter table 表名 drop foreign key 外键名称
再删除父表 drop table 表名
实例:
tb_dept的主键id被tb_emp的dept_id字段所关联,所以tb_dept是父表,tb_emp是从表。
删除父表的的思想:
先删除从表tb_emp的外键约束: alter table tb_emp drop foreign key fk_name
然后再删除主表: drop table tb_dept
删除外键约束的tb_emp表对象信息:
这样在执行删除父表的命令就不会报错误信息。
数据类型的介绍:
整数类型
数据型数据类型主要用来存储数字,MySQL提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大。MySQL主要提供的整数类型有:tinyint、smallint、mediumint、int、bigint。整数类型的属性字段可以添加auto_increment自增约束条件。
下图展示MySQL中的整数型的数据类型及取值范围
类型名称 | 说明 | 存储需求 | 有符号 | 无符号 |
TINYINT | 很小的整数 | 1个字节 | -128~127 | 0~255 |
SMALLINT | 小的整数 | 2个字节 | -32768~32767 | 0~65535 |
MEDIUMINT | 中等大小的整数 | 3个字节 | -8388608~8388607 | 0~16777215 |
INT(INTEGER) | 普通大小的整数 | 4个字节 | -2147483648~2147483647 | 0~4294967295 |
BIGINT | 大整数 | 8个字节 | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 |
实例:定义一个字段 tinyint(4)
该声明指明,在year字段中的数据一般只显示4位数字的宽度。
注意:4指的是显示的宽度,与数据类型的取值范围无关。显示宽度只是指明MySQL最大可能显示的数字个数,数值的位数小于指定的宽度时会有空格填充;若大于指定宽度的值,只要不超过数据类型的取值范围也可以存储,而且也能够显示出来。
如果定义字段不指定整型数据类型所显示的宽度,则系统会为每一种类型指定默认的宽度。
实例展示:创建test5时,未指定字段类型的宽度,用desc 查看显示系统为每种类型加上了默认的显示宽度
上图可以看出,系统将添加不同的默认显示宽度。这些显示宽度能够保证显示每一种数据类型可以取到取值范围内的所有值。
例如: TINYINT有符号和无符号的取值范围是 -128~127和0~255,由于负号占了一个数字位,因此TINYINT默认显示的宽度时4.同理其他整数类型的默认显示宽度与其有符号数的最小值的宽度相同。
不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此,应该根据实际需要选择最合适的类型,这样有利于提高查询效率和节省存储空间。
浮点数类型和定点数类型
MySQL用浮点数和定点数来表示小数。
浮点类型有两种:单精度浮点类型 FLOAT 和双精度浮点类型 DOUBLE。
定点类型只有一种:DECIMAL 。
浮点类型和定点类型都可以用(M,N)来表示,其中M称为精度,表示总共的位数;N表示小数的位数。
类型名称 | 说明 | 存储需求 |
FLOAT | 单精度浮点数 | 4个字节 |
DOUBLE | 双精度浮点数 | 8个字节 |
DECIMAL(M,D) | 压缩的“严格”定点数 | M+2 个字节 |
不论是浮点类型还是定点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。
例如: 定义 字段 X float(5,1) 说明 X字段总长度5,有以为小数的 浮点类型数据
现在 给 字段 X赋值5.12后,最终结果是5.1 四舍五入
日期与时间类型
MySQL中表示日期的数据类型主要有:DATETIME、DATE、TIMESTAMP、TIME、YEAR。
类型名称 | 日期格式 | 日期范围 | 存储需求 |
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-3 | 3个字节 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8个字节 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 4个字节 |
YEAR类型
year可以使用格式指定值
TIME类型
TIME类型用于只需要时间信息的值,格式为HH:MM:SS,HH表示小时,MM表示分钟,SS表示秒。TIME类型的取值范围是-838:59:59 ~ 838:59:59.小时部分如此大的原因是TIME类型不仅可以用于表示一天的时间(必须大于24小时),还可能是某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时或者甚至为负)。
可以使用各种格式指定TIME的值:
提示:为TIME列分配简写值时应注意:如果没有冒号,MySQL解释值时,假定最右边的两位表示秒。(MySQL解释TIME值为过去的时间而不是当天的时间)。例如,读者可能认为 ' 1112 '或者1112表示11:12:00(即11点12分),但是MySQL将他们解释为 00:11:12(即11分12秒)。同样 ' 12 ' 或者 12 被解释为 00:11:12。相反,TIME值中如果使用冒号则肯定被看作当天的时间。也就是说,' 11:12 ' 表示 11:12:00,而不是 00:11:12 。
实例:
字段及类型 | 插入的值 | 结果 |
date TIME | '10:05:05' | 10:05:05 |
date TIME | '23:23' | 23:23:00 |
date TIME | '2 10:10' | 58:10:00 |
date TIME | '10' | 00:00:10 |
date TIME | '101112 ' | 10:11:12 |
date TIME | '101113' | 10:11:13 |
如果插入 107010,MySQL会报错误信息,因为其中有一个不合法的分钟。
插入系统当前时间: CURRENT_TIME、NOW()
DATE类型
DATE类型用在仅需要日期值时,没有时间部分。格式为 'YYYY-MM-DD',其中YYYY表示年,MM表示月,DD表示日。在给DATE类型字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATE的日期格式即可。
可以用一下格式给DATE赋值:
提示:MySQL允许 不严格 语法:任何标点符号都可以用作日期部分之间的间隔符。例如,'98-11-31'、'98.11.31'、'98/11/31'是等价的。这些值也可以正确地插入到数据库。
DATETIME类型
DATATIME 包含日期和时间信息的值,格式: YYYY-MM-DD HH:MM:SS ,分别表示年月日时分秒。在给DATETIME类型字段赋值时,可以用字符串或数字类型的数据插入,只要符合DATETIME的格式即可。
提示:MySQL也允许不严格的语法,雷同DATE。
TIMESTAMP类型
TIMESTAMP显示的格式与DATETIME相同,取值范围为 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07,其中 UTC为世界标准时间,因此在对此类型字段插入值时要保证在合法的取值范围内。
TIMESTAMP典型实例:创建表test 字段id,date
create table test(
id int(11) primary key,
date TIMESTAMP
)
执行上述建表语句后,查看表的对象信息
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
关注这句 `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,后面加粗部分是自动生成的, 然后就是default current_timestamp 看着有点不合适,不过重点是红色部分:ON UPDATE CURRENT_TIMESTAMP,这部分的作用就是当此表某行某一字段值发生变化时,此日期会自动更新为系统当前时间。
当然这个也可以去掉:
勾掉即可取消
然后就是说下timestamp时区的问题,UTC为世界标准时间,我们一般所在时区为东8区。
实例 在test 插入一条数据:
执行 select * from test 结果如下:
这个是东8区显示的时间格式,现在执行 set time_zone='+10:00',将东8区改成东10区,在执行查询语句,结果是:
东10区比东8快了两个小时......。请结合地理知识自嗨下吧
字符串类型
字符串类型不仅可以存储字符串数据,还可以存储其他数据(例如图片和声音的二进制数据)。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 | 一个设置,字符串对象可以有零个或多个SER成员 | 1、2、3、4或8个字节,取决于集合成员的数量(最多64个成员) |
CHAR类型
CHAR(M)是固定长度的非二进制字符串,在定义时指定字符串列长,M表示列长度,M的范围:0~255个字符。当保存时在右侧填充空格以达到指定的长度,当检索到char值时,尾部的空格将被删除掉。
VARCHAR类型
VARCHAR(M)是长度可变的字符串,M表示最大列长度,M的范围是 0~65535。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加1。VARCHAR在值保存和检索时尾部的空格仍保留(char在值保存时右边保留空格,检索时右边空格被自动删除)
TEXT类型
TEXT列保存非二进制字符串,如文章内容、评论等。当保存或查询TEXT列的值时,不删除尾部的空格。
TEXT分为44四类:
ENUM类型
ENUM是一个字符串对象,其值为表创建时在列规定中枚举的一列值。
语法格式: 字段名称 ENUM('值1','值2',...'值n')
释义:字段名称指将要定义的字段,值n指枚举列表中的第n个值。
实例一:
定义ENUM类型的列('first','second','third'),该列可以取得值和每个值的索引如下图所示
值 | 索引 |
NULL | NULL |
'' | 0 |
first | 1 |
second | 2 |
third | 3 |
ENUM值依照列索引顺序排列,并且空字符串排在非空字符串前,NULL值排在其他所有的枚举值前。
实例二:
该实例查看列成员的索引值。
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` enum('first','second','third') ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
insert into test values(null,'second');
insert into test values(null,'first');
insert into test values(null,'third');
insert into test values(null,null);
SELECT name,name+0 from test;
从上述例子可以得出:索引值得顺序(大小)是跟声明枚举值得顺序有关,跟插入值得顺序无关。
提示:ENUM列总有一个默认值。如果将ENUM列声明为NULL,NULL值则作为该列的一个有效值,并且默认值为NULL。如果ENUM列被声明为NOT NULL,其默认值为允许的值列表的第一个元素。
实例三:
声明枚举值,插入值和索引效果一样。
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` enum('first','second','third') ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
insert into test values(null,1);
insert into test values(null,'second');
insert into test values(null,3);
insert into test values(null,2);
SELECT name,name+0 from test;
实例四:
不在枚举值范围的值,插入报错。
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` enum('first','second','third') ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
insert into test values(null,5);
执行报出的错误信息:
[SQL]insert into test values(null,5);
[Err] 1265 - Data truncated for column 'name' at row 1
insert into test values(null,'aaa');
执行报出的错误信息:
[SQL]insert into test values(null,5);
[Err] 1265 - Data truncated for column 'name' at row 1
不能插入不在枚举范围内的值或索引值
SET类型
SET是一个字符串对象,可以有零或多个值,SET列最多可以有64个成员,其值为表创建时规定的一列值,指定包括多个SET成员的SET列值时,各成员之间用逗号(,)间隔开。
语法格式:SET('值1','值2',...'值n')
SET与ENUM类型相同,SET值在内部用整数表示,列表中每一个值都有一个索引编号。当创建表时,SET成员值得尾部空格将自动被删除。但与ENUM类型不同的是,ENUM类型的字段只能从定义的列值中选择一个插入,而SET类型的列可从定义的列值中选择多个字符的联合。
实例:
drop table if EXISTS test;
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` set('a','b','c','d') ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
insert into test values(null,'a');
insert into test values(null,'a,b,a');
insert into test values(null,'c,a,d');
insert into test values(null,'a,x,d');
//最后一个插入报出警告
[SQL]
insert into test values(null,'a,x,d');
[Err] 1265 - Data truncated for column 'name' at row 1
select * from test;
结果:
二进制字符串类型
MySQL中的二进制数据类型有:
类型名称 | 说明 | 存储需求 |
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 |
MEDIUMBLOB(M) | 中等大小的BLOB | L+3 字节,在此L<2^24 |
LONGBLOB(M) | 非常大的的BLOB | L+4字节,在此L<2^32 |
二进制因为不熟悉,暂时不列举实例 ^_^
运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算,远算符是告诉MySQL执行特定算术或逻辑操作的符号。运用运算符可以更加灵活地使用表中的数据。
常见的运算符类型有:算术运算符、比较运算符、逻辑运算符、位运算符。
算术运算符
MySQL中的算术运算符
运算符 | 作用 | 简单实例 |
+ | 加法运算 | 字段名称 + n |
- | 减法运算 | 字段名称 - n |
* | 乘法运算 | 字段名称 * n |
/ | 除法运算,返回商 | 字段名称 / n |
% | 求余运算,返回余数 | 字段名称 % n |
提示:
比较运算符
一个比较运算符的结果是1、0或者是NULL,比较运算符经常在SELECT的查询条件子句中使用。
MySQL中的比较运算符
运算符 | 作用 |
= | 等于 |
<=> | 安全的等于 |
<>(!=) | 不等于 |
<= | 小于等于 |
>= | 大于等于 |
< | 小于 |
> | 大于 |
IS NULL | 判断一个值是否为NULL |
IS NOT NULL | 判断一个值是否不为NULL |
LEAST | 在有两个或多个参数时,返回最小值 |
GREATEST | 在有两个或多个参数,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
ISNULL | 与ISNULL作用一样 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
简单的比较运算符跳过不举实例了,找一些常用或不常见的举些实例
等于运算符(=)
等号运算符用来判断数字、字符串和表达式是否相等。如果相等返回1否则返回0。
讲述下比较规则:
安全等于运算符(<=>)
这个操作符和 = 操作符 执行 相同的比较操作,不过<=>可以用来判断NULL值。在两个参数均为NULL时,其返回值为 1 而不为NULL;而当一个操作数为NULL时,其返回值为0而不为NULL。
实例:
不等于运算符(<> 或 !=)(常用)
'<>' 或 '!=' 用于判断数字、字符串、表达式不相等的判断。如果不等,返回1,否则返回0。不等于运算符不能用于判断空值NULL
IS NULL(ISNULL),IS NOT NULL 运算符(常用)
IS NULL(ISNULL)是检验一个值是否为NULL,若为NULL,返回值为1,否则返回值为 0。
IS NOT NULL 是检验一个值是否为非NULL,若是非NULL,返回值为1,否则返回值为 0 。
BETWEEN AND运算符(常用)
语法格式: str between min and max
若str大于等于min且小于等于max,则BETWEEN的返回值为1,否则返回值 0。 其实此运算符多用于 条件语句中
LEAST运算符
语法格式: LEAST(值1,值2,....,值n)
其中值n表示参数列表中的有n个值。作用是:在有两个或多个参数的情况下,返回最小值。假如任意一个自变量为NULL,则LEAST()的返回值为NULL。
GREATEST
语法格式:GREATEST(值1,值2,....,值n)
其中n 表示参数列表有n个值。当有两个或多个参数时,返回值为最大值。假如任意一个自变量为NULL,则GREATEST()的返回值为NULL。
IN 、NOT IN 运算符(常用)
多运用与 子查询中,不多陈述。
LIKE运算符(常用)
LIKE运算符用来匹配字符串,语法格式: str like 匹配条件。
若str有满足匹配条件的,则返回值为 1 (true),反之返回 0(false)。
若str或匹配条件中,任意一个为NULL,则结果为NULL。
匹配条件中用到以下两种通配符:
实例:
REGEXP运算符
regexp运算符用来匹配字符串,语法格式: str regexp 匹配条件 。
若str满足匹配条件,返回 1(true),否则返回 0(false) 。
若str或匹配条件任意一个为NULL,则结果为NULL。
REGEXP运算符在进行匹配时,常用的有下面几种通配符:
实例:
正则表达式是一个可以进行复杂查询的强大工具,相对于LIKE,字符串匹配。他可以使用更多的通配符类型,查询结果更加灵活。
逻辑运算符
在MySQL中,所有逻辑运算符的求值所得结果均为TRUE、FALSE、NULL。
MySQL中的逻辑运算符
运算符 | 作用 |
NOT 或者 ! | 逻辑非 |
AND 或者 && | 逻辑与 |
OR 或者 || | 逻辑或 |
XOR | 逻辑异或 |
NOT 或者 !
逻辑非运算符NOT或者!表示:
简单理解:NOT 或 ! 后跟的字符串或者表达式 为0时,返回 1;为非零值时,返回 0;为NULL时,返回 NULL 。
实例:
前四对可知NOT和 ! 的返回值都相同,唯独最后一个 NOT 1+1 和 !1+1 的值不同。。。这是因为牵扯的运算符的优先级问题
NOT的优先级低于 + 号,所以先计算+ 在执行 NOT, 所以 NOT 1+1 = NOT 2 = 0;
!的优先级大于+号,所先执行!1,在执行+1,所以 !1+1 = 0+1=1 。
所以使用运算符时,在不清楚运算符的情况下,最好使用(),以保证运算结果的正确。
AND 或者 &&
逻辑与运算符AND或者&&表示:
实例:
有上图可知AND和&&的作用相同, 其实按照上述1、2、3一一对应就可以得到结果。
注意:AND运算符可以有多个操作数,当多个操作数运算时,AND两边一定要使用空格隔开,不然会影响结果的正确性。
OR 或者 ||
逻辑或运算符OR或者||表示:
实例:
XOR
逻辑异或运算符XOR:
实例:
提示: a XOR b 的计算等同于(a AND(NOT b))或者((NOT a)AND b)
位运算符
位运算符时是用来对二进制字节中的位进行测试、位移或者测试处理。
MySQL中的位运算符
运算符 | 作用 |
| | 位或 |
& | 位与 |
^ | 位异或 |
<< | 位左移 |
>> | 位右移 |
~ | 位取反,反转所有比特 |
位或运算符(|)
位或运算的实质是将参与运算的几个数据,按对应的二进制数逐位进行逻辑或运算。对应的二进制位有一个或两个为 1,则运算结果为1,否则为 0。
实例:
其实 位或(|)运算需要先学会 逻辑或(OR 或 ||)运算。
实例解析:9的二进制数值为1001,4的二进制数值为0100,2的二进制数值为0010.
先 1001与0100进行按位逻辑或运算得到二进制1101
在 用 二进制1101与0010进行逻辑或运算得到二进制1111
而 1111二进制转换十进制就是15
位与运算符(&)
位与运算的实质是将参与运算的几个操作数,按对应的二进制数逐位进行逻辑与运算。对应的二进制位都为1,则该位的运算结果为1,否则为0 。
位异或运算符(^)
位异或运算的实质是将参与运算的两个参数,按对应的二进制数逐位进行逻辑异或运算。对应位的二进制数不同时,对应位的结果为1,如果两个对应位数都为0或者都为1,咋对应位的结果为0 。
位左移运算符(<<)
位左移运算符<<使指定的二进制的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用0补齐。
语法格式: str << n 释义 str的二进制数值 左移 n 位
实例: 4 << 2
位右移运算符(>>)
位右移运算符>>使指定的二进制值得所有位都右移指定的位数。右移指定位数之后,右边低位的数值将被移出并丢弃,左边高位空出的位置用0补齐。
语法格式: str >> n 释义: str的二进制右移n位
实例: 16 >> 2
位取反运算符(~)
位取反运算的实质是将参数,按二进制数逐位反转。即二进制按位是1的变0,是0的变1。
实例: 1取反 ~1
来一张运算符的优先级图
优先级 | 运算符 |
最低 | =(赋值运算) := |
|| OR | |
XOR | |
&& AND | |
NOT | |
BETWEEN CASE WHEN ELSE | |
=(比较运算) <==> >= > <= < <> != IS LIKE REGEXP IN | |
| | |
& | |
<< >> | |
- + | |
* /(DIV) %(MOD) | |
^ | |
-(负号) ~ | |
最高 | ! |
什么是MySQL函数
函数表示对输入参数值返回一个具有特定关系的值,MySQL提供了大量丰富的函数,在进行数据库管理以及数据的查询和操作时将会经常用到各种函数。通过对数据的处理,数据库功能可以变得更加强大,更加灵活地满足不同用户的需求。
从功能上函数主要分为以下几类:数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数等。
接下来介绍不同函数的用法:
数学函数
数学函数主要用来处理数值数据,主要的数学函数有:绝对值函数、三角函数(正余弦函数、正余切函数)、对数函数、随机函数等。在有错误产生时,数学函数将会返回空值NULL。
1、绝对值函数 ABS(X)
ABS(X)返回X的绝对值
当然 ABS(X),X可以是数据表的字段名
2、圆周率函数 PI( )
PI()返回圆周率π的值。默认得显示小数位数是6位。
3、平方根函数 SQRT(X)
SQRT(X)返回非负数X的二次方根。
实例:列举一些简单便于口算的例子
注意:负数没有平方根,所以返回NULL。
4、求余函数 MOD(X,Y)
MOD(X,Y)返回x被y除后的余数。MOD()对于有小数部分的数值也起作用,它返回除法运算后的精确余数。
5、获取证书的函数 CEIL(X)、CEILING(X)和FLOOR(X)
CEIL(X)和CEILING(X)函数的意义相同,都是返回不小于x的最小整数值,返回值转化为一个BIGINT,而FLOOR(X)返回不大于x的最大整数值,返回值转化为一个BIGINT。
这个几个函数向上还是向下取值,容易混淆。
个人记忆方法。。。floor 英文释义有:地板、地板或者最小的 最低的 意思。 floor(X)取比x小且最接近的整数,反之ceil(x)、ceiling(x)取比x大且最接近的整数。 记floor反推ceil和ceiling
6、获取随机数函数 RAND( )和RAND(X)\
RAND(x)返回一个随机浮点值v,范围在0到1之间(即0<= v >= 1.0)。若指定参数X,则它被用作种子值,用来产生重复序列,若没有指定参数x,则每次产生的随机数值时不同的。
7、函数 ROUND(X)、ROUND(X,Y)和TRUNCATE(X,Y)
ROUND(X)返回最接近于参数X的整数,对X的值进行四舍五入。
ROUND(X,Y)返回最接近于参数X的数,其值保留到小数点后面Y位,若Y为负值,则将保留Y值到小数点左边Y位。
注意:y为负数时,保留的时候不进行四舍五入,正数的时候会进行四舍五入。
TRUNCATE(X,Y) 返回被舍去至小数点后y位的数字x。若y的值为0,则结果不带有小数点或不带有小数部分。若y为负数,则截去(归零)x小数点左起第y位开始后面所有低位的值。
提示:ROUND(X,Y)函数截取值的时候会四舍五入,TRUNCATE(X,Y)直接截取不会四舍五入。
8、负号函数 SIGN(X)
SIGN(X)返回参数的符号,x的值为负、零或正时返回结果依次为-1、0或1。
9、幂运算函数 POW(X,Y)、POWER(X,Y) 和 EXP(X)
POW(x,y)或POWER(x,y)函数返回x的y次乘方的结果值。
EXP(X)返回e的x乘方后的值。
10、对数运算函数 LOG(X) 和 LOG10(X)
LOG(x)返回x的自然对数,x相对于基数e的对数
对数定义域不能为负数,因此LOG(-3)返回的结果为NULL
LOG10(x)返回x的基数为10的对数。
对数的定义域为非负,否则返回NULL
11、角度与弧度相互转换的函数 radians(x)和degrees(x)
radians(x)将参数x由角度转化为弧度。
degrees(x)将参数x由弧度转化为角度
还有一些 其他的函数
正弦函数 SIN(X) 返回x的正弦,其中x为弧度值。
反正弦函数 ASIN(X) 返回X的反正弦,即正弦x的值。若x不在-1到1的范围之内,则返回NULL。
余弦函数 COS(X) 返回x的余弦,其中x为弧度。
反余弦函数 ACOS(X) 返回x的反余弦,即余弦x的值。若x不在-1-1的范围内,则返回NULL。
正切函数 TAN(X) 返回x的正切,其中x为给定的弧度值。
反正切函数 ATAN(X) 返回x的反正切,即正切的x的值。
余切函数 COT(X) 返回x的余切。
字符串函数
字符串函数主要用来处理数据库中的字符串数据,MySQL中字符串函数有:计算字符串长度函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。
1、计算字符串字符数的函数 CHAR_LENGTH(str)
char_length(str) 返回值为字符串str所包含的字符个数。
2、计算字符串长度的函数 LENGTH(str)
返回值为字符串的字节长度,使用utf8编码字符集时,一个汉字是3个字节,一个数字或字母算一个字节。
看下 char_length(str)和 length(str) 的区别:
除了汉字的字符串,字母和数字 计算结果两者一样。
3、合并字符串函数 CONCAT(s1,s2,...) 、CONCAT_WS(x,s1,s2,...)
concat(s1,s2,...) 返回结果为连接参数产生的字符串,或许有一个或多个参数。
若有任何一个参数为NULL,则返回值为NULL。
若所有参数均为非二进制字符串,则结果为非二进制字符串。
若参数中有一个是二进制字符串,则结果为一个二进制字符串。
concat_ws(x,s1,s2,...) concat_ws代表concat with separator ,是concat()的特殊形式。第一个参数x是其他参数的分隔符,分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串也可以是其他参数。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL值。
除此之外 还有一个函数 group_concat()
这个实战用的比较多,实例看文章:https://blog.csdn.net/qq_35044419/article/details/79492746
4、字符串替换函数 INSERT(s1,x,len,s2)
INSERT(s1,x,len,s2) 返回从s1串x(不是下标)位置开始,用s2字符串替换s1串len长度后的字符串。
实例:
a:从'abcdefg'第2位置开始,用'YYYYY'替换2个长度,即替换掉bc,则替换后结果是:'aYYYYYdefg'。
b:从'abcdefg'第2位置开始,用'YYYYY'替换4个长度,即替换掉bcde,则替换后的结果是:'aYYYYYfg'
c:从'abcdefg'第2位置开始,用'YYYYY'替换0个长度,即啥也不替换,则替换后的结果是:'abcdefg'
d和d1不解释,0超出'abcdefg'的长度,返回原串
e:从'abcdefg'第2位置开始,用'YYYYY'替换10个长度,由于10大于'abcdefg'的长度,即从2位置开始替换的结尾,结果:'aYYYYY'
f:10超过'abcdefg'的长度,返回原串
g:任意一个参数为NULL,则返回NULL。
以上实例表达的很清晰。
5、字母大小写转换函数
LOWER(str) 、LCASE(str) 将字符串str中的字母字符全部转换成小写字母(大写转小写,小写不用变)。
UPPER(str) 、UCASE(str)将字符串str中的字母字符全部转换成大写字母(小写转成大写,大写不用变)。
不举实例
6、获取指定长度的字符串的函数 LEFT(s,n) 和RIGHT(s,n)
LEFT(s,n)返回字符串s从左边开始长度为n的字符串。
RIGHT(s,n)返回字符串从右边开始长度为n的字符串。
实例:
实例不解释
7、字符串填充函数 LPAD(s1,len,s2)和RPAD(s1,len,s2)
LPAD(s1,len,s2) 返回字符串s1,其左边由字符串s2填补到len字符长度,若s1的长度大于len,则返回值被缩短至len字符(即从s1的右边开始缩短,直至长度等于len)
实例:
注意e和e1、f和f1、g和g1的结果。
RPAD(s1,len,s2) 这个与LPAD(s1,len,s2)相反。
实例:
8、删除空格的函数
LTRIM(str) 返回字符串str左侧空格被删除的字符串。
RTRIM(str) 返回字符串str右侧空格被删除的字符串。
TRIM(str) 返回字符串str两侧空格被删除的字符串。
比较通俗易懂,不做实例。。。。
9、删除指定字符串的函数 TRIM(s1 FROM s)
TRIM(s1 FROM s) 删除字符串s中两端所有的字符串s1。s1为可选项,在未指定的情况下删除空格。
实例:
看结果,但是有点不解,结果中也有ab,不清楚这个函数怎么分割的两端 ^_^
10、重复生成字符串的函数 REPEAT(s,n)
REPEAT(s,n) 返回重复生成n次s的字符串
不做实例
11、空格函数SPACE(n)和REPLACE(s,s1,s2)
SPACE(s) 返回一个由n个空格组成的字符串。 不做实例
REPLACE(s,s1,s2) 返回由字符串s2替换s中所有的字符串s1的字符串。
12、比较字符串大小的函数 STRCMP(s1,s2)
STRCMP(s1,s2) 比较字符串的大小
不做实例
持续复习中