- 基本数据类型
- 数据库储存引擎
- 索引
- Mysql函数
- 绝对值,π,平方根,去余函数(适用小数)
mysql> select abs(-1),pi(),sqrt(9),Mod(31,8),Mod(45.5,6);
效果:
+————-+—————+————-+—————-+——————-+
| abs(-1) | pi() | sqrt(9) | Mod(31,8) | Mod(45.5,6) |
+————-+—————+————-+—————-+——————-+
| 1 | 3.141593 | 3 | 7 | 3.5 |
+————-+—————+————-+—————-+——————-+
- 获取整数的函数
mysql> select ceil(-3.5),ceiling(3.5),floor(-3.5),floor(3.5);
效果:
+——————+———————+——————-+——————+
| ceil(-3.5) | ceiling(3.5) | floor(-3.5) | floor(3.5) |
+——————+———————+——————-+——————+
| -3 | 4 | -4 | 3 |
+——————+———————+——————-+——————+
- 获取随机数的函数
mysql> select rand(),rand(),rand(10),rand(10);
效果:
+——————————+——————————-+——————————+——————————+
| rand() | rand() | rand(10) | rand(10) |
+——————————+——————————-+——————————+——————————+
| 0.9031498375378082 | 0.46329259729319494 | 0.6570515219653505 | 0.6570515219653505 |
+——————————+——————————-+——————————+——————————+
可以看到前面两个不同,后面两个指定了种子所以相同。 - Round函数(四舍五入函数),truncate()函数
mysql> select round(3.4),(3.6),round(3.16,1),round(3.16,0),round(232.28,-1),truncate(1.31,1),truncate(1.99,1),truncate(19.99,-1);
效果:
+——————+——-+———————-+———————-+—————————+—————————+—————————+——————————+
| round(3.4) | 3.6 | round(3.16,1) | round(3.16,0) | round(232.28,-1) | truncate(1.31,1) | truncate(1.99,1) | truncate(19.99,-1) |
+——————+——-+———————-+———————-+—————————+—————————+—————————+——————————+
| 3 | 3.6 | 3.2 | 3 | 230 | 1.3 | 1.9 | 10 |
+——————+——-+———————-+———————-+—————————+—————————+—————————+——————————+
- 符号函数,幂运算函数pow,power,exp()//e的x乘方
mysql> select sign(-21),sign(0),sign(21),pow(2,2),power(2,-2),exp(2); - 自然对数运算和以10为底的对数运算,弧度,角度 radians角度转弧度,弧度转角度
mysql> select log(3),log(-3),log10(100),log10(-100),radians(180),degrees(pi()/2); - 正弦函数余弦函数
mysql> select sin(pi()/2),degrees(asin(1)),cos(pi()),degrees(acos(-1)),round(tan(pi()/4)),degrees(atan(1)),cot(pi()/4); - 字符串函数,concat_ws忽略空值null
mysql> select char_length(‘aab’),length(‘aabb’),concat(‘My sql ‘,’5.7’),concat(‘My’,null,’sql’),concat_ws(‘-‘,’a’,’b’,’c’),concat_ws(‘*’,’aa’,null,’bb’); - 替换字符串的函数
mysql> select insert(‘Quest’,2,4,’What’) as Coll,insert(‘Quest’,-1,4,’What’) as Coll2,insert(‘Quest’,3,100,’Wh’) as Coll3; - 大小写转换,获取指定长度字符串的函数left,right;
mysql> select lower(‘ZHENGXIN’),lcase(‘ZHENGXIN’),upper(‘zhengxin’),ucase(‘zhengxin’),left(‘football’,5),right(‘football’,5); - 填充字符串的函数,删除空格的函数
mysql> select lpad(‘hello’,4,’‘),lpad(‘hello’,10,’‘),
-> rpad(‘hello’,10,’*’),concat(‘(‘,ltrim(‘ book ‘),’)’),
-> concat(‘(‘,rtrim(‘ book ‘),’)’),
-> concat(‘(‘,trim(‘ book ‘),’)’),
-> trim(‘xy’ from ‘xyxyabababxyxy’);
效果: - 重复生成,空格函数,替换函数,比较大小的函数
mysql> select repeat(‘mysql’,3),concat(‘(‘,space(6),’)’),
-> replace(‘xxx.baidu.com’,’x’,’w’),strcmp(‘abc’,’abd’);
效果:
+—————————-+—————————————+—————————————————+——————————-+
| repeat(‘mysql’,3) | concat(‘(‘,space(6),’)’) | replace(‘xxx.baidu.com’,’x’,’w’) | strcmp(‘abc’,’abd’) |
+—————————-+—————————————+—————————————————+——————————-+
| mysqlmysqlmysql | ( ) | www.baidu.com | -1 |
+—————————-+—————————————+—————————————————+——————————-+ - 获取子串的函数
mysql> select substring(‘breakfast’,5) as coll,
-> substring(‘breakfast’,3,5) as coll2,
-> substring(‘breakfast’,-3) as coll3, #从后面开始截取3个
-> substring(‘breakfast’,-1,4) as coll4; #从结尾开始第一个位置截取四个
效果:
+———-+———-+———-+———-+
| coll | coll2 | coll3 | coll4 |
+———-+———-+———-+———-+
| kfast | eakfa | ast | t |
+———-+———-+———-+———-+ - 返回指定位置的值,返回指定字符串的位置的函数
mysql> select elt(3,’a’,’b’,’c’),elt(2,’a’),
-> field(‘Hi’,’hihi’,’Hey’,’Hi’,’bas’) as coll,
-> field(‘Hi’,’hihi’,’a’,’b’) as coll2,
-> find_in_set(‘Hi’,’hihi,Hey,Hi,bas’); #返回字串位置的函数 - make_set()函数的使用
mysql> select make_set(1,’a’,’b’,’c’) as coll,#0001选第一个
-> make_set(1|4, ‘hello’,’nice’,’word’) as coll2, #0001 0100—>0101 —>选第一和第三
-> make_set(1|4,’hello’,’nice’,null,’word’) as coll3,#0001 0100—>0101 —>选第一和第三
-> make_set(0,’a’,’b’,’c’) as coll4;
效果:
+———+——————+———-+———-+
| coll | coll2 | coll3 | coll4 |
+———+——————+———-+———-+
| a | hello,word | hello | |
+———+——————+———-+———-+
- 获取日期时间函数
mysql> select current_date(),curdate(),curdate()+0,
-> current_time(),curtime(),curtime()+0,
-> current_timestamp(),localtime(),now(),sysdate();
效果:
+————————+——————+——————-+————————+—————-+——————-+——————————-+——————————-+——————————-+——————————-+
| current_date() | curdate() | curdate()+0 | current_time() | curtime() | curtime()+0 | current_timestamp() | localtime() | now() | sysdate() |
+————————+——————+——————-+————————+—————-+——————-+——————————-+——————————-+——————————-+——————————-+
| 2019-02-25 | 2019-02-25 | 20190225 | 10:40:22 | 10:40:22 | 104022 | 2019-02-25 10:40:22 | 2019-02-25 10:40:22 | 2019-02-25 10:40:22 | 2019-02-25 10:40:22 |
+————————+——————+——————-+————————+—————-+——————-+——————————-+——————————-+——————————-+——————————-+s - 获取时间的数字,根据时间获取日期(互为反函数)
mysql> select unix_timestamp(),unix_timestamp(now()),now(),
-> from_unixtime(1523689758); - 返回当前时区日期和时间的函数,日期月份时间函数
mysql> select utc_time(),utc_time()+0,
-> utc_date(),utc_date()+0,
-> month(‘2016-03-04’),monthname(‘2016-03-04’),
-> dayname(‘2018-04-14’),dayofweek(‘2018-04-14’),
-> weekday(‘2018-04-14’);
效果:
+——————+———————+——————+———————+——————————-+————————————-+———————————-+————————————-+———————————-+
| utc_time() | utc_time()+0 | utc_date() | utc_date()+0 | month(‘2016-03-04’) | monthname(‘2016-03-04’) | dayname(‘2018-04-14’) | dayofweek(‘2018-04-14’) | weekday(‘2018-04-14’) |
+——————+———————+——————+———————+——————————-+————————————-+———————————-+————————————-+———————————-+
| 02:41:56 | 24156 | 2019-02-25 | 20190225 | 3 | March | Saturday | 7 | 5 |
+——————+———————+——————+———————+——————————-+————————————-+———————————-+————————————-+———————————-+ - 返回是这一年的第几周
mysql> select week(‘2018-4-16’),#默认0表示第一天从周末开始
-> week(‘2018-04-16’,1), #周一#返回是这一年的第几周
-> dayofyear(‘2018-4-16’),dayofmonth(‘2018-4-14’), #返回一年中的第几天
-> year(‘2018-4-14’),quarter(‘2018-4-14’),
-> minute(‘10:10:02’),second(“10:10:02”);
效果: - 获取指定日期的指定值的函数
mysql> select extract(year from ‘2018-07-06’) as coll,
-> extract(year_month from ‘2018-08-06’) as coll2,
-> extract(day_minute from ‘2018-07-06 10:11:05’) as coll3;
效果:
+———+————+———-+
| coll | coll2 | coll3 |
+———+————+———-+
| 2018 | 201808 | 61011 |
+———+————+———-+ - 时间和秒钟转换的函数
mysql> select time_to_sec(‘01:00:40’),
-> sec_to_time(3600);
效果: - 计算日期和时间的函数
mysql> select date_add(‘2010-12-31 23:59:59’,interval 1 second) as coll,
-> adddate(‘2010-12-31 23:59:59’,interval 1 second) as coll2,
-> date_add(‘2010-12-31 23:59:59’,interval ‘0:0:1’ hour_second) as coll3, #后面的hour_second要看表决定
-> date_sub(‘2011-01-02’,interval 31 day) as coll4,
-> subdate(‘2011-01-02’,interval 31 day) as coll5,
-> date_sub(‘2011-01-02 00:01:00’,interval ‘0 0:1:1’ day_second) as coll6; #对应位置的相减
效果:
+——————————-+——————————-+——————————-+——————+——————+——————————-+
| coll | coll2 | coll3 | coll4 | coll5 | coll6 |
+——————————-+——————————-+——————————-+——————+——————+——————————-+
| 2011-01-01 00:00:00 | 2011-01-01 00:00:00 | 2011-01-01 00:00:00 | 2010-12-02 | 2010-12-02 | 2011-01-01 23:59:59 |
+——————————-+——————————-+——————————-+——————+——————+——————————-+ - 直接输入两个时间,计算
mysql> select addtime(‘2000-12-31 23:59:59’,’1:1:1’) as coll,
-> subtime(‘2000-12-31 23:59:59’,’1:1:1’)as coll2,
-> datediff(‘2000-12-28’,’2001-01-03’) as coll3; #前面的减后面的
+——————————-+——————————-+———-+
| coll | coll2 | coll3 |
+——————————-+——————————-+———-+
| 2001-01-01 01:01:00 | 2000-12-31 22:58:58 | -6 |
+——————————-+——————————-+———-+ - 时间日期格式化函数
mysql> select date_format(‘1997-10-04 22:23:00’,’%W %M %Y’) as coll,
-> date_format(‘1997-10-04 22:23:00’,’%D %y %a %d %m %b %j’),
-> time_format(‘16:00:00’,’%H %k %h %I %l’),
-> date_format(‘2000-10-05 22:23:00’,get_format(date,’USA’));
效果: - 条件约束函数
mysql> select if(1>2,2,3),
-> ifNull(null,10),ifNull(1/0,100),
-> case 2 when 1 then ‘one’ when 2 then ‘two’ when 3 then ‘three’ else ‘more’ end, #2等于后面的2返回后面的then
-> case when 1>2 then ‘a’ else ‘b’ end;
效果:
+——————-+————————-+————————-+————————————————————————————————————————+——————————————————-+
| if(1>2,2,3) | ifNull(null,10) | ifNull(1/0,100) | case 2 when 1 then ‘one’ when 2 then ‘two’ when 3 then ‘three’ else ‘more’ end | case when 1>2 then ‘a’ else ‘b’ end |
+——————-+————————-+————————-+————————————————————————————————————————+——————————————————-+
| 3 | 10 | 100.0000 | two | b |
+——————-+————————-+————————-+————————————————————————————————————————+——————————————————-+ - 系统信息函数
mysql> show processlist;#输出当前用户的连接信息 - 获取字符串的字符集和排列方式的函数
mysql> select charset(‘abc’),charset(convert(‘abc’ using latin1)),
-> charset(version()), #获取字符集
-> collation(‘abc’),collation(convert(‘abc’ using utf8));#获取排列方式
效果: - IP地址与数字相互转换的函数
mysql> select inet_aton(‘209.207.224.40’),inet_ntoa(3520061480),
-> #枷锁函数和解锁函数
-> get_lock(‘lock1’,10),#这个锁持续10秒
-> is_used_lock(‘lock1’), #返回当前连接ID
-> is_free_lock(‘lock1’), #是否是可用的
-> release_lock(‘lock1’); - 重复执行指定操作的函数
mysql> select benchmark(5000,password(‘newpad’)),
-> charset(‘abc’),charset(convert(‘abc’ using latin1)),#改变字符集的函数
-> cast(100 as char(2)),convert(‘2010-10-11 12:12:12’,time);#改变数据类型的函数
效果:
+——————————————————+————————+———————————————————+———————————+——————————————————-+
| benchmark(5000,password(‘newpad’)) | charset(‘abc’) | charset(convert(‘abc’ using latin1)) | cast(100 as char(2)) | convert(‘2010-10-11 12:12:12’,time) |
+——————————————————+————————+———————————————————+———————————+——————————————————-+
| 0 | utf8 | latin1 | 10 | 12:12:12 |
+——————————————————+————————+———————————————————+———————————+——————————————————-+
- 常用的mysql命令
- mysql之like模糊查询
- 数据表的基本操作
- 修改表字段的数据类型,把name列的数据类型改为varchar(33)
alter table tb_dept1 modify name varchar(33); - 修改表的字段名,不改数据类型 将tb_dept1中的location字段改成loc
alter table tb_dept1 change location loc varchar(50);
# 修改表的字段名,并且改变数据类型, 同时改变数据类型
alter table tb_dept1 change loc location varchar(60);
change也可以只改变数据类型,但是一般不要轻易改变数据类型。 - 添加字段(默认在最后面添加)
alter table tb_dept1 add managerID int(10);
# 添加字段(默认在最后面添加)(非空约束)
alter table tb_dept1 add column1 int(10) not null;
# 添加字段(在第一个位置添加)
alter table tb_dept1 add column2 int(10) first;
# 添加字段(在指定位置后面添加)
alter table tb_dept1 add column3 int(10) after name; - 删除字段, 删除tb_dept1的column3字段
alter table tb_dept1 drop column3; - 修改字段的排列位置(改到第一个位置)
alter table tb_dept1 modify column1 int(10) first;
# 修改字段的位置为指定的位置
alter table tb_dept1 modify column2 int(10) after name; - 查看数据表的定义
show create table tb_deptment3;
# 更改数据表的引擎
alter table tb_deptment3 engine = MyISAM; - 3、删除数据表
- 删除表
drop table if exists tb_emp9;
注意注意: 删除有关联的数据表的父表的时候,先删除外键再删除父表 - 数据的基本操作
- Mysql排序
- Mysql分组
- Mysql连接
- limit的使用
- MySQL中查询sql语句的运行时间
- binary关键字
- Mysql一些语句
- Mysql优化
基本数据类型
MySQL基本数据类型
主要分为数值型,浮点型,日期/时间吗,字符串(字符)型和二进制型。
unsigned:无符号的,只能是正数。signed:有符号数,可能是正数也可能是负数,浮点数默认是有符号数。
1.数值型
2.浮点型
3.日期/时间
timestamp:时间戳类型,就是指一个时间的数据值,本质是一个数字,一个重要作用就是能够自动获得时间戳的数据值。
4.字符型
varchar :变长字符串 使用时必须设定长度,最大值理论值65535个
char :定长字符串,使用时需要设定长度,不设定默认为1,最大理论值255个,适用于存储的数据都是可预见的明确的固定长度的字符,如手机号,身份证号码
5.二进制类型
blob类型:小图片用blob类型,最大长度64K,
mediumblob类型:大图片使用mediumblob,最大是16M
longblob类型:最大长度是4G
6.特殊类型
enum (枚举类型)单选项字符串数据类型:只能插入指定的数据格式,否则会报错。
mysql-> create table user3(id int primary key auto_increment,
-> name varchar(10),
-> sex enum(‘boy’,’girl’)
-> );
mysql> insert into user3(name,sex)
-> values
-> (“zhang”,”boy”),
-> (“wang”,”girl”);
mysql> select * from user3;
+——+———-+———+
| id | name | sex |
+——+———-+———+
| 1 | zhang | boy |
| 2 | wang | girl |
+——+———-+———+
set (集合类型)多选字符串的数据类型:适用于存储表单界面的多选项值
mysql> create table user4(
-> id int primary key auto_increment,
-> name varchar(10),
-> hobby set(‘zhang’,’wang’,’li’,’yang’)
-> );
mysql> insert into user4(hobby)
-> values
-> (“zhang,wang”);
mysql> select hobby as 爱好 from user4;
+——————+
| 爱好 |
+——————+
| zhang,wang |
+——————+
如何选择数据类型
1)、整数和浮点数
如果不需要小数部分,则使用整数来保存数据;
如果需要表示小数部分,则使用浮点数类型。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。 例如,如果列的值的范围为 1-99999, 若使用整数,则MEDIUMINT UNSIGNED 是最好的类型,若需要存储小数,则使用 FLOAT 类型。
浮点类型包括 FLOAT 和 DOUBLE 类型。DOUBLE 类型精度比 FLOAT 类型高,因此,如要求存储精度较高时,应选择 DOUBLE 类型。
2)、浮点数和定点数
浮点数FLOAT、DOUBLE 相对于定点数 DECIMAL 的优势是: 在长度一定的情况下, 浮点数能表示更大的数据范围,但是由于浮点数容易产生误差。
因此对精确度要求比较高时,建议使用DECIMAL 来存储。DECIMAL 在 MySQL 中是以字符串存储的,用于定义货币等对精确度要求较高的数据。另外两个浮点数进行减法和比较运算时也容易出问题,因此在进行计算的时候,一定要小心。如果进行数值比较,最好使用 DECIMAL 类型。
3)、日期和时间类型
MySQL 对于不同种类的日期和时间有很多的数据类型,比如 YEAR 和 TIME。如果只需要记录年份,则使用YEAR 类型即可; 如果只记录时间,只需使用TIME 类型。
如果同时需要记录日期和时间,则可以使用 TIMESTAMP 或者 DATETIME 类型。由于TIMESTAMP 列的取值范围小于 DATETIME 的取值范围,因此存储范围较大的日期最好使用DATETIME。
TIMESTAMP 也有一个DATETIME 不具备的属性。默认的情况下,当插入一条记录但并没有指定 TIMESTAMP 这个列值时,MySQL 会把 TIMESTAMP 列设为当前的时间。因此当需要插入记录同时插入当前时间时,使用TIMESTAMP 是方便的,另外 TIMESTAMP 在空间上比 DATETIME 更有效。
4)、char和varchar
char和varchar的区别:
- char是固定长度字符,varchar是可变长度字符;
- CHAR 会自动删除插入数据的尾部空格,VARCHAR 不会删除尾部空格。
CHAR 是固定长度,所以它的处理速度比 VARCHAR 的速度要快,但是它的缺点就是浪费存储空间。所以对存储不大,但在速度上有要求的可以使用 CHAR 类型,反之可以使用VARCHAR 类型来实现。
存储引擎对于选择 CHAR 和 VARCHAR 的影响:
- 对于MYyISAM 存储引擎: 最好使用固定长度(char)的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。
- 对于 InnoDB 存储引擎: 使用可变长度(varchar)的数据列,因为 InnoDB 数据表的存储格式不分固定长度和可变长度,因此使用 CHAR 不一定比使用 VARCHAR 更好,但由于VARCHAR 是按照实际的长度存储,比较节省空间,所以对磁盘 IO 和数据存储总量比较好。
5)、ENUM和SET
ENUM 只能取单值, 它的数据列表是一个枚举集合。它的合法取值列表最多允许有 65 535个成员。因此,在需要从多个值中选取一个时,可以使用 ENUM。比如: 性别字段适合定义为 ENUM 类型,每次只能从“男”或“女”中取一个值。
SET 可取多值。它的合法取值列表最多允许有 64 个成员。空字符串也是一个合法的 SET值。在需要取多个值的时候,适合使用 SET 类型,比如: 要存储一个人兴趣爱好,最好使用SET 类型 。
ENUM 和 SET 的值是以字符串形式出现的,但在内部,MySQL 以数值的形式存储它们。6)、BLOB和TEXT
BLOB 是二进制字符串,TEXT 是非二进制字符串,两者均可存放大容量的信息。BLOB主要存储图片、音频信息等,而 TEXT 只能存储纯文本文件。常见运算符介绍
1)、运算符概述
总共有四大类:
- 算术运算符
算术运算符用于各类数值运算,包括加 (+) 、减 (-) 、乘 (+) 、除 (/) 、求余(或称模运算,%) 。
- 比较运算符
比较运算符用于比较运算。包括大于 (>) 、小于 (<) 、等于 (=) 、大于等于 (>=) 、小于等于 (<=) 、不等于 (!=) ,以及IN、BETWEEN AND、IS NULL、GREATEST、LEAST、LIKE、REGEXP等。
- 逻辑运算符
逻辑运算符的求值所得结果均为1 (TRUE) 、0 (FALSE) ,这类运算符有逻辑非 (NOT或者!) 、逻辑与 (AND 或者&&) 、逻辑或 (OR 或者|) 、逻辑异或 C(XOR) 。
- 位操作运算符
位操作运算符参与运算的操作数按二进制位进行运算。包括位与(&) 、位或 (|) 、位非(~) 、位异或 (^) 、左移 (<<) 、右移 (>>) 6种。
2)、算数运算符
3)、比较运算符
注意一下比较运算符
数值比较有如下规则:
- 若有一个或两个参数为NULL,则比较运算的结果为NULL;
- 若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较;
- 若两个参数均为整数,则按照整数进行比较;
- 若一个字符串和数字进行相等判断,则 MySQL 可以自动将字符串转换为数字;
安全等于运算符
这个操作符和=操作符执行相同的比较操作,不过<=>可以用来判断 NULL 值。在两个操作数均为NULL 时,其返回值为 1 而不为NULL;而当一个操作数为 NULL 时,其返回值为0而不为NULL。
<=>在执行比较操作时和”=”的作用是相似的,唯一的区别是<=>可以来对NULL进行判断,两者都为NULL时返回1。
不等于运算符<>或者!=:
“<>”或者”!=”用于判断数字、字符串、表达式不相等的判断。如果不相等,返回值为 1; 否则返回值为 0。这两个运算符不能用于判断空值 NULL。
LEAST运算符
语法格式为:
LEAST(值 1,值 2…,值m)
其中值 n 表示参数列表中有n个值。在有两个或多个参数的情况下, 返回最小值。假如任意一个自变量为NULL,则LEAST()的返回值为NULL。
GREATEST
语法格式:GREATEST(值1, 值2, 值3) ,其中n表示参数列表中有n个值。当有2个或多个参数时,返回为最大值,假如任意一个自变量为NULL,则GREATEST()的返回值为NULL。
LIKE
正则表达式REGEXP
看一个例子
select ‘ssky’ regexp ‘^s’,’ssky’ regexp ‘y$’, ‘ssky’ regexp ‘.sky’, ‘ssky’ regexp ‘[ab]’;
效果
s
4)、逻辑运算符
5)、位运算
6)、运算符优先级
数据库储存引擎
查看引擎命令
show engines; //查看系统所支持的引擎类型:
show variables like ‘%storage_engine’; //查看mysql引擎
show create table tablename; //可以查看某个表所使用的引擎
InnoDB引擎
InnoDB 是事务型数据库的首选引擎,支持事务安全表 (ACID ) ,支持行锁定和外键。
InnoDB 作为默认存储引擎,特性有:
- InnoDB 给 MySQL 提供了具有提交、回滚和崩溃恢复能力的事务安全 (ACID 兼容)存储引擎。InnoDB 锁定在行级并且也在 SELECT 语句中提供一个类似 Oracle 的非锁定读。这些功能增加了多用户部署和性能。在 SQL 查询中,可以自由地将 InnoDB 类型的表与其他MySQL 的表的类型混合起来,甚至在同一个查询中也可以混合。
- InnoDB 是为处理巨大数据量的最大性能设计。它的 CPU 效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
- InnoDB 存储引擎完全与 MySQL 服务器整合,InnoDB 存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB 将它的表和索引存在一个逻辑表空间中,表空间可以包含数个文件〈或原始磁盘分区) 。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,,即使在文件尺寸被限制为 2GB 的操作系统上。
- InnoDB 支持外键完整性约束 (FOREIGN KEY) 。存储表中的数据时, 每张表的存储都按主键顺序存放, 如果没有显示在表定义时指定主键,InnoDB 会为每一行生成一个 6B 的ROWID,并以此作为主键。
- InnoDB 被用在众多需要高性能的大型数据库站点上。
InnoDB 不创建目录,使用 InnoDB 时,MySQL 将在 MySQL 数据目录下创建一个名为ibdata1 的 10MB 大小的自动扩展数据文件,以及两个名为ib_logfile0 和ib_logfilel的 5MB大小的日志文件。
MyISAM引擎
MyISAM 基于 ISAM 的存储引擎,并对其进行扩展。它是在 Web、数据存储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事务。在MyISAM 主要特性有:
大文件 (达 63 位文件长度) 在支持大文件的文件系统和操作系统上被支持。
- 当把删除、更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块来自动完成。
- 每个 MyISAM 表最大索引数是 64,这可以通过重新编译来改变。每个索引最大的列数是 16 个。
- 最大的键长度是 1000B,这也可以通过编译来改变。对于键长度超过 250B 的情况,一个超过 1024B 的键将被用上。
- BLOB 和TEXT 列可以被索引。
- NULL 值被允许在索引的列中。这个值占每个键的 0~1 个字节。
- 所有数字键值以高字节优先被存储以允许一个更高的索引压缩。
- 每表一个AUTO_INCREMENT 列的内部处理。MyISAM 为 INSERT 和 UPDATE 操作自动更新这一列。这使得 AUTO_INCREMENT列更快〈至少 10%) 。在序列顶的值被删除之后就不能再利用。
- 可以把数据文件和索引文件放在不同目录。
- 每个字符列可以有不同的字符集。
- 有VARCHAR 的表可以固定或动态记录长度。
- VARCHAR 和CHAR 列可以多达 64KB。
使用 MyISAM 引擎创建数据库,将生产 3 个文件。文件的名字以表的名字开始,扩展名指出文件类型, frm文件存储表定义,数据文件的扩展名为.MYD (MYData),索引文件的扩展名是.MYI MYIndex) 。
MEMORY引擎
MEMORY 存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。MEMORY 主要特性有:
- MEMORY 表的每个表可以有多达 32 个索引,每个索引 16 列,以及 500B 的最大键长度。
- MEMORY 存储引擎执行 HASH 和 BTREE 索引。
- 可以在一个MEMORY 表中有非唯一键。
- MEMORY 表使用一个固定的记录长度格式。
- MEMORY 不支持BLOB 或TEXT 列。
- MEMORY 支持 AUTO_INCREMENT 列和对可包含NULL 值的列的索引。
- MEMORY 表在所有客户端之间共享 (就像其他任何非 TEMPORARY 表) 。
- MEMORY 表内容被存在内存中,内存是 MEMORY 表和服务器在查询处理时的空闲中创建的内部表共享。
当不再需要 MEMORY 表的内容时,要释放被 MEMORY 表使用的内存,应该执行DELETE FROM 或TRUNCATE TABLE,或者删除整个表 〈使用DROP TABLE) 。
存储引擎的选择
不同存储引擎都有各自的特点,以适应不同的需求。下面是各种引擎的不同的功能:
如果要提供提交、回滚和崩溃恢复能力的事务安全 (ACID 兼容) 能力,并要求实现并发控制,InnoDB 是个很好的选择;
- 如果数据表主要用来插入和查询记录,则 MyISAM 引擎能提供较高的处理效率;
- 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的 Memory 引擎,MySQL 中使用该引擎作为临时表,存放查询的中间结果;
- 如果只有 INSERT 和 SELECT 操作,可以选择 Archive 引擎,Archive 存储引擎支持高并发的插入操作,但是本身并不是事务安全的。Archive 存储引擎非常适合存储归档数据,如记录日志信息可以使用 Archive 引擎。
使用哪一种引擎要根据需要灵活选择, 一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求。使用合适的存储引擎,将会提高整个数据库的性能。
索引
B+Tree原理
Mysql函数
1、数学函数
1)、绝对值,π,平方根,去余函数(适用小数)
绝对值,π,平方根,去余函数(适用小数)
mysql> select abs(-1),pi(),sqrt(9),Mod(31,8),Mod(45.5,6);
效果:
+————-+—————+————-+—————-+——————-+
| abs(-1) | pi() | sqrt(9) | Mod(31,8) | Mod(45.5,6) |
+————-+—————+————-+—————-+——————-+
| 1 | 3.141593 | 3 | 7 | 3.5 |
+————-+—————+————-+—————-+——————-+
2)、获取整数的函数
获取整数的函数
mysql> select ceil(-3.5),ceiling(3.5),floor(-3.5),floor(3.5);
效果:
+——————+———————+——————-+——————+
| ceil(-3.5) | ceiling(3.5) | floor(-3.5) | floor(3.5) |
+——————+———————+——————-+——————+
| -3 | 4 | -4 | 3 |
+——————+———————+——————-+——————+
3)、获取随机数的函数
获取随机数的函数
mysql> select rand(),rand(),rand(10),rand(10);
效果:
+——————————+——————————-+——————————+——————————+
| rand() | rand() | rand(10) | rand(10) |
+——————————+——————————-+——————————+——————————+
| 0.9031498375378082 | 0.46329259729319494 | 0.6570515219653505 | 0.6570515219653505 |
+——————————+——————————-+——————————+——————————+
可以看到前面两个不同,后面两个指定了种子所以相同。
4)、Round函数(四舍五入函数),truncate()函数
Round函数(四舍五入函数),truncate()函数
mysql> select round(3.4),(3.6),round(3.16,1),round(3.16,0),round(232.28,-1),truncate(1.31,1),truncate(1.99,1),truncate(19.99,-1);
效果:
+——————+——-+———————-+———————-+—————————+—————————+—————————+——————————+
| round(3.4) | 3.6 | round(3.16,1) | round(3.16,0) | round(232.28,-1) | truncate(1.31,1) | truncate(1.99,1) | truncate(19.99,-1) |
+——————+——-+———————-+———————-+—————————+—————————+—————————+——————————+
| 3 | 3.6 | 3.2 | 3 | 230 | 1.3 | 1.9 | 10 |
+——————+——-+———————-+———————-+—————————+—————————+—————————+——————————+
5)、符号函数,幂运算函数pow,power,exp()
符号函数,幂运算函数pow,power,exp()//e的x乘方
mysql> select sign(-21),sign(0),sign(21),pow(2,2),power(2,-2),exp(2);
效果:
+—————-+————-+—————+—————+——————-+—————————+
| sign(-21) | sign(0) | sign(21) | pow(2,2) | power(2,-2) | exp(2) |
+—————-+————-+—————+—————+——————-+—————————+
| -1 | 0 | 1 | 4 | 0.25 | 7.38905609893065 |
+—————-+————-+—————+—————+——————-+—————————+
6)、自然对数运算和以10为底的对数运算,弧度,角度 radians角度转弧度,弧度转角度
自然对数运算和以10为底的对数运算,弧度,角度 radians角度转弧度,弧度转角度
mysql> select log(3),log(-3),log10(100),log10(-100),radians(180),degrees(pi()/2);
效果:
+——————————+————-+——————+——————-+—————————-+————————-+
| log(3) | log(-3) | log10(100) | log10(-100) | radians(180) | degrees(pi()/2) |
+——————————+————-+——————+——————-+—————————-+————————-+
| 1.0986122886681098 | NULL | 2 | NULL | 3.141592653589793 | 90 |
+——————————+————-+——————+——————-+—————————-+————————-+
7)、正弦函数余弦函数
正弦函数余弦函数
mysql> select sin(pi()/2),degrees(asin(1)),cos(pi()),degrees(acos(-1)),round(tan(pi()/4)),degrees(atan(1)),cot(pi()/4);
效果:
+——————-+—————————+—————-+—————————-+——————————+—————————+——————————+
| sin(pi()/2) | degrees(asin(1)) | cos(pi()) | degrees(acos(-1)) | round(tan(pi()/4)) | degrees(atan(1)) | cot(pi()/4) |
+——————-+—————————+—————-+—————————-+——————————+—————————+——————————+
| 1 | 90 | -1 | 180 | 1 | 45 | 1.0000000000000002 |
+——————-+—————————+—————-+—————————-+——————————+—————————+——————————+
2、字符串函数
1)、字符串函数、concat_ws忽略空值null
字符串函数,concat_ws忽略空值null
mysql> select char_length(‘aab’),length(‘aabb’),concat(‘My sql ‘,’5.7’),concat(‘My’,null,’sql’),concat_ws(‘-‘,’a’,’b’,’c’),concat_ws(‘*’,’aa’,null,’bb’);
效果:
+——————————+————————+————————————-+————————————-+——————————————+———————————————-+
| char_length(‘aab’) | length(‘aabb’) | concat(‘My sql ‘,’5.7’) | concat(‘My’,null,’sql’) | concat_ws(‘-‘,’a’,’b’,’c’) | concat_ws(‘‘,’aa’,null,’bb’) |
+——————————+————————+————————————-+————————————-+——————————————+———————————————-+
| 3 | 4 | My sql 5.7 | NULL | a-b-c | aabb |
+——————————+————————+————————————-+————————————-+——————————————+———————————————-+
2)、替换字符串的函数
替换字符串的函数
mysql> select insert(‘Quest’,2,4,’What’) as Coll,insert(‘Quest’,-1,4,’What’) as Coll2,insert(‘Quest’,3,100,’Wh’) as Coll3;
效果:
+———-+———-+———-+
| Coll | Coll2 | Coll3 |
+———-+———-+———-+
| QWhat | Quest | QuWh |
+———-+———-+———-+
3)、大小写转换、获取指定长度字符串的函数left,right
大小写转换,获取指定长度字符串的函数left,right;
mysql> select lower(‘ZHENGXIN’),lcase(‘ZHENGXIN’),upper(‘zhengxin’),ucase(‘zhengxin’),left(‘football’,5),right(‘football’,5);
效果:
+—————————-+—————————-+—————————-+—————————-+——————————+——————————-+
| lower(‘ZHENGXIN’) | lcase(‘ZHENGXIN’) | upper(‘zhengxin’) | ucase(‘zhengxin’) | left(‘football’,5) | right(‘football’,5) |
+—————————-+—————————-+—————————-+—————————-+——————————+——————————-+
| zhengxin | zhengxin | ZHENGXIN | ZHENGXIN | footb | tball |
+—————————-+—————————-+—————————-+—————————-+——————————+——————————-+
4)、填充字符串的函数,删除空格的函数
填充字符串的函数,删除空格的函数
mysql> select lpad(‘hello’,4,’‘),lpad(‘hello’,10,’‘),
-> rpad(‘hello’,10,’*’),concat(‘(‘,ltrim(‘ book ‘),’)’),
-> concat(‘(‘,rtrim(‘ book ‘),’)’),
-> concat(‘(‘,trim(‘ book ‘),’)’),
-> trim(‘xy’ from ‘xyxyabababxyxy’);
效果:
+——————————-+———————————+———————————+——————————————————-+——————————————————-+——————————————————+—————————————————+
| lpad(‘hello’,4,’‘) | lpad(‘hello’,10,’‘) | rpad(‘hello’,10,’‘) | concat(‘(‘,ltrim(‘ book ‘),’)’) | concat(‘(‘,rtrim(‘ book ‘),’)’) | concat(‘(‘,trim(‘ book ‘),’)’) | trim(‘xy’ from ‘xyxyabababxyxy’) |
+——————————-+———————————+———————————+——————————————————-+——————————————————-+——————————————————+—————————————————+
| hell | **hello | hello* | (book ) | ( book) | (book) | ababab |
+——————————-+———————————+———————————+——————————————————-+——————————————————-+——————————————————+—————————————————+
5)、重复生成,空格函数,替换函数,比较大小的函数
重复生成,空格函数,替换函数,比较大小的函数
mysql> select repeat(‘mysql’,3),concat(‘(‘,space(6),’)’),
-> replace(‘xxx.baidu.com’,’x’,’w’),strcmp(‘abc’,’abd’);
效果:
+—————————-+—————————————+—————————————————+——————————-+
| repeat(‘mysql’,3) | concat(‘(‘,space(6),’)’) | replace(‘xxx.baidu.com’,’x’,’w’) | strcmp(‘abc’,’abd’) |
+—————————-+—————————————+—————————————————+——————————-+
| mysqlmysqlmysql | ( ) | www.baidu.com | -1 |
+—————————-+—————————————+—————————————————+——————————-+
6)、获取子串的函数
获取子串的函数
mysql> select substring(‘breakfast’,5) as coll,
-> substring(‘breakfast’,3,5) as coll2,
-> substring(‘breakfast’,-3) as coll3, #从后面开始截取3个
-> substring(‘breakfast’,-1,4) as coll4; #从结尾开始第一个位置截取四个
效果:
+———-+———-+———-+———-+
| coll | coll2 | coll3 | coll4 |
+———-+———-+———-+———-+
| kfast | eakfa | ast | t |
+———-+———-+———-+———-+
注意还有一个MID函数和substring作用是一样的
#匹配字串开始的位置,字符串逆序
mysql> select locate(‘ball’,’football’),position(‘ball’in’football’),
-> instr(‘football’,’ball’),reverse(‘abc’);
效果:
+—————————————-+———————————————+—————————————+————————+
| locate(‘ball’,’football’) | position(‘ball’in’football’) | instr(‘football’,’ball’) | reverse(‘abc’) |
+—————————————-+———————————————+—————————————+————————+
| 5 | 5 | 5 | cba |
+—————————————-+———————————————+—————————————+————————+
7)、返回指定位置的值,返回指定字符串的位置的函数
返回指定位置的值,返回指定字符串的位置的函数
mysql> select elt(3,’a’,’b’,’c’),elt(2,’a’),
-> field(‘Hi’,’hihi’,’Hey’,’Hi’,’bas’) as coll,
-> field(‘Hi’,’hihi’,’a’,’b’) as coll2,
-> find_in_set(‘Hi’,’hihi,Hey,Hi,bas’); #返回字串位置的函数
效果:
+——————————+——————+———+———-+——————————————————-+
| elt(3,’a’,’b’,’c’) | elt(2,’a’) | coll | coll2 | find_in_set(‘Hi’,’hihi,Hey,Hi,bas’) |
+——————————+——————+———+———-+——————————————————-+
| c | NULL | 3 | 0 | 3 |
+——————————+——————+———+———-+——————————————————-+
8)、make_set()函数的使用
make_set()函数的使用
mysql> select make_set(1,’a’,’b’,’c’) as coll,#0001选第一个
-> make_set(1|4, ‘hello’,’nice’,’word’) as coll2, #0001 0100—>0101 —>选第一和第三
-> make_set(1|4,’hello’,’nice’,null,’word’) as coll3,#0001 0100—>0101 —>选第一和第三
-> make_set(0,’a’,’b’,’c’) as coll4;
效果:
+———+——————+———-+———-+
| coll | coll2 | coll3 | coll4 |
+———+——————+———-+———-+
| a | hello,word | hello | |
+———+——————+———-+———-+
3、日期和时间函数
1)、获取日期时间函数
获取日期时间函数
mysql> select current_date(),curdate(),curdate()+0,
-> current_time(),curtime(),curtime()+0,
-> current_timestamp(),localtime(),now(),sysdate();
效果:
+————————+——————+——————-+————————+—————-+——————-+——————————-+——————————-+——————————-+——————————-+
| current_date() | curdate() | curdate()+0 | current_time() | curtime() | curtime()+0 | current_timestamp() | localtime() | now() | sysdate() |
+————————+——————+——————-+————————+—————-+——————-+——————————-+——————————-+——————————-+——————————-+
| 2019-02-25 | 2019-02-25 | 20190225 | 10:40:22 | 10:40:22 | 104022 | 2019-02-25 10:40:22 | 2019-02-25 10:40:22 | 2019-02-25 10:40:22 | 2019-02-25 10:40:22 |
+————————+——————+——————-+————————+—————-+——————-+——————————-+——————————-+——————————-+——————————-+s
2)、获取时间的数字,根据时间获取日期(互为反函数)
获取时间的数字,根据时间获取日期(互为反函数)
mysql> select unix_timestamp(),unix_timestamp(now()),now(),
-> from_unixtime(1523689758);
效果:
+—————————+———————————-+——————————-+—————————————-+
| unix_timestamp() | unix_timestamp(now()) | now() | from_unixtime(1523689758) |
+—————————+———————————-+——————————-+—————————————-+
| 1551062468 | 1551062468 | 2019-02-25 10:41:08 | 2018-04-14 15:09:18 |
+—————————+———————————-+——————————-+—————————————-+
3)、返回当前时区日期和时间的函数,日期月份时间函数
返回当前时区日期和时间的函数,日期月份时间函数
mysql> select utc_time(),utc_time()+0,
-> utc_date(),utc_date()+0,
-> month(‘2016-03-04’),monthname(‘2016-03-04’),
-> dayname(‘2018-04-14’),dayofweek(‘2018-04-14’),
-> weekday(‘2018-04-14’);
效果:
+——————+———————+——————+———————+——————————-+————————————-+———————————-+————————————-+———————————-+
| utc_time() | utc_time()+0 | utc_date() | utc_date()+0 | month(‘2016-03-04’) | monthname(‘2016-03-04’) | dayname(‘2018-04-14’) | dayofweek(‘2018-04-14’) | weekday(‘2018-04-14’) |
+——————+———————+——————+———————+——————————-+————————————-+———————————-+————————————-+———————————-+
| 02:41:56 | 24156 | 2019-02-25 | 20190225 | 3 | March | Saturday | 7 | 5 |
+——————+———————+——————+———————+——————————-+————————————-+———————————-+————————————-+———————————-+
注意dayofweek和weekday的差别:
- DAYOFWEEK(d)函数返回d对应的一周中的索引(位置)。1表示周日,2表示周一,….,7表示周六;
- WEEKDAY(d)返回d对应的工作日索引。0表示周一,1表示周二,…,6表示周日;
返回是这一年的第几周
mysql> select week(‘2018-4-16’),#默认0表示第一天从周末开始
-> week(‘2018-04-16’,1), #周一#返回是这一年的第几周
-> dayofyear(‘2018-4-16’),dayofmonth(‘2018-4-14’), #返回一年中的第几天
-> year(‘2018-4-14’),quarter(‘2018-4-14’),
-> minute(‘10:10:02’),second(“10:10:02”);
效果:
+—————————-+———————————+————————————+————————————-+—————————-+———————————+——————————+——————————+
| week(‘2018-4-16’) | week(‘2018-04-16’,1) | dayofyear(‘2018-4-16’) | dayofmonth(‘2018-4-14’) | year(‘2018-4-14’) | quarter(‘2018-4-14’) | minute(‘10:10:02’) | second(“10:10:02”) |
+—————————-+———————————+————————————+————————————-+—————————-+———————————+——————————+——————————+
| 15 | 16 | 106 | 14 | 2018 | 2 | 10 | 2 |
+—————————-+———————————+————————————+————————————-+—————————-+———————————+——————————+——————————+
4)、获取指定日期的指定值的函数
获取指定日期的指定值的函数
mysql> select extract(year from ‘2018-07-06’) as coll,
-> extract(year_month from ‘2018-08-06’) as coll2,
-> extract(day_minute from ‘2018-07-06 10:11:05’) as coll3;
效果:
+———+————+———-+
| coll | coll2 | coll3 |
+———+————+———-+
| 2018 | 201808 | 61011 |
+———+————+———-+
5)、时间和秒钟转换的函数
时间和秒钟转换的函数
mysql> select time_to_sec(‘01:00:40’),
-> sec_to_time(3600);
效果:
+————————————-+—————————-+
| time_to_sec(‘01:00:40’) | sec_to_time(3600) |
+————————————-+—————————-+
| 3640 | 01:00:00 |
+————————————-+—————————-+
6)、计算日期和时间的函数
计算日期和时间的函数
mysql> select date_add(‘2010-12-31 23:59:59’,interval 1 second) as coll,
-> adddate(‘2010-12-31 23:59:59’,interval 1 second) as coll2,
-> date_add(‘2010-12-31 23:59:59’,interval ‘0:0:1’ hour_second) as coll3, #后面的hour_second要看表决定
-> date_sub(‘2011-01-02’,interval 31 day) as coll4,
-> subdate(‘2011-01-02’,interval 31 day) as coll5,
-> date_sub(‘2011-01-02 00:01:00’,interval ‘0 0:1:1’ day_second) as coll6; #对应位置的相减
效果:
+——————————-+——————————-+——————————-+——————+——————+——————————-+
| coll | coll2 | coll3 | coll4 | coll5 | coll6 |
+——————————-+——————————-+——————————-+——————+——————+——————————-+
| 2011-01-01 00:00:00 | 2011-01-01 00:00:00 | 2011-01-01 00:00:00 | 2010-12-02 | 2010-12-02 | 2011-01-01 23:59:59 |
+——————————-+——————————-+——————————-+——————+——————+——————————-+
7)、直接输入两个时间,计算
直接输入两个时间,计算
mysql> select addtime(‘2000-12-31 23:59:59’,’1:1:1’) as coll,
-> subtime(‘2000-12-31 23:59:59’,’1:1:1’)as coll2,
-> datediff(‘2000-12-28’,’2001-01-03’) as coll3; #前面的减后面的
+——————————-+——————————-+———-+
| coll | coll2 | coll3 |
+——————————-+——————————-+———-+
| 2001-01-01 01:01:00 | 2000-12-31 22:58:58 | -6 |
+——————————-+——————————-+———-+
注意日期的一些区别:
日期和时间格式化的函数
8)、时间日期格式化函数
时间日期格式化函数
mysql> select date_format(‘1997-10-04 22:23:00’,’%W %M %Y’) as coll,
-> date_format(‘1997-10-04 22:23:00’,’%D %y %a %d %m %b %j’),
-> time_format(‘16:00:00’,’%H %k %h %I %l’),
-> date_format(‘2000-10-05 22:23:00’,get_format(date,’USA’));
效果:
+———————————-+—————————————————————————————-+—————————————————————+—————————————————————————————-+
| coll | date_format(‘1997-10-04 22:23:00’,’%D %y %a %d %m %b %j’) | time_format(‘16:00:00’,’%H %k %h %I %l’) | date_format(‘2000-10-05 22:23:00’,get_format(date,’USA’)) |
+———————————-+—————————————————————————————-+—————————————————————+—————————————————————————————-+
| Saturday October 1997 | 4th 97 Sat 04 10 Oct 277 | 16 16 04 04 4 | 10.05.2000 |
+———————————-+—————————————————————————————-+—————————————————————+—————————————————————————————-+
4、条件判断函数
条件约束函数
mysql> select if(1>2,2,3),
-> ifNull(null,10),ifNull(1/0,100),
-> case 2 when 1 then ‘one’ when 2 then ‘two’ when 3 then ‘three’ else ‘more’ end, #2等于后面的2返回后面的then
-> case when 1>2 then ‘a’ else ‘b’ end;
效果:
+——————-+————————-+————————-+————————————————————————————————————————+——————————————————-+
| if(1>2,2,3) | ifNull(null,10) | ifNull(1/0,100) | case 2 when 1 then ‘one’ when 2 then ‘two’ when 3 then ‘three’ else ‘more’ end | case when 1>2 then ‘a’ else ‘b’ end |
+——————-+————————-+————————-+————————————————————————————————————————+——————————————————-+
| 3 | 10 | 100.0000 | two | b |
+——————-+————————-+————————-+————————————————————————————————————————+——————————————————-+
5、系统信息函数
系统信息函数
mysql> show processlist;#输出当前用户的连接信息
效果:
+——+———+—————-+——————+————-+———+—————+—————————+
| Id | User | Host | db | Command | Time | State | Info |
+——+———+—————-+——————+————-+———+—————+—————————+
| 2 | root | localhost | learnmysql | Query | 0 | starting | show processlist |
+——+———+—————-+——————+————-+———+—————+—————————+
1 row in set (0.00 sec)
获取字符串的字符集和排列方式的函数
mysql> select charset(‘abc’),charset(convert(‘abc’ using latin1)),
-> charset(version()), #获取字符集
-> collation(‘abc’),collation(convert(‘abc’ using utf8));#获取排列方式
效果:
+————————+———————————————————+——————————+—————————+———————————————————+
| charset(‘abc’) | charset(convert(‘abc’ using latin1)) | charset(version()) | collation(‘abc’) | collation(convert(‘abc’ using utf8)) |
+————————+———————————————————+——————————+—————————+———————————————————+
| utf8 | latin1 | utf8 | utf8_general_ci | utf8_general_ci |
+————————+———————————————————+——————————+—————————+———————————————————+
6、加/解密函数
mysql> select password(‘newpwd’),MD5(‘mypwd’),
-> encode(‘secret’,’cry’),length(encode(‘secret’,’cry’)),
-> decode(encode(‘secret’,’cry’),’cry’);#加密后解密
效果:
+—————————————————————-+—————————————————+————————————+————————————————+———————————————————+
| password(‘newpwd’) | MD5(‘mypwd’) | encode(‘secret’,’cry’) | length(encode(‘secret’,’cry’)) | decode(encode(‘secret’,’cry’),’cry’) |
+—————————————————————-+—————————————————+————————————+————————————————+———————————————————+
| *1FA85AA204CC12B39B20E8F1E839D11B3F9E6AA4 | 318bcb4be908d0da6448a0db76908d78 | �h�� | 6 | secret |
+—————————————————————-+—————————————————+————————————+————————————————+———————————————————+
7、其他函数
mysql> select format(123.1234,2),format(123.1,3),format(123.123,0),#格式化函数
-> #不同进制数之间的转换
-> conv(‘a’,16,2),conv(15,10,2),conv(15,10,8),conv(15,10,16);
效果:
+——————————+————————-+—————————-+————————+———————-+———————-+————————+
| format(123.1234,2) | format(123.1,3) | format(123.123,0) | conv(‘a’,16,2) | conv(15,10,2) | conv(15,10,8) | conv(15,10,16) |
+——————————+————————-+—————————-+————————+———————-+———————-+————————+
| 123.12 | 123.100 | 123 | 1010 | 1111 | 17 | F |
+——————————+————————-+—————————-+————————+———————-+———————-+————————+
IP地址与数字相互转换的函数
mysql> select inet_aton(‘209.207.224.40’),inet_ntoa(3520061480),
-> #枷锁函数和解锁函数
-> get_lock(‘lock1’,10),#这个锁持续10秒
-> is_used_lock(‘lock1’), #返回当前连接ID
-> is_free_lock(‘lock1’), #是否是可用的
-> release_lock(‘lock1’);
效果:
+——————————————-+———————————-+———————————+———————————-+———————————-+———————————-+
| inet_aton(‘209.207.224.40’) | inet_ntoa(3520061480) | get_lock(‘lock1’,10) | is_used_lock(‘lock1’) | is_free_lock(‘lock1’) | release_lock(‘lock1’) |
+——————————————-+———————————-+———————————+———————————-+———————————-+———————————-+
| 3520061480 | 209.207.224.40 | 1 | 2 | 0 | 1 |
+——————————————-+———————————-+———————————+———————————-+———————————-+———————————-+
重复执行指定操作的函数
mysql> select benchmark(5000,password(‘newpad’)),
-> charset(‘abc’),charset(convert(‘abc’ using latin1)),#改变字符集的函数
-> cast(100 as char(2)),convert(‘2010-10-11 12:12:12’,time);#改变数据类型的函数
效果:
+——————————————————+————————+———————————————————+———————————+——————————————————-+
| benchmark(5000,password(‘newpad’)) | charset(‘abc’) | charset(convert(‘abc’ using latin1)) | cast(100 as char(2)) | convert(‘2010-10-11 12:12:12’,time) |
+——————————————————+————————+———————————————————+———————————+——————————————————-+
| 0 | utf8 | latin1 | 10 | 12:12:12 |
+——————————————————+————————+———————————————————+———————————+——————————————————-+
8、综合案列-Mysql函数的使用
select round(rand() 10),round(rand() 10),round(rand() * 10);#产生三个1-10之间的随机数
select pi(),sin(pi()),cos(0),round(tan(pi()/4)),floor(cot(pi()/4));
create database test_db3;
use test_db3;
show tables;
create table member
(
m_id int(11) primary key auto_increment,
m_FN varchar(15),
m_LN varchar(15),
m_brith datetime,
m_info varchar(15) null
);
insert into member values(null,’Halen’,’Park’,’1970-06-29’,’GoodMan’);
select length(m_FN),#返回m_FN的长度
concat(m_FN,m_LN),#返回第一条记录中的全名
lower(m_info),#将m_info转换成小写
reverse(m_info) from member;
select year(curdate())-year(m_brith) as age,#计算年龄
dayofyear(m_brith) as days,
date_format(m_brith,’%W %D %M %Y’) as birthDate from member;
insert into member values(null,’Samuel’,’Green’,now(),null);
select last_insert_id(); #输出最后插入的自增的编号
select m_brith,case when year(m_brith) < 2000 then ‘old’
when year(m_brith) > 2000 then ‘young’
else ‘not born’ end as status from member;
常用的mysql命令
mysql -u root -p 进入root账户中
show create database test_db查看已经创建的数据库的定义
show databases显示所有的数据库
drop database test_db删除数据库
use databasename使用某个数据库
show tables看本数据库中有多少张表
describe tablename查看表结构 ==desc tablename
show create table tablename查看建表语句
select * from tablename查看表数据
mysql之like模糊查询
%:表示任意个字符,可以是0个或多个,可匹配任意类型和长度的字符。
:表示单个字符,常用来限制表达式的字符长度。
1.like ‘%国%’ 查询所有含国字的记录
select from student where name like ‘%国%’;
2.like ‘%国%’ and like ‘%飞%’查询既有国字又有飞字的记录,国字和飞字不分先后
select from student where name like ‘%国%’and name like ‘%飞%’;
3.like ‘%国%飞%’查询既有国字又有飞字的记录,国字必须在前,飞字必须在后。
select from student where name like ‘%国%飞%’;
4.like ‘张__’查询姓张的记录,张后面有两横杠,所以必须是三个字的
select from student where name like ‘张‘;
5..like ‘%张%’查询姓张的记录,可以是两个字的也可以是三个字的
select * from student where name like ‘%张_%’;
数据表的基本操作
1、创建数据表
use test_db;
create table tb_emp1
(
id int(11),
name varchar(15),
deptID int(11),
salary float
);
使用下面语句查看此数据库存在的表
show tables;
1)、主键约束
主键,又称主码,是表中一列或多列的组合。主键约束〈Primary Key Constraint) 要求主键列的数据唯一,并且不允许为空!= null。主键能够唯一地标识表中的一条记录,可以结合外键来定义不同数据表之间的关系, 并且可以加快数据库查询的速度。主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。主键分为两种类型: 单字段主键和多字段联合主键。
- 单字段主键;
- 在定义完所有列之后定义主键;
- 多字段联合主键;
单字段约束:
create table tb_emp2
(
id int(11) primary key,
name varchar(15),
deptID int(11),
salary float
);
后面约束:
create table tb_emp3
(
id int(11),
name varchar(15),
deptID int(11),
salary float,
primary key(id)
);
联合约束:假设没有主键id,可以通过name和deptID来确定一个唯一的员工。
create table tb_emp4
(
id int(11),
name varchar(15),
deptID int(11),
salary float,
primary key(name,deptID)
);
2)、外键约束
- 外键用来在两个表的数据之间建立链接, 它可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
- 外键 : 首先它是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键。外键主要作用是保证数据引用的完整性, 定义外键后,不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据的一致性、完整性。例如,部门表 tb_dept的主键是id,在员工表tb_emp5中有一个键 deptId 与这个id 关联。
有关主表和从表:
- 主表(父表) : 对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。
- 从表(子表) : 对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。
需要注意:
- 子表的外键必须要关联父表的主键;
- 相关联的数据类型必须匹配;
- 先删子表,再删父表;
下面的例子tb_emp5(员工表)中的deptID关联部门表中的ID(主键):
//父表
create table tb_dept1
(
id int(11)primary key,
name varchar(22) not null,
location varchar(50)
)
//子表
create table tb_emp5
(
id int(11) primary key,
name varchar(25),
deptID int(11),
salary float,
constraint fk_emp5_dept foreign key(deptID) references tb_dept1(id)
)
3)、非空约束
非空约束指定的字段不能为空,如果添加数据的时候没有指定值,会报错。
create table tb_emp6
(
id int(11) primary key,
name varchar(15) not null,
deptID int(11),
salary float
);
4)、唯一性约束
- 唯一性要求该列唯一;
- 允许为空,但只能出现一个空值;
- 唯一性可以确保一列或几列不出现重复值;
create table tb_dept2
(
id int(11)primary key,
name varchar(22) unique,
location varchar(50)
);
create table tb_dept3
(
id int(11)primary key,
name varchar(22),
location varchar(50),
constraint N_uq unique(name) #N_uq是约束名
);
注意UNIQUE和主键约束(PRIMARY KEY)的区别:
- 一个表中可以有多个字段声明为UNIQUE,但只能有一个PRIMARY KEY 声明;
声明为 PRIMAY KEY 的列不允许有空值,但是声明为 UNIQUE的字段允许空值 (NULL) 的存在。
5)、默认约束
指定了默认约束之后,如果没有指定值,就用默认的。
create table tb_emp7
(
id int(11) primary key,
name varchar(15) not null,
deptID int(11) default 111,
salary float
);6)、设置表的属性自加
在数据库应用中,经常希望在每次插入新记录时,系统自动生成字段的主键值。可以通过为表主键添加AUTO_INCREMENT 关键字来实现。
- 默认的,在MySQL 中 AUTO _INCREMENT的初始值是 1,每新增一条记录,字段值自动加 1。
- 一个表只能有一个字段使用AUTO_INCREMENT 约束,且该字段必须为主键的一部分。
- AUTO_INCREMENT约束的字段可以是任何整数类型 (TINYINT、SMALLIN、INT、BIGINT 等) 。
create table user
(
id int(11) primary key auto_increment,
name varchar(15) not null,
mail varchar(15) not null,
);
7)、查看表的结构
desc可以查看表的字段名,数据类型,是否为主键,是否默认值。
desc tb_emp8;
查看表的详细结构,可以看储存引擎,和字符编码
show create table tb_emp8;
2、修改数据表
1)、修改表名
将表tb_dept3改为tb_deptment3
alter table tb_dept3 rename tb_deptment3;
查看数据库中的表
show tables;
修改表名不会改变结构,desc前后结果一样。
2)、修改字段的数据类型
修改表字段的数据类型,把name列的数据类型改为varchar(33)
alter table tb_dept1 modify name varchar(33);
3)、修改字段名
修改表的字段名,不改数据类型 将tb_dept1中的location字段改成loc
alter table tb_dept1 change location loc varchar(50);
# 修改表的字段名,并且改变数据类型, 同时改变数据类型
alter table tb_dept1 change loc location varchar(60);
change也可以只改变数据类型,但是一般不要轻易改变数据类型。
4)、添加字段
有三种添加方式:
- ①默认在最后面添加;
- ②在第一个位置添加first;
- ③和指定的位置添加after;
添加字段(默认在最后面添加)
alter table tb_dept1 add managerID int(10);
# 添加字段(默认在最后面添加)(非空约束)
alter table tb_dept1 add column1 int(10) not null;
# 添加字段(在第一个位置添加)
alter table tb_dept1 add column2 int(10) first;
# 添加字段(在指定位置后面添加)
alter table tb_dept1 add column3 int(10) after name;
5)、删除字段
删除字段, 删除tb_dept1的column3字段
alter table tb_dept1 drop column3;
6)、修改字段的排列位置
修改字段的排列位置(改到第一个位置)
alter table tb_dept1 modify column1 int(10) first;
# 修改字段的位置为指定的位置
alter table tb_dept1 modify column2 int(10) after name;
7)、更改表的储存引擎
查看数据表的定义
show create table tb_deptment3;
# 更改数据表的引擎
alter table tb_deptment3 engine = MyISAM;
8)、删除表的外键约束
create table tb_emp9
(
id int(11)primary key,
deptID int(11),
name varchar(25),
salary float,
constraint fk_emp9_dept foreign key(deptID) references tb_dept1(id)
)
# 删除外键约束
alter table tb_emp9 drop foreign key fk_emp9_dept;
3、删除数据表
删除表
drop table if exists tb_emp9;
注意注意: 删除有关联的数据表的父表的时候,先删除外键再删除父表
4、综合案例小结
create database company;
use company;
create table offices
(
officeCode int(10) primary key not null unique,
city varchar(50) not null,
address varchar(50),
country varchar(50) not null,
postalCode varchar(15) unique
)
create table employees
(
employeeNumber int(11) primary key not null unique auto_increment,
lastName varchar(50) not null,
firstName varchar(50) not null,
mobile varchar(25) unique,
officeCode int(10) not null,
jobTitle varchar(50) not null,
birth datetime not null,
note varchar(255),
sex varchar(5)
)
show tables;
desc employees;
#将mobile字段修改到officeCode后面
alter table employees modify mobile varchar(25) after officeCode;
#将birth的字段名改为employee_birth
alter table employees change birth employee_birth datetime;
#修改sex字段为char(1)类型,非空约束
alter table employees modify sex char(1) not null;
#删除字段note
alter table employees drop note;
#增加字段名
alter table employees add favoriate_activity varchar(100);
#为employee增加一个外键
alter table employees add constraint fk_em_off foreign key(officeCode) references offices(officeCode);
#删除表的外键约束
alter table employees drop foreign key fk_em_off;
#更改employee的数据引擎
alter table employees engine = MyISAM;
#更改employee的表名
alter table employees rename employees_info;
数据的基本操作
插入数据
insert into tablename(column1,column2)
values
(“values1”,”values2”);//指定列插入一条数据
insert into tablename
values
(“values1”,”values2”);//全部列插入一条数据
insert into tablename(column1,column2)
values
(“values1”,”values2”),
(“values1”,”values2”),
……;//插入多条数据
删除数据
delete from tablename;//删除某个表的全部数据
delete from tablename where cause;//删除指定条件的数据
更新数据
update tablename set field1=new-values1,field2=new-values2
[where cause]
查询数据
select field1,field2 from tablename where [条件]
Mysql排序
SELECT field1, field2,…fieldN FROM table_name1, table_name2…
ORDER BY field1, [field2…] [ASC [DESC]]
- 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
- 你可以设定多个字段来排序。
- 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升排列。
-
Mysql分组
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
WITH ROLLUP:在group分组字段的基础上再进行统计数据Mysql连接
JOIN 按照功能大致分为如下三类:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。例子如下:两张表结构如下
内连接:
SELECT boy.hid,boy.bname,girl.gname FROM boy INNER JOIN girl ON girl.hid = boy.hid;
左连接:
SELECT boy.hid,boy.bname,girl.gname FROM boy LEFT JOIN girl ON girl.hid = boy.hid;
右连接:
SELECT boy.hid,boy.bname,girl.gname FROM boy RIGHT JOIN girl ON girl.hid = boy.hid;
limit的使用
select from tablename limit m,n;//m表示从第几天开始记录数据,n代表记录多少条数据
select from tablename limit 0,5;//表示从第一条开始记录数据,取出第一到第五的数据
select from tablename limit 5,5;//表示取出第六条到第十条的数据,取出五条数据
select from tablename limit m,n;//表示跳过m条数据,然后记录n条数据
select * from tablename limit m offset n;//表示跳过n条记录,然后记录m条数据
MySQL中查询sql语句的运行时间
查看执行时间步骤:
1.show profiles;
2.show variables;查看 profiling是否是on状态;
3.如果是off,执行命令 set profiling=1;
4.执行sql语句
5.show profiles;然后就可以看到sql语句的执行时间了
binary关键字
binary:mysql的where子句的字符串比较是不区分大小学的,可以使用binary关键字来设定where子句的字符串比较是区分大小写的
//区分大小写,zhang和ZHANG是不一样的
select from student where binary name=”zhang”;
//不区分大小写,zhang和ZHANG是一样的
select from student where name=”zhang”;
Mysql一些语句
1.把时间更新成为当前系统时间
update tablename SET Date=Now() where 条件;
Mysql优化