MySQL
Posted 只缘心高嫌地窄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL相关的知识,希望对你有一定的参考价值。
基础常用命令
- mysql -u root -p 连接数据库
- /opt/lampp/bin/mysql -u root -p
- show databases; 查看当前系统存在的数据库,我们可以看到有默认的4个数据库,分别为 information_schema 、 mysql 、performance_schema 以及 test
- create database db_name; 创建数据库
- show tables
- select round(1.14);
- select md5(“hello”);
- describe tb_dept1;
- show create database db_name \\G 查看创建数据库属性
- drop database db_name; 删除数据库
- show engines \\G 查看系统支持的引擎
实例 创建数据表
- create database book;
- show create database book \\G 查看数据库定义
- use book; 进入book数据库
创建数据表tb_emp1的SQL语句为:(直接复制进去执行)
create table tb_emp1(
id int(11),
name varchar(25),
ddeptId int(11),
salary float
);
- show tables; 查看数据表
定义数据表tb_emp2,其主键为id
create table tb_emp2(
id int(11)primary key,
name varchar(25),
deptId int(11),
salary float
);
定义数据表tb_emp3,其主键为id
create table tb_emp3
(
id int(11),
name varchar(25),
deptId int(11),
salary float,
primary key(id)
);
定义数据表 tb_emp4,假设表中间没有主键 id,为了唯一确定一个员工,可以把 name 和 deptId 联合起来作为主键
create table tb_emp4
(
name varchar(25),
deptId int(11),
salary float,
primary key(name, deptId)
);
定义表 tb_emp5,并在表上创建外键约束
- 先创建一个部门表 tb_dept1
create table tb_dept1
(
id int(11) primary key,
name varchar(22) not null,
location varchar(50)
);
- 然后定义数据表 tb_emp5,让它的键 deptId 作为外键关联到 tb_dept1 的主键 id
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)
);
定义数据表 tb_emp6,指定员工的名称不能为空,非空约束
create table tb_emp6
(
id int(11) primary key,
name varchar(25) not null,
deptId int(11),
salary float
);
定义数据表 tb_dept2,指定部门的名称唯一
create table tb_dept2
(
id int(11) primary key,
name varchar(22) unique,
location varchar(50)
);
定义数据表 tb_dept3,指定部门的名称唯一
create table tb_dept3
(
id int(11) primary key,
name varchar(22),
location varchar(50),
constraint sth unique(name)
);
定义数据表 tb_emp7,指定员工的部门编号默认为 1111
create table tb_emp7
(
id int(11) primary key,
name varchar(25) not null,
deptId int(11) default 1111,
salary float
);
定义数据表 tb_emp8,指定员工的编号自动递增。
create table tb_emp8
(
id int(11) primary key auto_increment,
name varchar(25) not null,
deptId int(11),
salary float
);
分别使用 describe 和 desc 查看表 tb_dept1 和表 tb_emp1 的表结构
- 查看 tb_dept1 表结构的 SQL 语句为:describe tb_dept1;
- 查看 tb_emp1 表结构的 SQL 语句为:desc tb_emp1;
使用 show create table 查看表 tb_emp1 的详细信息
- show create table tb_emp1
实例 修改数据表
将数据表 tb_dept3 改名为 tb_deptment3
- alter table tb_dept3 rename tb_deptment3;
将数据表 tb_dept1 中 name 字段的数据类型由 varchar(22)修改成 varchar(30)
- alter table tb_dept1 modify name varchar(30);
将数据表 tb_dept1 中的 location 字段名称改为 loc,数据类型保持不变
- alter table tb_dept1 change location loc varchar(50);
将数据表 tb_dept1 中的 loc 字段名称改为 location,同时将数据类型变为 varchar(60)
- alter table tb_dept1 change loc location varchar(60);
在数据表 tb_dept1 中添加一个没有完整性约束的 int 类型的字段 managerId(部门经理编号)
- alter table tb_dept1 add managerId int(10);
在数据表 tb_dept1 中添加一个不能为空的 varchar(12)类型的字段 column1。
- alter table tb_dept1 add column1 varchar(12) not null;
在数据表 tb_dept1 中添加一个 int 类型的字段 column2。
- alter table tb_dept1 add column2 int(11) first;
在数据表 tb_dept1 中 name 列后添加一个 int 类型的字段 column3。
- alter table tb_dept1 add column3 int(11) after name;
删除数据表 tb_dept1 表中的 column2 字段。
- alter table tb_dept1 drop column2;
将数据表 tb_dept1 中的 column1 字段修改为表的第一个字段。
- alter table tb_dept1 modify column1 varchar(12) first;
将数据表 tb_dept1 中的 column1 字段插入到 location 字段后面。
- alter table tb_dept1 modify column1 varchar(12) after location;
将数据表 tb_deptment3 的存储引擎修改为 MyISAM。
- alter table tb_deptment3 engine=MyISAM;
删除数据表 tb_emp9 中的外键约束
- 首先创建表 tb_emp9,创建外键 deptId 关联 tb_dept1 表的主键 id
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)
);
- 而删除外键的 SQL 语句为:
- alter table tb_emp9 drop foreign key fk_emp_dept;
删除数据表 tb_dept2
- drop table if exists tb_dept2
删除被其他表关联的主表
- 数据表之间存在外键关联的情况下,如果直接删除父表,结果会显示失败。原因是直接删除,将破坏表的参照完整性。如果必须要删除,可以先删除与它关联的子表,再删除父表,只是这样同时删除了两个表中的数据。但有的情况下可能需要保留子表,这时如要单独删除父表,只需将关联的表的外键约束条件取消,然后就可以删除父表
- 在数据库中创建两个关联表,首先,创建表 tb_dept2
create table tb_dept2
(
id int(11) primary key,
name varchar(22),
location varchar(50)
);
- 接下来创建表 tb_emp
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)
);
- 删除被数据表 tb_emp 关联的数据表 tb_dept2
- 首先直接删除父表 tb_dept2,若直接使用 SQL 语句:
- drop table tb_dept2; 会返回错误的提示信息:
- ERROR 1217 ( 23000): Cannot delete or update a parent row:a foreign key constraint fails。
- 接下来,解除关联子表 tb_emp 的外键约束,SQL 语句为:
- alter table tb_emp drop foreign key fk_emp_dept;
- 最后再用 SQL 语句:
- drop table tb_dept2; 此时就可以成功执行了。
数据类型和运算符
- MySQL 支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。
- (1)数值数据类型:包括整数类型 tinyint、smallint、mediumint、int、bigint;
- 浮点小数数据类型 float 和 double,定点小数类型 decimal。
- (2)日期/时间类型:包括 year、time、date、datetime 和 timestamp。
- (3)字符串类型:包括 char、varchar、binary、varbinary、blob、text、enum 和 set 等。
整数类型
类型名称 说明 存储需求
Tinyint 很小的整数 1 个字节
Smallint 小的整型 2 个字节
Mediumint 中等大小的整数 3 个字节
Int 普通大小的整数 4 个字节
Bigint 大整数 8 个字节
- id 字段的数据类型为 int(11),注意到后面的数字 11,这表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。
- 注意:显示宽度和数据类型的取值范围是无关的。显示宽度只是指明 MySQL 最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值, 只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。其他整型数据类型也可以在定义表结构时指定所需要的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度值。
浮点数类型和定点数类型
数据类型 说明 存储需求
Float 单精度浮点数 4 个字节
Double 双精度浮点数 8 个字节
Decimal(M,D),dec 压缩的“严格”定点数 M+2 个字节
- Decimal 类型不同于 float 和 double,decimal 实际是以串存放的,decimal 可能的最大取值范围与 double 一样,但是其有效的取值范围由 M 和 D 的值决定。如果改变 M 而固定 D,则其取值范围将随着 M 的变大而变大。Decimal 的存储空间并不是固定的,而由其精度值 M 决定,占用 M+2 个字节。
- 注意:无论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。
日期与时间类型
类型名称 日期格式 存储需求
Year YYYY 1 字节
Time HH:MM:SS 3 字节
Date YYYY-MM-DD 3 字节
Datetime YYYY-MM-DD HH:MM:SS 8 字节
Timestamp YYYY-MM-DD HH:MM:SS 4 字节
- (1) year 类型是一个单字节类型用于表示年:以 4 位字符串或者 4 位数字格式表示的 year,范围为 1901~2155,输入格式为’YYYY’或者 YYYY;以 2 位字符串格式表示的 year,范围为’00’~’99’。’00’到’69’和’70’到’99’范围的值分别被转换为 2000~2069和 1970~1999 范围的 year 值;以 2 位数字表示的 year,范围为 1~99。1-69 和 70~99 范围的值分别被转换为 2001~2069 和 1970~1999 范围的 year 值。
- (2) time 类型用在只需要时间信息的值,在存储时需要 3 个字节。格式为 HH:MM:SS。HH表示小时,MM 表示分钟,SS 表示秒。Time 类型的取值范围为-838:59:59~838:59:59,小时部分会如此大的原因是 time 类型不仅可以用于表示一天的时间,还可能是某个事件过去的时间或两个事件之间的时间间隔。可以使用各种格式指定 time 值:D HH:MM:SS 格式的字符串以及 HHMMSS 格式的、没有间隔符的字符串或者 HHMMSS 格式的数值,假定都是有意义的时间,否则的话存储的时候将变为 00:00:00。
- (3) date 类型用在仅需要日期时,没有时间部分,在存储时需要 3 个字节。如期格式为YYYY-MM-DD,其中 YYYY 表示年,MM 表示月,DD 表示日。在给 date 类型的字段赋值时,可以使用字符串或者数字类型的数据插入,只要符合 date 的日期格式即可:以‘YYYY-MM-DD’或者‘YYYYMMDD’字符串格式表示的日期,取值范围为‘1000-01-01’~‘9999-12-31’;以‘YY-MM-DD’或者‘YYMMDD’字符串格式表示的日期,其中‘00~69’范围的年值转换为‘2000~2069’,‘70~99’范围的年值转换为‘1970~1999’;以 YY-MM-DD 或者 YYMMDD数字格式表示的日期,‘00~69’范围的年值转换为‘2000~2069’,‘70~99’范围的年值转换为‘1970~1999’;使用 current_date 或者 now()插入当前系统日期。
- (4) datetime 类型用于在需要同时包含日期和时间信息的值,在存储时需要 8 个字节。日期格式为‘YYYY-MM-DD HH:MM:SS’,其中 YYYY 表示年,MM 表示月,DD 表示日,HH 表示小时,MM 表示分钟,SS 表示秒。在给 datetime 类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入。只要符合 datetime 的日期格式即可:以‘YYYY-MM-DD HH:MM:SS’或者‘YYYYMMDDHHMMSS’字符串格式表示的值,取值范围为‘1000-01-01 00:00:00’~‘9999-12-31 23:59:59’;以‘YY-MM-DD HH:MM:SS’或者‘YYMMDDHHMMSS’字符串格式表示的日期,在这里 YY 表示两位的年值。与前面相同,‘00~69’范围的年值转换为‘2000~2069’,‘70~99’范围的年值转换为‘1970~1999’;以 YYYYMMDDHHMMSS 或者YYMMDDHHMMSS 数字格式表示的日期和时间。
- (5) timestamp 的显示格式与 datetime 相同,显示宽度固定在 19 个字符,日期格式为YYYY-MM-DD HH:MM:SS,在存储时需要 4 个字节。但是 timestamp 列的取值范围小于 datetime的取值范围,为‘1970-01-01 00:00:01’UTC~‘2038-01-19 03:14:07’UTC,其中UTC(Corordinated Universal Time,世界标准时间),因此在出入数据时,要保证在合法的取值范围内。
字符串类型
- 字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。字符串可以进行区分或者不区分大小写的串比较,另外,还可以进行模式匹配查找
典型类型 说明 存储需求
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 个成员)
- (1)char 和 varchar 类型: Char(M)为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格以达到指定的长度。M 表示列长度,M 的范围是 0~255 个字符。当检索到 char 值时,尾部的空格将被删除掉。Varchar(M)是长度可变的字符串。M 表示最大列长度。M 的范围是 0~65535。Varchar的最大实际长度由最长的行的大小是使用的字符集确定,而其实际占用的空间为字符串的实际长度加 1。Varchar 在值保存和检索时尾部的空格仍保留。
- (2)text 类型: Text 列保存非二进制字符串,如文章内容、评论等。当保存或查询 text 列的值时,不删除尾部空格。
- (3)enum 类型: Enum 类型是一个字符串对象,其值为表创建时在列规定中枚举的一列值。语法格式如下:
- 字段名 enum(‘值 1’,’值 2’,„’值 n’)
- 字段名指将要定义的字段,值 n 指枚举列表中的第 n 个值。 Enum 类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个。如果创建的成员中有空格时,其尾部的空格将自动被删除。Enum 值在内部用整数表示,每个枚举值均有一个索引值;列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号。Enum 值按照列索引顺序排列,并且空字符串排在非空字符串前,NULL 值排在其他所有的枚举值前。
- (4)set 类型: Set 是一个字符串对象,可以有零个或多个值,set 列最多可以有 64 个成员,其值为表创建时规定的一列值。指定包括多个 set 成员的 set 列值时,各成员之间用逗号间隔。语法格式如下:
- Set(‘值 1’,’值 2’,„’值 n’)
- 与 enum 类型相同,set 值在内部用整数表示,列表中每一个值都有一个索引编号。当创建表时,set 成员值的尾部空格将自动被删除。但与 enum 类型不同的是,enum 类型的字段只能从定义的列值中选择一个值插入,而 set 类型的列可以从定义的列值中选择多个字符的联合。
- 如果插入 set 字段中的列值有重复,则 MySQL 会自动删除重复的值;插入 set 字段的值的顺序并不重要, MySQL 会在存入数据库时,按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL 将忽视这些值,并给出警告。
二进制类型
类型名称 说明 存储需求
Bit(M) 位字段类型 大约(M+7)/8 个字节
Binary(M) 固定长度二进制字符串 M 个字节
Varbinary(M) 可变长度二进制字符串 M+1 个字节
Tinyblob(M) 非常小的 blob L+1 字节,在此 L<2^8
Blob 小 blob L+2 字节,在此 L<2^16
Mediumblob 中等大小的 blob L+3 字节,在此 L<2^24
Longblob 非常大的 blob L+4 字节,在此 L<2^32
比较运算符
运算符 作用
= 等于
<=> 安全的等于
<>(!=) 不等于
<= 小于等于
>= 大于等于
> 大于
Is null 判断一个值是否为 null
Is not null 判断一个值是否不为 null
Least 在有两个或多个参数时,返回最小值
Greatest 在有两个或多个参数时,返回最大值
Between and 判断一个值是否落在两个值之间
Isnull 与 is null 作用相同
In 判断一个值是 in 列表的任意一个值
Not in 判断一个值不是 in 列表的任意一个值
Like 通配符匹配
Regexp 正则表达式匹配
位运算符
运算符 作用
| 位或
& 位与
^ 位异或
<< 位左移
>> 位右移
~ 位取反,反转所有比特
实例测试
- mysql -u root -p
- use test
- select (9-7)*4,8+15/3,17/2,39%12;
- select 36>27,15>=8,40<50,15<=15,null<=>null,null<=>1,5<=>5;
- select 4&&8,!2,0 xor 1,null xor 0,-2 || null;
- select 13&17,20|8,14^20,~16;
- 会显示上边的式子和计算结果
MySQL 函数
数学函数
绝对值函数 abs()和返回圆周率的函数 pi()
平方根函数 sqrt(x)和求余函数 mod(x,y)
获取整数的函数 ceil(x)、ceiling(x)和 floor(x)
- ceil(x)和 ceiling(x)意义相同, 返回不小于 x 的最小整数值, 返回值转化为一个 bigint。
- floor(x)返回不大于 x 的最大整数值,返回值转化为一个 bigint。
获取随机数的函数 rand()和 rand(x)
- rand()每次产生一个 0 到 1 之间的随机浮点数。
- rand(x)返回一个随机浮点值 v,范围在 0 到 1 之间。若已经指定一个整数参数 x,则它被用作种子值,用来产生重复序列。
四舍五入函数 round(x)、round(x,y)和 truncate(x,y)
- round(x)返回最接近于参数 x 的整数,对 x 值进行四舍五入。
- round(x,y)返回最接近于参数 x 的数,其值保留到小数点后面 y 位,若 y 为负值,则将保留值到小数点左边 y 位。
- truncate(x,y)返回被舍去至小数点后 y 位的数字。若 y 的值为 0,则结果不带有小数点或不带有小数部分。若 y 设为负数,则截去 x 小数点左起第 y 位后面所有低位的值。
符号函数 sign(x)
- sign(x)返回参数的符号,x 的值为负、零或正时返回结果依次为-1、0、1
幂运算函数 pow(x,y)、power(x,y)和 exp(x)
- pow(x,y)或者 power(x,y)函数返回 x 的 y 次乘方的结果值。
- exp(x)返回 e 的 x 乘方后的值
对数运算函数 log(x)和 log10(x)
- pow(x,y)或者 power(x,y)函数返回 x 的 y 次乘方的结果值。
- exp(x)返回 e 的 x 乘方后的值
角度与弧度相互转换的函数 radians(x)和 degrees(x)
- radians(x)将参数 x 由角度转化为弧度。
- degrees(x)将参数 x 由弧度转化为角度。
正弦函数 sin(x)和反正弦函数 asin(x)
- sin(x)返回 x 正弦,其中 x 为弧度值。
- asin(x)返回 x 的反正弦,即正弦为 x 的值。若 x 不在-1 到 1 的范围内,则返回 null。
余弦函数 cos(x)和反余弦函数 acos(x)
- cos(x)返回 x 余弦,其中 x 为弧度值。
- acos(x)返回 x 的反余弦,即余弦为 x 的值。若 x 不在-1 到 1 的范围内,则返回 null。
正切函数、反正切函数和余切函数
- tan(x)返回 x 的正切,其中 x 为给定的弧度值。
- atan(x)返回 x 的反正切,即正切为 x 的值。
- cot(x)返回 x 的余切,其中 x 为给定的弧度值。
字符串函数
计算字符串字符数的函数和字符串长度的函数
- char_length(str)返回值为字符串 str 所包含的字符个数。一个多字节字符算作一个单字符。
- length(str)返回值为字符串的字节长度,使用 utf8 编码字符集时,一个汉字是 3 个字节,一个数字或字母算一个字节。
合并字符串函数 concat(s1,s2,…)、concat_ws(x,s1,s2,…)
- concat(s1,s2,…)返回结果为连接参数产生的字符串,或许有一个或多个参数。如有任何一个参数为 null,则返回值为 null。如果所有参数均为非二进制字符串,则结果为非二进制字符串。如果自变量中含有任已二进制字符串则结果为一个二进制字符串。
- concat_ws(x,s1,s2,…)是 concat()的特殊形式,第一个参数 x 是其他参数的分隔符,分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其他参数,如果分割符为 null,则结果为 null。函数会忽略任何分隔符参数后的 null 值
替换字符串的函数 insert(s1,x,len,s2)
- insert(s1,x,len,s2)返回字符串 s1,其字符串起始于 x 位置和被字符串 s2 取代的 len 字符。如果 x 超过字符串长度,则返回值为原始字符串。假如 len 的长度大于其他字符串的长度,则从位置 x 开始替换。若任何一个参数为 null,值返回值为 null
字母大小写转换函数
- lower(str)或者 lcase(str)可以将字符串 str 中的字母字符全部转换成小写字母。
- upper(str)或者 ucase(str)可以将字符串 str 中的字母字符全部转换成大写字母。
获取指定长度的字符串的函数 left(s,n)和 right(s,n)
- left(s,n)返回字符串 s 开始的最左边 n 个字符。
- right(s,n)返回字符串 s 开始的最左边 n 个字符。
填充字符串函数 lpad(s1,len,s2)和 rpad(s1,len,s2)
- lpad(s1,len,s2)返回字符串 s1,其左边由字符串 s2 填补到 len 字符长度。假如 s1 的长度大于 len,则返回值被缩短至 len 字符。
- rpad(s1,len,s2)返回字符串 s1,其右边由字符串 s2 填补到 len 字符长度。假如 s1 的长度大于 len,则返回值被缩短至 len 字符。
删除空格的函数 ltrim(s)、rtrim(s)和 trim(s)
- ltrim(s)返回字符串 s,字符串左侧空格字符被删除。
- rtrim(s)返回字符串 s,字符串右侧空格字符被删除。
- trim(s)字符串 s 两侧空格字符被删除。substring(s,n,len)带有 len 参数的格式,从字符串 s 返回一个长度同 len 字符相同的子字符串,起始于位置 n。也可能对 n 使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的 n 字符,即倒数第 n 个字符,而不是字符串的开始位置。
- mid(s,n,len)与 substring(s,n,len)的作用相同。
匹配子串开始位置的函数
- locate(str1,str)、position(str1 in str)和 instr(str,str1)3 个函数作用相同,返回子字符串 str1 在字符串 str 中的开始位置。
字符串逆序的函数 reverse(s)
- reverse(s)将字符串 s 反转,返回的字符串的顺序和 s 字符串顺序相反。
返回指定位置的字符串的函数
- elt(N,字符串 1,字符串 2,字符串 3,…)若 N=1,则返回字符串 1,若 N=2,则返回字符串 2,依次类推。若 N 小于 1 或者大于参数的数目,则返回值为 null。
返回指定字符串位置的函数 field(s,s1,s2,…)
- field(s,s1,s2,…)返回字符串 s 在列表 s1,s2,…中第一次出现的位置,在找不到 s 的情况下,返回值为 0。如果 s 为 null,则返回值为 0,原因是 null 不能同任何值进行同等比较。
返回子串位置的函数 find_in_set(s1,s2)
- find_in_set(s1,s2)返回字符串 s1 在字符串列表 s2 中出现的位置,字符串列表是一个由多个逗号‘,’分开的字符串组成的列表。如果 s1 不在 s2 或者 s2 为空字符串,则返回值为 0。如果任意一个参数为 null,则返回值为 null。这个函数在第一个 iecanshu 包含一个逗号‘,’时将无法正常运行。
选取字符串的函数 make_set(x,s1,s2,…)
- make_set(x,s1,s2,…)返回由 x 的二进制数指定的相应位的字符串组成的字符串,s1对应比特 1,s2 对应比特 01,依次类推。s1,s2,…中的 null 值不会被添加到结果中。
删除指定字符串的函数 trim(s1 from s)
- trim(s1 from s)删除字符串 s 中两端所有的子字符串 s1。s1 为可选项,在未指定情况下,删除空格。
重复生成字符串的函数 repeat(s,n)
- repeat(s,n)返回一个由重复的字符串 s 组成的字符串,字符串 s 的数目等于 n。若 n<=0, 则返回一个空字符串。若 s 或 n 为 null,则返回 null。
空格函数 space(n)和替换函数 replace(s,s1,s2)
- space(n)返回一个由 n 个空格组成的字符串。
- replace(s,s1,s2)使用字符串 s2 替代字符串 s 中所有的字符串 s1。
比较字符大小的函数 strcmp(s1,s2)
- strcmp(s1,s2)若所有的字符串均相同,则返回 0;若根据当前分类次序,第一个参数小于第二个,则返回-1,其他情况返回 1。
获取子串的函数
- substring(s,n,len)带有 len 参数的格式,从字符串 s 返回一个长度同 len 字符相同的子字符串,起始于位置 n。也可能对 n 使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的 n 字符,即倒数第 n 个字符,而不是字符串的开始位置。
- mid(s,n,len)与 substring(s,n,len)的作用相同。
匹配子串开始位置的函数
- locate(str1,str)、position(str1 in str)和 instr(str,str1)3 个函数作用相同,返回子字符串 str1 在字符串 str 中的开始位置。
字符串逆序的函数 reverse(s)
- reverse(s)将字符串 s 反转,返回的字符串的顺序和 s 字符串顺序相反。
返回指定位置的字符串的函数
- elt(N,字符串 1,字符串 2,字符串 3,…)若 N=1,则返回字符串 1,若 N=2,则返回字符串 2,依次类推。若 N 小于 1 或者大于参数的数目,则返回值为 null。
返回指定字符串位置的函数 field(s,s1,s2,…)
- field(s,s1,s2,…)返回字符串 s 在列表 s1,s2,…中第一次出现的位置,在找不到 s 的情况下,返回值为 0。如果 s 为 null,则返回值为 0,原因是 null 不能同任何值进行同等比较。
返回子串位置的函数 find_in_set(s1,s2)
- find_in_set(s1,s2)返回字符串 s1 在字符串列表 s2 中出现的位置,字符串列表是一个由多个逗号‘,’分开的字符串组成的列表。如果 s1 不在 s2 或者 s2 为空字符串,则返回值为 0。如果任意一个参数为 null,则返回值为 null。这个函数在第一个 iecanshu 包含一个逗号‘,’时将无法正常运行。
选取字符串的函数 make_set(x,s1,s2,…)
- make_set(x,s1,s2,…)返回由 x 的二进制数指定的相应位的字符串组成的字符串,s1 对应比特 1,s2 对应比特 01,依次类推。s1,s2,…中的 null 值不会被添加到结果中。
日期和时间函数
- 日期和时间函数主要用来处理日期和时间值,一般的日期函数除了使用 date 类型的参数外,也可以使用 datetime 或者 timestamp 类型的参数,但会忽略这些值的时间部分。相同的,以 time 类型值为参数的函数,可以接受 timestamp 类型的参数,但会忽略日期部分。
获取当前日期的函数和获取当前时间的函数
- curdate()和 current_date()函数作用相同,将当前日期按照‘YYYY-MM-DD’或者
- YYYYMMDD 格式的值返回,具体格式根据函数在字符串或是数字语境中而定。
获取当前日期和时间的函数
- current_timestamp()、localtime()、now()和 sysdate()4 个函数的作用相同,均返回当前日期和时间值,格式为‘YYYY-MM-DD HH:MM:SS’或 YYYYMMDDHHMMSS,具体格式根据函数在字符串或是数字语境中而定。
UNIX 时间戳函数
- UNIX_TIMESTAMP(date)若无参数调用,则返回一个 Unix 时间戳(‘1970-01-01 00: 00: 00’GMT 之后的秒数)作为无符号整数。其中,GMT(Green wich mean time,为格林威治标准时间)。
- 若用 date 来调用 unix_timestamp(),它会将参数值以‘1970-01-01 00:00:00’GMT 后的秒数的形式返回。 Date 可以是一个 date 字符串、 datetime 字符串、 timestamp或一个当地时间的 YYMMDD 或 YYYYMMDD 格式的数字。
返回 UTC 日期的函数和返回 UTC 时间的函数
- UTC_DATE()函数返回当前 UTC(世界标准时间)日期值,其格式为‘YYYY-MM-DD’或 YYYYMMDD,具体格式根据函数在字符串或是数字语境中而定。
获取月份的函数 month(date)和 monthname(date)
- month(date)函数返回 date 对应的月份,范围从 1 到 12。
- monthname(date)函数返回日期 date 对应月份的英文全名。
获取星期的函数
- dayname(d)函数返回 d 对应的工作日的英文名称,例如 Sunday、Monday 等。
- dayofweek(d)函数返回 d 对应的一周中的索引(位置)。1 表示周日, 2 表示周一,…, 7 表示周六。
- weekday(d)返回 d 对应的工作日索引。0 表示周一,1 表示周二,…,6 表示周日。
获取星期数的函数
- week(d)计算日期 d 是一年中的第几周。week()的双参数形式允许指定该星期是否起始于周日或周一,以及返回值的范围是否为从 0 到 53 或 1 到 53。
- Weekofyear(d)计算某天位于一年中的第几周,范围是从 1 到 53。
获取天数的函数
- dayofyear(d)函数返回 d 是一年中的第几天,范围是从 1 到 366。
- dayofmonth(d)函数返回 d 是一个月中的第几天,范围是从 1 到 31。
获取年份、季度、小时、分钟和秒钟的函数
- year(date)返回 date 对应的年份,范围是 1970 到 2069。
- quarter(date)返回 date 对应的一年中的季度值,范围是从 1 到 4。
- minute(time)返回 time 对应的分钟数。
- second(time)返回 time 对应的秒数,范围是从 0 到 59。
获取日期的指定值的函数
- extract(type from date)函数所使用的时间间隔类型说明符同 date_add()或
- date_sub()的相同,但它从日期中提取一部分,而不是执行日期运算。
时间和秒钟转换的函数
- time_to_sec(time)返回已转化为秒的 time 参数。转换公式为:小时*3600+分钟*60+秒。
- sec_to_time(seconds)返回被转化为小时、分钟和秒数的 seconds 参数值,其格式为’HH:MM:SS’或者 HHMMSS,具体格式根据该函数是否用在字符串或数字语境中而定。
计算日期和时间的函数
- 计算日期和时间的函数有: date_add()、 adddate()、
- date_sub()、 subdate()、 addtime()、
- subtime()和 date_diff()。
- date_add(date,interval expr type)和 date_sub(date,interval expr type),其中, date 是一个 datetime 或 date 值,用来指定起始时间,expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔。expr 是一个字符串:对于负值的时间间隔,它可以以一个 负号‘-’开头。type 为关键字,它指示了表达式被解释的方式。若 date 参数是一个 date 值,计算只会包括 year、month 和 day 部分(即没有时间部分),其结果是一个 date 值。否则,结果将是一个 datetime 值。
- date_add(date,interval expr type)或者 adddate(date,interval expr type),两个函数作用相同,执行日期的加运算。
- date_sub(date,interval expr type)或者 subdate(date,interval expr type)两个函数作用相同,执行日期的减运算。
- addtime(date,expr)函数将 expr 值添加到 date,并返回修改后的值, date 是一个日期或者日期时间的表达式,而 expr 是一个时间表达式。
- subtime(date,expr)函数中 date 减去 expr 值,并返回修改后的值,date 是一个日期或者日期时间表达式,而 expr 是一个时间表达式。
- datediff(date1,date2)返回起始时间 date1 和结束时间 date2 之间的天数。date1 和
- date2 为日期或 date-and-time 表达式。计算中只用到这些值的日期部分。
将日期和时间格式化的函数
- date_format(date,format)根据 format 指定的格式显示 date 值。
- time_format(time,format)根据 format 字符串安排 time 值的格式。Format 字符串可能仅会处理包含小时、分钟和秒的格式说明符,其他说明符产生一个 null 值或 0。
- get_format(val_type,format_type)返回日期时间字符串的显示格式,val_type 表示日期数据类型,包括 date、 datetime 和 time;
- format_type 表示格式化显示类型,包括 EUR、INTERCAL、ISO、JIS、USA。
条件判断函数
- 条件判断函数也称为控制流程函数,根据满足的条件的不同,执行相应的流程。MySQL中进行条件判断的函数有 IF、IFNULL 和 CASE。
IF(expr,v1,v2)函数
- IF(expr,v1,v2)如果表达式 expr 是 true(expr<>0 and expr<>null),则 IF()的返回值为 v1;否则返回值为 v2。IF()的返回值为数字值或字符串值,具体情况视其所在语境而定。
IFNULL(v1,v2)
- IFNULL(v1,v2)假如 v1 不为 null,则 IFNULL()的返回值为 v1;否则其返回值为 v2。
- IFNULL()的返回值是数字或是字符串,具体情况视其所在语境而定。
CASE 函数
- CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END该函数表示,如果 expr 值等于某个 vn,则返回对应位置 THEN 后面的结果。如果与所有值都不想等,则返回 ELSE 后面的 rn。
系统信息函数
获取 MySQL 版本号、连接数和数据库名的函数
- version()返回指示 MySQL 服务器版本的字符串。这个字符串使用 utf8 字符集。
- connection_id()返回 MySQL 服务器当前连接的次数,每个连接都有各自唯一的 ID。
- database()、schema()函数返回使用 utf8 字符集的默认数据库名。
获取用户名的函数
- user()、current_user、current_user()、system_user()和 session_user()这几个函数返回当前被 MySQL 服务器验证的用户名和主机名组合。这个值符合确定当前登录用户存取权限的 MySQL 账户。一般情况下,这几个函数的返回值是相同的。
获取字符串的字符集和排序方式的函数
- charset(str)返回字符串 str 自变量的字符集。
- collation(str)返回字符串 str 的排列方式。
获取最后一个自动生成的 ID 值的函数
- last_insert_id()自动返回一个 insert 或 update 为 auto_increment 列设置的第一个放生的值。
加密函数
- 加密函数主要用来对数据进行加密和界面处理,以保证某些重要数据不被别人获取。这些函数在保证数据库安全时非常有用。
加密函数 password(str)
- password(str)从原明文密码 str 计算并返回加密后的密码字符串,当参数为 null 时,返回 null。
加密函数 md5(str)
- md5(str)为字符串算出一个 md5 128 比特校验和。该值以 32 位十六进制数字的二进制字符串形式返回,若参数为 null,则会返回 null。
加密函数 encode(str,pswd_str)
- encode(str,pswd_str)使用 pwsd_str 作为密码,加密 str。使用 decode()解密结果,结果是一个和 str 长度相同的二进制字符串。
解密函数 decode(crypt_str,pswd_str)
- decode(crypt_str,pswd_str)使用 pswd_str 作为密码,解密加密字符串 crypt_str,
- crypt_str 是由 encode()返回的字符串。
其他函数
格式化函数 format(x,n)
- format(x,n)将数字 x 格式化,并以四舍五入的方式保留小数点后 n 位,结果以字符串的形式返回。若 n 为 0,则返回结果函数不含小数部分。
不同进制的数字进行转换的函数
- conv(N,from_base,to_base)函数进行不同进制间的转换。返回值为数值 N 的字符串表示,由 from_base 进制转化为 to_base 进制。如有任意一个参数为 null,则返回值为 null。自变量 N 被理解为一个整数,但是可以被指定为一个整数或字符串。最小基数为 2,而最大基数则为 36。
IP 地址与数字相互转换的函数
- inet_aton(expr)函数将数字字符串网络地址转换为数值网络地址。
- inet_ntoa(expr)给定一个数字网络地址(4 或 8 比特),返回作为字符串的该地址的点地址表示。
加锁函数和解锁函数
- get_lock(str,timeout)设法使用字符串 str 给定的名字得到一个锁,超时为 timeout秒。若成功得到锁,则返回 1;若操作超时,则返回 0;若发生错误,则返回 null。
- release_lock(str)解开被 get_lock()获取的, 用字符串 str 所命名的锁。若锁被解开, 则返回 1;若该线程尚未创建锁,则返回 0;若命名的锁不存在,则返回 null。若该锁从未被 get_lock()调用获取,或已经被提前解开,则该锁不存在。
- is_free_lock(str)检查名为 str 的锁是否可以使用。若锁可以使用,则返回 1,若这个锁正在被使用,则返回 0;出现错误,则返回 null。
- Iis_used_lock(str)检查名为 str 的锁是否正在被使用。若被封锁,则返回使用该锁的客户端的连接标识符;否则,返回 null。
重复执行指定操作的函数
- benchmark(count,expr)函数重复 count 次执行表达式 expr。它可以用于计算 MySQL 处理表达式的速度。结果值通常为 0(0 只是表示处理过程很快,并不是没有花费时间)。另一个作用是它可以在 MySQL 客户端内部报告语句执行的时间。
改变字符集的函数
- convert(… using …)带有 using 的 convert()函数被用来在不同的字符集之间转化数据。
改变数据类型的函数
- cast(x,as type)和 convert(x,type)函数将一个类型的值转换为另一个类型的值,可转换的 type 有:binary、char、date、datetime、decimal、signed、unsigned。
以上是关于MySQL的主要内容,如果未能解决你的问题,请参考以下文章