数据库的基本操作
如何创建数据库
数据库的删除操作
存储引擎的了解及其工作原理和如何选择
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的主要特性有:
InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。
InnoDB是为处理巨大数据量的最大性能设计。他的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹配的。
InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引存在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘分区) 。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。
InnoDB支持外键完整性约束(foreign key)。存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6B的rowid,并以此作为主键。
InnoDB被用在众多需要高性能的大型数据库站点上。 InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件。
MyISAM引擎
MyISAM基于ISAM的存储引擎,并对其进行扩展。它是在web、数据存储和其他应用环境下最常用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。在MySQL5.5.5之前的版本中,MyISAM是默认的存储引擎。MyISAM主要特性有:
大文件(达63位文件长度)在支持大文件的文件系统和操作系统上被支持。
当把删除、更新及插入操作混合使用的时候,动态尺寸的行产生更少的碎片。
每个MyISAM表最大的索引数是64,这可以通过重新编译来改变。每个索引的最大的列数是16个。
blob和text列可以被索引。
null值被允许在索引列中,这个值占每个键的0~1个字节。
每个字符列可以有不同的字符集。
有varchar的表可以固定或动态记录长度。
varchar和char列可以多达64KB。
使用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
若要提供提交、回滚和崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是最好的选择。
若数据表主要用来插入和查询记录的,MyISAM是最好的选择,因为MyISAM引擎能提高较高的处理效率。
若只是临时存放数据且量不大、也不需要较高的数据安全性,可以使用Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。
若只有insert和select操作,可选择Archive,Archive存储引擎支持搞并发的插入操作,但是本身不是事务安全的。此引擎适合存储归档数据 如记录日志信息。
数据表的基本操作
一、创建数据表
创建表
主键约束
外键约束
非空约束
唯一性约束
默认约束
主键自增
二、查看数据表结构
查看表结构
查看表详情结构语句,即建表语句
三、修改表结构
修改表名
修改字段的数据类型
修改字段名
添加字段
删除字段
修改字段的排列位置
修改表的存储引擎
删除表的外键约束
四、删除数据表
删除未被关联的表
删除被其他关联的主表
一、创建数据表
1.1、表的创建:
数据表属于数据库,建表之前,应使用 use database_name 选择将要建表的数据库。
建表语法格式:
create table <表名>(
字段名1,数据类型 [列级别的约束条件] [默认值],
字段名2,数据类型 [列级别的约束条件] [默认值],
......
[表级别的约束条件]
)
使用create table 创建表时,要注意:
表名称不区分大小写,但不能使用MySQL中的关键字,如:drop 、alter、insert等。、
若创建多个列,需要逗号隔开。
命令查看数据库中所有的表: 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的区别:
一个表中可以多个字段声明为unique,但是只能有一个primary key声明。
声明为primary key的列不允许有空值,但是声明为unique的字段允许空值(null)存在。
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关键字来实现
MySQL中auto_increment的初始值是1,每新增一条记录,字段值自动加一
一个表只能有一个字段使用auto_increment约束,且该字段必须为主键的一部分
auto_increment约束的字段可以是任何整数类型
语法格式:
字段名 数据类型 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
释义:
field 表示字段
type 表示字段类型
null 表示该列是否可以存储null值
key 表示该列是否已编制索引,PRI表示该列是主键的一部分;NUI表示该列是UNIQUE索引的一部分;MUL表示该列某个给定值允许出现多次
default 表示该列是否有默认值,如果有的话值是多少
extra 表示可以获取的与给定列的有关附加信息,比如auto_increment等
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的区别:
change不仅可以修改字段名,也可以修改字段的数据类型(修改前后的字段名一样即可)
modify只可以修改字段的数据类型,不可以修改字段名,但是modify可以修改字段的位置(参照后面1.6)
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;
drop table 可以删除多个没有被其他表关联的数据表
删除多表时,之间用逗号隔开
若果要删除的表不存在,则MySQL会包错误信息。参数 if exists用于在删除前判断删除的表是否存在,加上该参数删除表时,若表不存在,sql可以顺利执行,但是会发出警告
第二种删除被关联的表
数据表如果存在关联的情况下,若直接删除父表,结果会显示失败。原因是直接删除,将破坏表的参照完整性,若果必须删除,可以先删除与其关联的子表,再删除父表,只是这样同时删除了两个表中的数据。但有的情况写可能要保留子表,这事如要单独删除父表,只需将关联的表的外键条件取消,然后就可以删除父表。
语法格式:先删除外键约束 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表对象信息:
这样在执行删除父表的命令就不会报错误信息。
数据类型和运算符
常见的数据类型的概念和区别
如何选择数据类型
常见的运算符和区别及其运用
数据类型的介绍:
数值数据类型:包括整数类型 tinyint、smallint、mediumint、int、bigint、浮点小数数据类型 float和double、定点小数类型 decimal
日期/时间类型:包括year、time、date、datetime、timestamp。
字符串类型:包括char、varchar、binary、varbinary、blob、text、emum、set等。字符串类型又分为文本字符串和二进制字符串。
整数类型
数据型数据类型主要用来存储数字,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可以使用格式指定值
以4位字符串或者4位数字格式表示的year,范围为“1901” ~ “2155”。输入格式为“YYYY”或者 YYYY,例如输入2019或者“2019”,插入到数据库的值均为2019.
以2位字符串格式表示year,范围为“00” ~ “99”。 “00” ~ “69” 范围被转换为2000~2069,“70” ~ “99” 范围被转换为 1970~1999。“0”与“00”的作用相同,插入到数据库的值都是2000。
以2位数字表示的year,范围为1~99。1~69范围的值对应2001~2069,70~99范围的值对应1970~1999。注意:在这里0值将被转换为0000。而不是2000
TIME类型
TIME类型用于只需要时间信息的值,格式为HH:MM:SS,HH表示小时,MM表示分钟,SS表示秒。TIME类型的取值范围是-838:59:59 ~ 838:59:59.小时部分如此大的原因是TIME类型不仅可以用于表示一天的时间(必须大于24小时),还可能是某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时或者甚至为负)。
可以使用各种格式指定TIME的值:
'D HH:MM:SS' 格式的字符串。还可以使用下面任何一种'非严格'的语法:'HH:MM:SS'、'HH:MM'、'D HH:MM'、'D HH'、'SS',这里的D表示日,可以取0~34之间的值。在插入数据库时,D被转换为小时保存,格式为 ' D*24 + HH '。
'HHMMSS'格式的、没有间隔符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如: '101112' 被理解为 ' 10:11:12 ',但是'109712'是不合法的(它有一个没有意义的分钟部分),存储时将变为 00:00:00 。
提示:为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赋值:
'YYYY-MM-DD'或者 'YYYYMMDD' 字符串格式表示的日期,取值范围为 '1000-01-01' ~ '9999-12-3'。例如,输入'2019-05-05'或'20190505',插入数据库的日期都是 2015-05-05。
'YY-MM-DD'或'YYMMDD' 字符串格式表示的日期,MySQL使用以下规则解释两位年值:'00~69'表示'2000~2069','70~99'表示'1970~1999'。
YY-MM-DD或YYMMDD数字格式表示的日期,与上述类似,00~69表示2000~2069,70~99表示1970~1999。
使用 CURRENT_DATE或NOW(),插入系统当前时间。
提示:MySQL允许 不严格 语法:任何标点符号都可以用作日期部分之间的间隔符。例如,'98-11-31'、'98.11.31'、'98/11/31'是等价的。这些值也可以正确地插入到数据库。
DATETIME类型
DATATIME 包含日期和时间信息的值,格式: YYYY-MM-DD HH:MM:SS ,分别表示年月日时分秒。在给DATETIME类型字段赋值时,可以用字符串或数字类型的数据插入,只要符合DATETIME的格式即可。
字符串格式: 'YYYY-MM-DD HH:MM:SS'或'YYYYMMDDHHMMSS',取值范围为 '1000-01-01 00:00:00' ~ '999-12-323:59:59'。
字符串格式: 'YY-MM-DD HH:MM:SS'或'YYMMDDHHMMSS'','00~69'表示是2000~2069,'70~99'表示是1970~1999。
数字格式:YYYY-MM-DD HH:MM:SS或YYMMDDHHMMSS,00~69表示是2000~2069,70~99表示是1970~1999。
提示: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四类:
TINYTEXT 最大长度为255字符的TEXT列。
TEXT 最大长度为65535字符的TEXT列。
MEDIUMTEXT 最大长度为16777215字符的TEXT列。
LONGTEXT 最大长度为4294967295字符的TEXT列。
ENUM类型
ENUM是一个字符串对象,其值为表创建时在列规定中枚举的一列值。
语法格式: 字段名称 ENUM('值1','值2',...'值n')
释义:字段名称指将要定义的字段,值n指枚举列表中的第n个值。
ENUM类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个。
如果创建的成员中有空格时,其尾部的空格将自动被删除。
ENUM值在内部用整数表示,每个枚举值均有一个索引值,列表所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。
枚举最多可以有65535个元素。
实例一:
定义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类型的列可从定义的列值中选择多个字符的联合。
如果插入SET字段中列值有重复,MySQL自动删除重复的值
插入SET字段的值得顺序并不重要,MySQL会在存入数据库时,按照定义的顺序显示
如果插入了不正确的值,默认情况下,MySQL将忽视这些值,并给出警告。
实例:
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
提示:
进行算术运算的时候注意 算术运算符的优先级
进行除法运算时候,除数为0是没有意义的,若被0除,则返回结果为NULL。
比较运算符
一个比较运算符的结果是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。
若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。
若两个参数均为整数,则按照整数进行比较。
若一个字符串和数字进行相等判断,则MySQL可以自动将字符串转为数字进行比较。
安全等于运算符(<=>)
这个操作符和 = 操作符 执行 相同的比较操作,不过<=>可以用来判断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。
首先 参数 要满足 有两个或多个参数的情况下。
当参数中是整数或浮点数时,LEAST将返回其中最小的值。
当参数为字符串,返回字母表中顺序最靠前的字符。
当参数中有NULL时,不能判断大小,返回值为NULL。
GREATEST
语法格式:GREATEST(值1,值2,....,值n)
其中n 表示参数列表有n个值。当有两个或多个参数时,返回值为最大值。假如任意一个自变量为NULL,则GREATEST()的返回值为NULL。
首先 参数 要满足 有两个或多个参数的情况下。
当参数中是整数或浮点数时,GREATEST将返回其中最大的值。
当参数为字符串,返回字母表中顺序最靠后的字符。
当参数中有NULL时,不能判断大小,返回值为NULL。
IN 、NOT IN 运算符(常用)
多运用与 子查询中,不多陈述。
LIKE运算符(常用)
LIKE运算符用来匹配字符串,语法格式: str like 匹配条件。
若str有满足匹配条件的,则返回值为 1 (true),反之返回 0(false)。
若str或匹配条件中,任意一个为NULL,则结果为NULL。
匹配条件中用到以下两种通配符:
' % ' ,匹配任何数目的字符,甚至包括零字符
' _ ' ,只能匹配一个字符,也可以说是占位符
实例:
'%a' 匹配最后一位为a结尾的字符串。
'a%' 匹配首位以a开头的字符串。
'a__d' 匹配以a开头,以d结尾的四位字符串。
REGEXP运算符
regexp运算符用来匹配字符串,语法格式: str regexp 匹配条件 。
若str满足匹配条件,返回 1(true),否则返回 0(false) 。
若str或匹配条件任意一个为NULL,则结果为NULL。
REGEXP运算符在进行匹配时,常用的有下面几种通配符:
' ^ ' ,匹配以该字符后面的字符开头的字符串。 比如 '^a',匹配以a开头的字符串。
' $ ',匹配以该字符后面的字符结尾的字符串。比如 'a$' ,匹配以a结尾的字符串。
' . ' ,匹配任意一个单字符。
'[...]' ,匹配在方括号内的任何字符。比如 '[a-zA-Z]'匹配a到z或A到Z的任意一个字符。比如'[0-9]'等。
' * ' ,匹配零个或多个在他前面的字符。比如 'x*' 匹配任何数量的 'x'字符,'[0-9]*' 匹配任何数量的数字,而'*'匹配任何数量的任何字符串。
实例:
'^y' >>> 匹配以y开头的字符串。
'y$' >>> 匹配以y结尾的字符串。
'.xyz' 这个匹配这样的:'axyz'、'axyzb'
正则表达式是一个可以进行复杂查询的强大工具,相对于LIKE,字符串匹配。他可以使用更多的通配符类型,查询结果更加灵活。
逻辑运算符
在MySQL中,所有逻辑运算符的求值所得结果均为TRUE、FALSE、NULL。
MySQL中的逻辑运算符
运算符 作用
NOT 或者 ! 逻辑非
AND 或者 && 逻辑与
OR 或者 || 逻辑或
XOR 逻辑异或
NOT 或者 !
逻辑非运算符NOT或者!表示:
当操作数为 0 时,所得值为 1
当操作数为非零值时,所得值为 0
当操作数为NULL时,所得值为NULL
简单理解: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或者&&表示:
所有操作数均为非零值且不为NULL时,返回值为 1
当有一个或多个操作数为0时,返回值为 0
其余情况,返回值为NULL
实例:
有上图可知AND和&&的作用相同, 其实按照上述1、2、3一一对应就可以得到结果。
注意:AND运算符可以有多个操作数,当多个操作数运算时,AND两边一定要使用空格隔开,不然会影响结果的正确性。
OR 或者 ||
逻辑或运算符OR或者||表示:
当两个操作数均为非NULL值且任意一个操作数为非零值时,返回值为 1,否则返回 0
当有一个操作数为NULL且另一个操作数为非零值时,返回值为 1,否则为NULL
当两个操作数均为NULL时,返回值为NULL
实例:
XOR
逻辑异或运算符XOR:
当任意一个操作数为NULL时,返回值为NULL,
对于非NULL操作数,如果两个操作数都是非零或者都是零值,返回值为0
若一个操作数为0值,另一个为非0值,返回结果为 1
实例:
提示: 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的函数
数学函数
字符串函数
时间和日期函数
条件函数
系统信息函数
加密函数
其他特殊函数
什么是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长度后的字符串。
若x的值超出字符串s1的长度,则返回原字符串s1。
若len的长度大于字符串s1的长度,则从s1起始位置x开始,截到结尾,再s2取填充。
若任意一个参数为NULL,则返回值为NULL。
实例:
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) 比较字符串的大小
若s1与s2相同,则返回0
若s1小于s2,则返回-1
若s1大于s2,则返回1
不做实例
13、获取子串的函数 SUBSTRING(s,n,len)和MID(s,n,len)
substring(s,n,len) s是指字符串,n值开始截取的位置(正数时正向位置开始,负数时反向位置开始),len时截取的长度(省略时截取到结尾,若为小于1的数,咱返回空串)。
mid(s,n,len)作用很substring(s,n,len)相同
实例:
14、匹配字符串开始位置的函数
LOCATE(str1,str)、POSITION(str1 IN str2)、INSTR(str,str1)三个函数的作用相同,返回字符串str1在字符串str中的开始位置。
以上实例可知,若str1在str中存在,则返回子串str1的开始位置,不存在则返回0