zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    day01--计算机硬件基础笔记
    22 Jun 18 Django,ORM
    21 Jun 18 Django,ORM
    20 Jun 18 复习, mysql
    20 Jun 18 Django,ORM
    19 Jun 18 复习, 正则表达式
    19 Jun 18 Django
    15 Jun 18 复习, shutil模块
    15 Jun 18 Django
    14 Jun 18 复习, form表单
  • 原文地址:https://www.cnblogs.com/lybolg/p/12723423.html
Copyright © 2011-2022 走看看