MySQL数据库
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。
MySQL Server 的第一版由瑞典公司 MySQL AB 在 1995 年发布,MySQL 的名字源自该公司创始人 Widenius 的女儿 My。
MySQL的特点
- 运行速度快:MySQL 体积小,命令执行的速度快;
- 使用成本低:MySQL 是开源的,且提供免费版本,对大多数用户来说大大降低了使用成本;
- 使用容易:与其他大型数据库的设置和管理相比,其复杂程度较低,易于使用;
- 可移植性强:MySQL 能够运行与多种系统平台上,如 Windouws,Linux,Unix 等;
- 适用更多用户:MySQL 支持最常用的数据管理功能,适用于中小型企业甚至大型网站应用。
MySQL下载
下载地址为:https://dev.mysql.com/downloads/windows/installer
选择下面一个是离线安装,这里我选这个,下载到本地进行安装,点击“Downloda”进入下载页面。
备注:虽然下载的是32为版本的,但是同时已经包含了64位版本,这个很重要。
MySQL数据类型
1.数值类型
数值类型,包含:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT。
类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
tinyint |
1 字节 |
(-128,127) |
(0,255) |
小整数值 |
smallint |
2 字节 |
(-32 768,32 767) |
(0,65 535) |
大整数值 |
mediumint |
3 字节 |
(-8 388 608,8 388 607) |
(0,16 777 215) |
大整数值 |
int或integer |
4 字节 |
(-2 147 483 648,2 147 483 647) |
(0,4 294 967 295) |
大整数值 |
bigint |
8 字节 |
(-9,223,372,036,854,775,808,9 223 372 036 854 775 807) |
(0,18 446 744 073 709 551 615) |
极大整数值 |
float |
4 字节 |
(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) |
0,(1.175 494 351 E-38,3.402 823 466 E+38) |
单精度 浮点数值 |
double |
8 字节 |
(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
双精度 浮点数值 |
decimal |
DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 |
依赖于M和D的值 |
依赖于M和D的值 |
小数值 |
2.浮点型
对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。
MySQL数据类型 | 含义 |
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
3.定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
定点数只有一种 decimal,定点数在 MySQL 内部中以字符串的形式存在,比浮点数更为准确,适合用来表示精度特别高的数据。
4.日期时间类型
MySQL 中的日期与时间类型,主要包括:YEAR、TIME、DATE、DATETIME、TIMESTAMP,每个版本可能不同。
5.字符串
字符串包括: CHAR、VARCHAR、BINARY、VARBINARY、TEXT 等。
MySQL数据类型 | 含义 |
char(n) | 固定长度,最多255个字符 |
varchar(n) | 固定长度,最多65535个字符 |
tinytext | 可变长度,最多255个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
6.二进制数据
二进制数据包括:xxxBLOB和xxxBINARY。
BLOB是一个二进制大对象,可以容纳可变数量的数据,有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。
BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符字符串,而是二进制串。
MySQL常用语句
1.MySQL插入数据
INSERT INTO study VALUES(1 , 'a' , 10);
2.MySQL删除数据
DELETE FROM user WHERE id=5;
3.MySQL修改数据
UPDATE user SET name = mikechen WHERE id = 1;
4.MySQL查询数据
select * from user;
5.创建索引
create index index_name on table_name (column_list) ; create unique index index_name on table_name (column_list) ;
6.SQL查询语句
语法:
基本语法: mysql> select */字段列表 from 数据表名称 where 子句 group by 子句 having 子句 order by 子句 limit 子句;
五子句的顺序是固定的,不能颠倒
①.where 子句 ②.group by 子句 ③.having 子句 ④.order by 子句 ⑤.limit子句
7.模糊查询
SELECT uid, name FROM staffs WHERE name LIKE 'a%';
8.分页查询
当我们查询出来的数据量太大的时候,一页展示得又太多,一般情况下都会将其分成N页,那么这时候就需要用到分页查询。
SELECT * FROM staffs LIMIT 5, 10;
MySQL常用命令
1.连接本机数据库
mysql -uroot -p密码
2.连接到远程主机上的MYSQL
mysql -h 127.0.0.1 -uroot -p 123456
注:u与root可以不用加空格,其它也一样
3.修改mysql中root的密码
mysqladmin -u root password "newpwd";
4.创建数据库
create database name; 创建数据库
5.删除数据库
drop database name; 删除数据库
MySQL索引
MySQL索引就是:数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据。
MySQL索引类型主要分为:主键索引、唯一索引、普通索引和、全文索引。
1.MySQL主键索引
主键索引,英文全称Primary Key,简称为主键,主键是一种唯一性索引,每个表只能有一个主键。
alert table tablename add primary key(`字段名`)
2.MySQL普通索引
普通索引(index)顾名思义:就是各类索引中最为普通的索引。
alter table table_name add index(`字段名`);
3.MySQL唯一索引
mysql中唯一索引的关键字是unique index,唯一索引可以有多个,但索引列的值必须唯一,索引列的值允许有空值。
alter table 表名 add unique(列名)
业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。
4.MySQL全文索引
全文索引指的是:将存储在数据库中的整本书或整篇文章中的任意内容信息查找出来的技术。
alter table 表名 add fulltext (列名)
全文索引只能用于InnoDB或MyISAM表,只能为CHAR、VARCHAR、TEXT列创建。
MySQL事务
事务是一个最小的不可再分的单元,通常一个事务对应一个完整的业务,多个操作同时进行,要么同时成功,要么同时失败,这就是事务。
MySQL事务具有四大特征,简称ACID:
1.原子性(Atomicity)
所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
2.一致性(Correspondence)
数据必须保证从一种一致性的状态转换为另一种一致性状态。
3.隔离性(Isolation)
指当多个用户并发操作数据库时,数据库为每一个用户开启不同的事务,这些事务之间相互不干扰,相互隔离。
4.持久性(Durability)
事务一旦commit,则数据就会保存下来,即使提交完之后系统崩溃,数据也不会丢失。
一般来说,事务是必须满足4个条件(ACID)。
事务的使用:
# 开启事务 mysql> BEGIN; # 提交事务。当提交事务后,对数据库的修改是永久性的。 mysql> COMMIT; # 回滚事务。即撤销正在进行的所有没有提交的修改 mysql> ROLLBACK; # 将事务回滚到某个保存点。 mysql> ROLLBACK TO [SAVEPOINT]
MySQL存储过程
存储过程简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法。
语法如下:
CREATE PROCEDURE 存储过程名称 ([ 参数列表 ]) BEGIN -- SQL语句 END ;
创建存储过程,传入性别(男或女),显示对应性别的用户id,返回对应性别的人数。
代码示例如下:
#DELIMITER $$ CREATE PROCEDURE user_procedure(IN sex VARCHAR(2) character set utf8,OUT num INT) BEGIN SELECT id FROM users WHERE gender=sex; SELECT FOUND_ROWS() INTO num; END #$$ #DELIMITER ;
MySQL触发器
触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程。
触发器主要用于监视某个表的insert、update以及delete等更新操作,这些操作可以分别激活该表的insert、update或者delete类型的触发程序运行,从而实现数据的自动维护。
语句:
CREATE TRIGGER <触发器名> <触发时机 BEFORE | AFTER> <触发事件 INSERT | UPDATE | DELETE > ON <表名> FOR EACH Row <触发器主体> END;
MySQL的触发事件有三种:
1.insert
将新记录插入表时激活触发程序,例如通过:insert、load data和replace语句,可以激活触发程序运行。
2.update
更改某一行记录时激活触发程序,例如通过update语句,可以激活触发程序运行。
3.delete
从表中删除某一行记录时激活触发程序,例如通过delete和replace语句,可以激活触发程序运行。
MySQL优化
1.尽量避免在字段开头模糊查询
SELECT * FROM user WHERE name LIKE '%陈%'
会导致数据库引擎放弃索引进行全表扫描,查询效率非常低。
2.避免select *
SELECT * FROM user
将需要查找的字段列出来即可, 比如:
SELECT name, phone,city FROM user
3.in 和 not in 也要慎用
SELECT * FROM t WHERE id IN (1,2,,3)
会导致引擎走全表扫描,对于连续的数值,能用 between 就不要用 in 了。
select id from t where num between 1 and 3
4.尽量避免进行null值的判断
SELECT * FROM t WHERE score IS NULL
将导致引擎放弃使用索引而进行全表扫描。
可以在score 上设置默认值0,确保表中score 列没有null值,然后这样查询:
SELECT id FROM score WHERE score =0
5.查询条件不能用 <> 或者 !=
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
6.尽量避免向客户端返回大数据量
若数据量过大,应该考虑相应需求是否合理,大数据量的查询,优先使用分页查询。
select * from t where thread_id = 10000 and deleted = 0 order by gmt_create asc limit 0, 15;
仍不能满足需求的,考虑使用es 或者 分库分表。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》