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;
  • 相关阅读:
    (转)Silverlight 与 JS交互
    使用wcf服务捕捉到“POST http://yourIP/WCFService.svc 405 (Method Not Allowed) ”错误!
    Silverlight 页面传值问题(转)
    (转)发布Silverlight+WCF程序到IIS后,客户端访问数据库失败的解决方案
    Static Function Test
    .net 开发者尝试Apache Spark™
    Ubuntu 16.04.2 LTS 安装 jdk1.6 和 tomcat6 (一)
    Ubuntu 16.04.2 LTS 安装 jdk1.6 和 tomcat6 (二)
    Win10+VS2015折腾小记
    经验不是万能的----驴子驮盐
  • 原文地址:https://www.cnblogs.com/lybolg/p/12723423.html
Copyright © 2011-2022 走看看