MySQL
1.数据库简答介绍:
1)什么是数据库——存储数据的仓库
2)常见的数据库:Mysql、Oracle、SQLServer、MongoDB
关系型数据库:Mysql、Oracle、SQLServer
非关系型数据库:MongoDB
本文接下来重点在于Mysql,其他关系型数据和Mysql类似,非关系型数据库mongodb参考另一篇文章:
2.MySQL必知:
1)MySQL的默认端口:3306
2)每条语句以【;】结尾
3)不区分大小写
4)专属名字:表、记录(行)、字段值(用以对标mongodb中的集合(collection)、文档(document)、字段值(filed))
5)mysql有哪些约束:非空(nut null)、主键约束(primary key)、外键约束(foreign key)、唯一性(unique)
小tips:工作中的表不建议加主外键约束
3.Mysql数据类型:int、tinaint、smallint、bigint、float、 double、decimal、set、enum、char、varchar、year、time、date、timestamp、datetime、text、json
1)数值类型:int、tinaint、smallint、bigint、float、double、decimal
float:4个字节,最多7个有效位,精度不够自动补全小数位,超过精度会四舍五入,最多显示7个有效位,超过7个显示乱七八糟的数
double:8个字节,最多15个有效位
decimal:M+2个字节,最多28个有效位
tips:
与金钱挂钩的数据一般用decimal类型比较好,比如:【salary decimal(9,2)】——总共9位,2位小数)
int(10)只代表显示10位,不足的话前面补0
2)字符类型:char、varchar
char:默认1个有效位、固定长度,如果不足则用空格补齐(所以搜索的时候需要去末尾空格),浪费空间,性能高
varchar:没有默认有效位,必须给定长度、节约空间,性能低
3)枚举类型:enum(单选)、set(可多选),这俩类型的字段在数据库插入值时用的是序号,而不是值
tips:省份、性别最好用enum类型
4)日期类型:year(YYYY)、date(YYYYMMDD)、time(HHMMSS)、datetime(默认为空:YYYYMMDDHHMMSS)、timestamp(默认为系统当前时间:YYYYMMDDHHMMSS)
4.Mysql的语句:
1)库操作语句
查看已有的库:show databases;
创建数据库:create database 数据库名;
查看当前所在的库:select database();
切换库:use 库名;
查看当前库中已有的表:show tables;
删除库:drop database 库名;
数据库备份:mysqldump -u root -p >>> beifeng.sql
导入数据库:source beifeng.sql
2)表的操作
创建表:create table 表名(字段名1 数据类型 约束,字段名2 数据类型 约束,字段名3 数据类型 约束) default chartset=utf8;
查看创建表的语句(字符集):show create table 表名;
查看表结构(3种方法):desc 表名; describe 表名; show create table 表名;
插入列:alter table 表名 add column 列名 类型 约束;
删除列:alter table 表名 drop column;
删除表:drop table 表名;
表里插入数据: insert into 表名 (字段1,字段2,字段3) values(值1,值2,值3);
3)表查询语句:
关键字:where、as、and、or、in、not in、group by、order by、having、like、on、is、left join、right join、inner join、=、>、<、count、avg、max、min、distinct、union、is null、between、limit等
like:%多个字符,_一个字符,一般用like代替=
union:把前后两个select出来的列的所有不同项都列出来
order by::默认asc,desc降序,多个条件时先按第一个条件排序,在第一个条件相同的行按第二个排序以此类推
group by:分组(用来去重挺好用的)
having:只和group by配合使用,在group by的结果中进行筛选
limit:分页 limit 10,15
distinct:去重,单一的只有一个去重功能,而且必须写在列名前
in:如果后面跟子查询,子查询的结果只能有一列
举例:
select u.class as cls,u.name as nam from userinfo u where u.class in (select g.class from grade g where g.class like 'A%') and u.name='李白';
select class,count(*) as num from user group by class having num=1;
select distinct class from user;
mysql> select * from grade; +----+-------+-------+ | id | class | grade | +----+-------+-------+ | 1 | A01 | one | | 2 | B01 | two | | 3 | xxx | xxx | +----+-------+-------+ 3 rows in set (0.00 sec) mysql> select * from userinfo; +----+-----------+-------+---------------------+ | id | name | class | update_time | +----+-----------+-------+---------------------+ | 1 | xiaoming1 | A01 | 2020-10-18 22:26:21 | | 2 | xiaoli | B01 | 2020-10-18 22:20:25 | | 3 | wangwu | C01 | 2020-10-18 22:20:25 | | 4 | zhaoliu | A01 | 2020-10-18 22:20:25 | | 5 | 李白 | A01 | 2020-10-20 07:41:15 | +----+-----------+-------+---------------------+ 5 rows in set (0.00 sec) mysql> select class from userinfo union select class from grade; +-------+ | class | +-------+ | A01 | | B01 | | C01 | | xxx | +-------+ 4 rows in set (0.01 sec)
union distinct : 把union后的字段值进行去重
mysql> select class from userinfo union distinct select class from grad e; +-------+ | class | +-------+ | A01 | | B01 | | C01 | | xxx | +-------+ 4 rows in set (0.00 sec)
union:把所有union出来的值都显示出来
mysql> select class from userinfo union all select class from grade; +-------+ | class | +-------+ | A01 | | B01 | | C01 | | A01 | | A01 | | A01 | | B01 | | xxx | +-------+ 8 rows in set (0.00 sec) mysql> select class from userinfo union select grade from grade; +-------+ | class | +-------+ | A01 | | B01 | | C01 | | one | | two | | xxx | +-------+ 6 rows in set (0.00 sec)
4)索引视图事务存储过程:
事务:就是一系列操作,要么一起提交做完,要么其中一个报错就全都不错回滚
创建索引:create index 索引名字 on 表名(字段名)
删除索引:drop index 索引名字 on 表名
创建临时表,命令行窗口关闭就没了:create temporary table XXX();
创建视图:create view 视图名(字段1,字段2,字段3) as select XXX
create view test (num,class,grade) as select count(userinfo.class),userinfo.class,grade.grade from userinfo left join grade on userinfo.class=grade.class group by userinfo.class,grade.grade;
mysql> delimiter $$ mysql> create procedure select_class(in u_id int) -> begin -> select * from userinfo where id=u_id; -> end$$ mysql> delimiter ; mysql> call select_class(1)
小tips:mysql里命令行设置utf8才是utf8,实际上通过desc看是【utf8mb4】,这个才是真正的utf8,如果工具上右键的话设置的话,不起作用
5.mysql性能:
一个好的mysql数据库设计: