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)

    面试题:一个表中的某一列被定义为Timestamp格式时,会发生什么?
    tips:timestamp在定义列的类型时:
      下面这句话update_time的值只有数据行新建的时候才会获取系统当前时间:
      alter table user info add column update_time timestamp not null default current_timestamp;
      下面这句才是在更新时获取系统当前时间
      alter table user info add column update_time timestamp nut null default current_timestamp on update current_timestamp;    
    注意:
        1)not null 必须写,如果不写,这列的值一直为null
        2)default current_time 这里的deafult不设置值的话,会一直显示【0000-00-00 00:00:00】
 
    实际中的使用场景:数据库中一般会有两个字段,一个为建立时间,一个为更新时间,就可以用,其中一个字段设置为【default current_timestamp】,另一个设置为【default current_timestamp on update current_stamp】 
 

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)索引视图事务存储过程:

    事务:就是一系列操作,要么一起提交做完,要么其中一个报错就全都不错回滚

      事务的特性:原子性、一致性、隔离性、持久性
      开始事务:begin;
      提交事务:commit;
      回滚事务:rollback;
      set autocommit=0;
    索引的底层原理:B+树

      创建索引: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;

        select *,if(num>1,'more','less') as level from test;
    简单的一个存储过程:存储过程常用于批量造数据
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)
  5)连接查询:内连接、左连接、右连接
    注意:连接查询的条件是用on关键字:
    select * from user left jion grade on user.class=grade.class
    内连接就是交叉连接,只连接两个表中字段相同的
    左连接,以左表为主表,按连接字段匹配右表,如果没能在右表中匹配到的话,那就左表完全显示,没有匹配到的右表部分显示null
    右连接和左连接一样的道理,只不过以右表的基表

小tips:mysql里命令行设置utf8才是utf8,实际上通过desc看是【utf8mb4】,这个才是真正的utf8,如果工具上右键的话设置的话,不起作用

5.mysql性能:

一个好的mysql数据库设计:

  1)尽量避免jion连接
  2)适当的添加索引
  3)主从配置,读写分离
  4)添加缓存机制
  5)不使用select * 等查询语句
 
开始Mysql的慢查询分析就会自动帮捕获慢sql了,开启之前先把参数设置好,比如:long_query_time=1,slow_query_log开关开启:
 
实际工作中遇到的写的比较难的一个语句:
select if(concat(a.name,a.class)=(select concat(b.name,b.class) from b where a.id=b.id),1,0) as status from a;

 

posted @ 2020-10-20 13:17  深藏blueblueblue  阅读(140)  评论(0编辑  收藏  举报