• 数据库运用


    1. 操作文件夹(库)(不能改文件名) c 结束

    查看文件编码 show variables like "%char%"

    ![

    如果文件编码没有问题创建文件夹(库)时,例如: create database db1(文件名);

    如果文件编码有问题创建文件夹(库)时, 例如 create database db1 charset utf8; (设置编码)

    查看所有的库, show databases;

    中间过程修改编码, alter databases db1 charset utf8(编码);

    删除文件夹(删库), drop database db1;

    2. 操作文件(表)

    如果有多个文件,先切到该文件所在文件夹下, use db1;

    创建文件, create table t1(id int,name char(10)); ()中的数字是字符数,不是字节

    查看当前库中有多少表, show tables;

    修改文件,alter table t1 modify name char(3);

    查看表结构: desc 表名 (describe 表名) 或者 show create table 表名;

    删除表名, drop table 表名;

    修改表名, alter table 表名 rename 新表名;

    3. 操作文件中的内容

    查看表中所有内容, select * from 表名; (select id,name from 表名)

    向表中添加内容, insert into 表名 values(1,"太白") 与创建时设置一一对应

    修改表中内容,update 表名 set name= "Barry";没设置条件,所有name都改变了

    update 表名 set name="Barry" where id=1; 只修改id为1的名字

    update 表名 set name="Barry" ,id = 2 where id=1; 修改id为1的id和名字

    清空表中内容,delete from 表名; truncate from 表名,数据量大时,后者快

    删除某一个内容, delete from 表名 where id=1,其他id不变

    4. 存储引擎 :数据的存储方式

    查看表的存储引擎, show engines;

    1. MyISAM
      1. mysql 5.5以下默认的存储方式
      2. table_level locking 表级锁
      3. 树 tree--加速查询(树形结构+数据+表结构)
    2. innodb
      1. mysql 5.6以上默认的存储方式
      2. transaction 事务,保证数据的安全,数据的完整性而设置的
      3. row-level locking 行级锁
      4. table_level locking 表级锁
      5. 树 tree--加速查询(树形结构(数据+树)+表结构)

    ![

    1. memory

      1. 基于hash
    2. 创建myisam类型存储引擎

      1. create table myisam_t1(id int,name char(18)) engine= myisam;

      ![

    3. 创建memory类型存储引擎

      1. create table memory_t1(id int,name char(18)) engine= memory;

    ![

    select money from user where name='太白';

    update user set money=800 where name="太白";

    select money from user where name='alex';

    update user set money=300 where name="alex";

    5. 创建表

    创建表的完整结构:

    create table 表名(字段名1 类型[(宽度) 约束条件],
                      字段名2[(宽度) 约束条件],
                       字段名3[(宽度) 约束条件]);
    

    6. mysql的基础数据类型

    1. 数值类型

    对于整型来说,数据类型后面的宽度并不是存储长度限制,而是显示限制,例如int,int无符号类型,那么默认的显示宽度就是int(10),有符号的就是int(11)(符号-占了一位),因为多了一个符号,所以我们没有必要指定整数类型的数据,没必要指定宽度,因为默认的就能够将你存的原始数据完全显示

    ![

    1. 整数类型 (主要存储用于计算的数字,如年龄,等级,id,钱数) (默认有符号)

      如上图,对于整数类型,都是有范围的,有符号时是多了一个负号,范围有正负

      整数类型范围验证

      1.tinyint默认为有符号

      创建一个day41的数据库    create database day41;
      切换到此数据库文件下     use day41;
      创建一个小整形的文件t1   create table t1(money tinyint);
      查看表结构              desc t1; (show create table t1)
      向表中传入数据         insert into t1 values(100),(-100),(200),(-200);
      查看我们存入的数据      select * from t1;
      结果如下图,我们发现,我们传的值超过范围时,存入的数据就成了极限值(-128,127)
      

      ![

      2.设置无符号的 tinyint

      接着上边写,创建无符号小整数类型
      创建一个小整形的文件t2   create table t2(money tinyint unsigned);
      查看表结构              desc t2; (show create table t2)
      向表中传入数据         insert into t2 values
          				-> (100),
          				-> (-100),
         					-> (300);
      查看我们存入的数据      select * from t2;
      结果如下图,我们发现,我们传的值超过范围时,存入的数据就成了极限值(0,255)
      

    ![

    1. 浮点型

    float 单精度浮点数(非准确小数值),随着小数的增多,精度变得不准确 (255,30)

    double 双精度浮点数(非准确小数值),随着小数的增多,精度比float要高,但也不准确(255,30)

    decimal 精确的小数值,随着小数的增多,精度始终准确 (65,30)

    decimal能够存储精确值的原因在于其内部按照字符串存储
    
    依次创建3个文件
    create table t3(id float(60,30));  范围(255,30) 255是30个小数加上整数的和
    create table t4(id double(60,30)); 范围(255,30) 255是30个小数加上整数的和
    create table t5(id decimal(60,30)); 范围(65,30) 65是30个小数加上整数的和
    

    ![

    ![

    如上所示,精确度decimal > double > float

    3.位类型

    BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
    注意:对于位字段需要使用函数读取
    bin()显示为二进制
    hex()显示为十六进制
    
    mysql> create table t9(id bit);
    mysql> desc t9; #bit默认宽度为1
    +-------+--------+------+-----+---------+-------+
    | Field | Type   | Null | Key | Default | Extra |
    +-------+--------+------+-----+---------+-------+
    | id    | bit(1) | YES  |     | NULL    |       |
    +-------+--------+------+-----+---------+-------+
    
    mysql> insert into t9 values(8);
    mysql> select * from t9; #直接查看是无法显示二进制位的
    +------+
    | id   |
    +------+
    |     |
    +------+
    mysql> select bin(id),hex(id) from t9; #需要转换才能看到
    +---------+---------+
    | bin(id) | hex(id) |
    +---------+---------+
    | 1       | 1       |
    +---------+---------+
    
    mysql> alter table t9 modify id bit(5);
    mysql> insert into t9 values(8);
    mysql> select bin(id),hex(id) from t9;
    +---------+---------+
    | bin(id) | hex(id) |
    +---------+---------+
    | 1       | 1       |
    | 1000    | 8       |
    +---------+---------+
    

    2. 日期类型

    1.日期类型分类

    类型: YEAR:范围 (1901/2155)

    ​ DATE:范围 (1000-01-01/9999-12-31)

    ​ TIME: 范围 (''-838:59:59''/''838:59:59'')

    ​ DARATIME: 范围 (1000-01-01 00:00:00/9999-12-31 23:59:59)

    ​ TIMESTAMP: 范围 (1970-01-01 00:00:00/2037年某时)

    作用:存储用户注册时间,文章发布时间,员工入职时间,出生日期,过期时间等

    2.日期类型测试

    create table t6(born_year year);

    insert into t6 values(1900),(1901),(2155),(2156);

    ![

    create table t7(d date,t time,dt datetime);
    insert into t6 values(now(),now(),now());  #当前时间
    select * from t7;
    

    ![

    3.手动插入两位数时间

        1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
        2. 插入年份时,尽量使用4位值
        3. 插入两位年份时,<=69,以20开头,比如50,  结果2050      
                        >=70,以19开头,比如71,结果1971
        mysql> create table t12(y year);
        mysql> insert into t12 values  
            -> (50),
            -> (71);
        mysql> select * from t12;
        +------+
        | y    |
        +------+
        | 2050 |
        | 1971 |
        +------+
    

    4.datetime 和 timestamp的区别

    datetime 的默认值为null,timestamp的字段默认不为空(not null),默认当前时间

    ![

    ![

    3.设置严格模式 配置文件my.ini中

    模式设置和修改(以解决上述问题为例):(数值超出范围只警告不报错问题)
    
        方式一:先执行select @@sql_mode,复制查询出来的值并将其中的NO_ZERO_IN_DATE,NO_ZERO_DATE删除,然后执行set sql_mode = '修改后的值'或者set session sql_mode='修改后的值';,例如:set session sql_mode='STRICT_TRANS_TABLES';改为严格模式 #session可以不用写
    
            此方法只在当前会话中生效,关闭当前会话就不生效了。
    
        方式二:先执行select @@global.sql_mode,复制查询出来的值并将其中的NO_ZERO_IN_DATE,NO_ZERO_DATE删除,然后执行set global sql_mode = '修改后的值'。
    
    	此方法在当前服务中生效,重新MySQL服务后失效
        方法三:在mysql的安装目录下,或my.cnf文件(windows系统是my.ini文件),新增 sql_mode = STRICT_TRANS_TABLES
    
    添加my.cnf如下:
    [mysqld]			sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
    

    4. 字符串类型 char 和 varchar

    length(字段) : 查看该字段数据的字节长度

    char_length(字段): 查看该字段数据的字符长度

    如果我们想看它存储的真实长度,需要设置mysql的模式,如下

    set sql_mode ='PAD_CHAR_TO_FULL_LENGTH';

    char 和 varchar
    以char(5) 和 varchar(5)比较,加入三个人名,sb,dsb,sbdsb
    char:
        优点:简单粗暴,不管你是多长,我都按照规定的长度来存储,5个5个的存储,取的时候也是5个5个取,速度快
    	缺点:数据不满时浪费空间,将来存储的数据的长度可能会参参差不齐
     varchar:
        根据数据的长度存储数据,更为精简和节省空间(数据不饱和时),存储时会在每个数据前面加上一个头,1bytes+sb+1bytes+dsb+1bytes+sbdsb,导致存取比较麻烦
        优点:数据不饱和时节省了一些空间,春出的数据范围更大
        缺点:存取速度慢
    

    ![

    5. 枚举类型与集合类型

    枚举类型(enum)
    create table shirts(name varchar(20),size enum('x-small', 'small', 'medium', 'large', 'x-large'));
    insert into shirts values("alex","aaa"); #报错,aaa不在enum中
    insert into shirts values('alex',"small");
    select * from shirts;
    
    集合类型(set) 去重
    create table myset(col set('a','b','c','d'));
    insert into myset values('a,d'),('d,a'),('a,d,d'),('b,c,c,d');
    select * from myset;
    mysql> select * from myset;
    +-------+
    | col   |
    +-------+
    | a,d   |
    | a,d   |
    | a,d   |
    | b,c,d |
    +-------+
    去重了,两个时一定都在引号里,不能是('a','b')
    

    7. 完整性约束 用于保证数据的完整性和一致性

    PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
    FOREIGN KEY (FK)    标识该字段为该表的外键
    NOT NULL    标识该字段不能为空
    UNIQUE KEY (UK)    标识该字段的值是唯一的
    AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
    DEFAULT    为该字段设置默认值
    
    UNSIGNED 无符号
    ZEROFILL 使用0填充
    

    1. not null 与 default

      默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
      create table t1(id int not null defalut 2,num int not null);
    
      先说一点:在我们插入数据的时候,可以这么写insert into tb1(nid,num) values(1,‘chao’);就是在插入输入的时候,指定字段插入数据,如果我在只给num插入值,可以这样写insert into tb1(num) values('chao');
    
    ==================not null====================
    mysql> create table t1(id int); #id字段默认可以插入空
    mysql> desc t1;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id    | int(11) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    mysql> insert into t1 values(); #可以插入空
    
    mysql> create table t2(id int not null); #设置字段id不为空
    mysql> desc t2;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id    | int(11) | NO   |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    mysql> insert into t2 values(); #不能插入空
    ERROR 1364 (HY000): Field 'id' doesn't have a default value
    
    ==================default====================
    #设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值
    mysql> create table t3(id int default 1);
    mysql> alter table t3 modify id int not null default 1;
    
    ==================综合练习====================
    mysql> create table student(
        -> name varchar(20) not null,
        -> age int(3) unsigned not null default 18,
        -> sex enum('male','female') default 'male',
        -> hobby set('play','study','read','music') default 'play,music'
        -> );
    mysql> desc student;
    +-------+------------------------------------+------+-----+------------+-------+
    | Field | Type                               | Null | Key | Default    | Extra |
    +-------+------------------------------------+------+-----+------------+-------+
    | name  | varchar(20)                        | NO   |     | NULL       |       |
    | age   | int(3) unsigned                    | NO   |     | 18         |       |
    | sex   | enum('male','female')              | YES  |     | male       |       |
    | hobby | set('play','study','read','music') | YES  |     | play,music |       |
    +-------+------------------------------------+------+-----+------------+-------+
    mysql> insert into student(name) values('chao');
    mysql> select * from student;
    +------+-----+------+------------+
    | name | age | sex  | hobby      |
    +------+-----+------+------------+
    | chao|  18 | male | play,music |
    +------+-----+------+------------+
    

      注意一点:如果是非严格模式,int类型不传值的话会默认为0,因为null不是int类型的,字段是int类型,所以他会自动将null变为0

    2. unique 独一无二的,唯一的,避免重复

    ============设置唯一约束 UNIQUE===============
    方法一:
    create table department1(id int,name varchar(20) unique,comment varchar(100));
    
    方法二:
    create table department2(id int,name varchar(20),comment varchar(100),constraint uk_name unique(name));
    
    mysql> insert into department1 values(1,'IT','技术');
    Query OK, 1 row affected (0.00 sec)
    mysql> insert into department1 values(1,'IT','技术');
    ERROR 1062 (23000): Duplicate entry 'IT' for key 'name'
    

    ![

    create table service(
    id int primary key auto_increment,name varchar(20),
    host varchar(15) not null,port int not null,unique(host,port) #联合唯一);
    

    ![
    ![

    3. primary key 效果等同于 not null + unique 不能为空且唯一

    4. auto_increment

    #不指定id,则自动增长
    create table student(
    id int primary key auto_increment,
    name varchar(20),
    sex enum('male','female') default 'male'
    );
    
    mysql> desc student;
    +-------+-----------------------+------+-----+---------+----------------+
    | Field | Type                  | Null | Key | Default | Extra          |
    +-------+-----------------------+------+-----+---------+----------------+
    | id    | int(11)               | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(20)           | YES  |     | NULL    |                |
    | sex   | enum('male','female') | YES  |     | male    |                |
    +-------+-----------------------+------+-----+---------+----------------+
    mysql> insert into student(name) values
        -> ('egon'),
        -> ('alex')
        -> ;
    
    mysql> select * from student;
    +----+------+------+
    | id | name | sex  |
    +----+------+------+
    |  1 | egon | male |
    |  2 | alex | male |
    +----+------+------+
    
    
    #也可以指定id
    mysql> insert into student values(4,'asb','female');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into student values(7,'wsb','female');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from student;
    +----+------+--------+
    | id | name | sex    |
    +----+------+--------+
    |  1 | egon | male   |
    |  2 | alex | male   |
    |  4 | asb  | female |
    |  7 | wsb  | female |
    +----+------+--------+
    
    
    #对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长
    mysql> delete from student;
    Query OK, 4 rows affected (0.00 sec)
    
    mysql> select * from student;
    Empty set (0.00 sec)
    
    mysql> insert into student(name) values('ysb');
    mysql> select * from student;
    +----+------+------+
    | id | name | sex  |
    +----+------+------+
    |  8 | ysb  | male |
    +----+------+------+
    
    #应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它
    mysql> truncate student;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into student(name) values('egon');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from student;
    +----+------+------+
    | id | name | sex  |
    +----+------+------+
    |  1 | egon | male |
    +----+------+------+
    1 row in set (0.00 sec)
    
  • 相关阅读:
    js 判断图片是否加载完成(使用 onload 事件)
    使用 css 的 keyframe 实现 loading 动画
    meta标签常用属性
    Chrome开发者工具 debug 调试
    ajaxForm上传文件到本地服务器(封装)
    优化jQuery选择器
    “要有足够的耐心,一点一滴地改变世界”
    Event事件的三个阶段
    css控制页面文字不能被选中user-select:none;
    webstrom打开多个项目,webstrom常用快捷键
  • 原文地址:https://www.cnblogs.com/lvweihe/p/11437236.html
Copyright © 2020-2023  润新知