• 数据库的基本语法和约束条件


    1,数据库的基本语句.

    1.1>数据库的增删改查.

    查看所有的库:

    show databases;

    就是已经创建好的库,通过这个命令去查看;

    information_schema:虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息,列信息,权限信息,字符信息等.

    performance_schema:mysql5.5开始新增一个数据库:主要用于收集数据库服务器的性能参数,记录处理查询请求时发生的各种事件,锁等现象.

    mysql:授权库,主要用于存储系统用户的权限信息

    text:mysql数据库系统自动创建的测试数据库

    1.2>创建数据库

    1.2.1>求救语法:(在mysql语句中没写完一句话就要用;隔开)

    help create databases;

    1.2.2>创建数据库语法

    CREATE DATABASES 数据库 charset utf-8

    因为在之前设置好了编码格式,所以不用每次都编码了.

    1.2.3>数据库的命名规则:

    可以由字母,数字,下划线,@,#,$组成.
    区分大小写
    唯一性
    不能使用关键字如:create select
    不能单独使用数字
    最长128位
    #和python和js命名规则一样

    1.3>数据库的相关操作.

    #查看数据库
    show database;
    #查看当前库
    show create databases db1;  #查看当前新创建的数据库
    #查看所在的库
    select databases();
    #选择数据库
    use 数据库名
    
    #删除数据库
    DROP DATABASES 数据库名;
    #修改数据库
    alert databases db1 charset utf-8

    ###以上这些操作不区分大小写,对于已经建好的数据库mysql没有重命名的指令,只能1>通过删除就得数据库,并把数据迁移到新创建的数据库中,2>取文件夹中找到那个数据库名右键重命名###

    2,表的操作

    数据库中的表有不同的类型,标的类型不同,会对应mysql不同的存储机制,表类型又称为存储引擎.

     SQL解析器,SQL优化器,缓存池,储存引擎等组件在每个数据库中都存在,但不是每个数据库都有这么多引擎,MySQL的插件式储存可以让存储引擎层的开发人员涉及他们需要的存储层.

    2.1>mysql支持的储存引擎

    show enginesG;      #查看所有支持的引擎
    show variables like "storage_engine$";      #查看正在使用的存储引擎

    2.1>InnoDB存储引擎

    支持事物,其设计目标主要向联机事物处理的应用,其特点是行锁设计,支持外键,并支持类似Oracle的非锁定读,即默认读取操作不会产生锁,从MySQL5.5.8版本开始是默认的存储引擎

    InnoDB存储引擎将数据放在一个逻辑表空间中,这个表空间黑盒 一样由InnoDB存储引擎的,表单独放到一个独立的ibd文件中,此外,InnoDB存储引擎支持将将裸设备(row disk)用于建立其表空间

    InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4中隔离级别,默认为REPEATABLE级别,同时使用一种称为netx-key locking的策略来避免幻读现象的产生除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。

    对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。

    InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。

    2.2>MyISAM 存储引擎

    不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同.

    2.3>NDB 存储引擎

    年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。

    2.4>Memory 存储引擎

    正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。

    2.5>Infobright 存储引擎

    第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析

    2.6>NTSE 存储引擎

    网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。

    2.7>BLACKHOLE

    黑洞存储引擎,可以应用于主备复制中的分发主库。

    MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在.

    2.8>指定表类型/存储引擎

    create table t1(id int)engine = innoDB;   
    #默认不写是innoDB

    2.9>查看data文件下数据库的文件:

    #frm是存储数据表的框架结构 
    #.1bd是mysql数据文件 
    #MYD是MyISAM表的数据文件的拓展名 
    #.MYI是MyISAM表的索引的扩展名 
    #发现后两种存储引擎只有表结构,无数据 
    #memory,在重启mysql或者重启机器后,表内数据清空 
    #blackhole,往表内插入任何数据,都相当于丢入黑洞,表内用原不存记录

    2.10>表介绍:

    表想相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为标的字段.

    2.9>创建表 

    语法:

    create table 表名(
    字段名1 类型[(宽度)  约束条件],
    字段名2 类型[(宽度)  约束条件],
    字段名3 类型[(宽度)  约束条件]
    );
    
    #注意
    1,在同一张表中,字段名不能相同
    2,宽度和约束条件可选
    3,字段名和类型是必须的

    2.9.1>创建数据库

    create databases db2;

    2.9.3>使用数据库

    use db2;

    2.9.4>创建表

    create table  a1 (
         id int,           
         name varchar(50),
         
         age int(3)
    );

    2.9.5>插入表的记录

    insert into a1  values
    (1,"雪雪",29),
    (2,"小雪",25),
    (3,"雪儿",23);

    以;作为mysql的结束语

    2.9.6>查询数据表的数据和结构

    1)查询a1表中的存存储数据:

    2)查看a1表的结构

    3)查看表的详细结构

    2.9.7>复制表

    1)创建一个新的数据库db4

    2)使用db4

    mysql> use db4;
    Database changed

    当进入到db4数据库事物,如果想要查看数据库db1中的t5表,则需如下操作.(和导入模块一样)

    3)复制db1.t5的表的结构和记录

    mysql> create table b1 select * from db1.t5;
    Query OK, 3 rows affected (2.10 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql>
    #这是复制标的操作(即复制了表的结构,又复制了表的数据)

    4)查看db4.b1中的数据和表结构

    ps1:如果只要表结构,不要表中的数据

    #在db2数据库下新创建一个b2表,给一个where条件,条件要求不成立,条件为false,只拷贝表结构

    查看表结构:

    查看表中的数据,会发现是空数据

    ps2:使用like(只拷贝表结构,不拷贝记录)

    命令操作如下:

    查看数据结构;

    查看b3表的数据;

     3,表的数据结构

    储存引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但狂赌是可选的,详细参考:http://www.runoob.com/mysql/mysql-data-types.html

    mysql常用数据类型概括:

    #1,数字
        类型:tinyint   int   bigint
        小数:
            float:在位数比较短的情况下不精确
            double:在位数比较长的情况下比较不精确
            decimal:(如果用小数,则用推荐使用decimal)
                精准,   内部原理是以字符串的形式去存
    #2,字符串:
        char(10):简单粗暴,浪费空间,存取速度快
                        root存成root000000
        varchar:精准,节省空间,存取速度慢
        sql优化:创建表时,当场的类型往前放,边长的往后放
                    比如性别         比如地址或者描述信息(为以后表与表之间的管联做准备)
        >255个字符,超了就把文件路径存放到数据库中.
                比如图片,视频找到一个文件服务器,数据库中只存放路径或url
    #3,时间类型:
            最常用:datetime
    #4,枚举类型与几何类型
    
        enum和set    

    3.1>数值类型

    类型:tinyint,smallint,mediumint int bigint

    作用:存储年龄,等级,id各种和数字有关联的数据.

    1,tinyint[(m)] [unsigned]  [zerofill]
        小整型,数据类型用于保存一些范围的整数数值范围;
        有符号:
                -128 ~127
        无符号:
                0~255
        ps:MySQL中无布尔值,使用tinyint(1)表示true,用tinyint(0)表示true.
    2,int[(m)] [unsigned]  [zerofill]
        整数,数据类型用于保存一些范围的整数数值范围:
        有负号:-2147483648 ~ 2147483647
        
        无负号: 0 ~ 4294967295
    3,bigint [(m)] [unsigned] [zerofill]
        大整数,数据类型用于保存一些范围的整数数值范围:
        有负号:-9223372036854775808 ~ 9223372036854775807
        无负号: 0  ~  18446744073709551615

    有负号和 无负号tinyint

    #创建s1表,并规定x字段为tinyint数据类型(默认是有负号的)

    #验证插入-1这个数

    #查询表(默认是有负号的)

    #插入的反为的边界是可以插入的

    证明后面的类型是显示宽度,而不是存储宽度

    ###小结:一般在数字不用在int后边加类型,使用默认值就够了,当指定了宽度即使超过了宽度也能全部显示出来,但是不够指定的宽度,也是可以显示出来的,只不过前边几位没有用数字填充,用0填充也是可以的###

    3.2>浮点型:

    定点数类型:DEC等同于DECIMAL

    浮点类型:FLOAT DOUBLE

    作用:存储薪资,身高,体重,体质参数等.

    1,float[(M,D)] [unsigned] [zerofill]
    #参数解释:单精度浮点数(非准确小数值),M是全长,D是小数点后个数.M最大值为255,D最大值为30.
    #有负号:
                 -3.402823466E+38 to -1.175494351E-38,
               1.175494351E-38 to 3.402823466E+38
    有负号:
                1.175494351E-38 to 3.402823466E+38
    精确度:
        
                **** 随着小数的增多,精度变得不准确 ****
    2,double
    
    double[(M,D)] [unsigned]  [zerofill]
    
    #参数解释:双精度浮点数(费准确小数值), M是全长,D是小数点后个数,M最大值是255,D最大值为30
    
    有负号:
    
            -1.7976931348623157E+308 to -2.2250738585072014E-308
               2.2250738585072014E-308 to 1.7976931348623157E+308
    #无负号:
                2.2250738585072014E-308 to 1.7976931348623157E+308
    #精确度:
                ****随着小数的增多,精度比float要高,但也会变得不准确 ****
    3,decimal
    decimal[((m,d)] [unsigned]  [zerofill]
    #参数解释:经过却的小数值,m是整数部分总个数(负号不算),d是畅销书点后个数,m最大值为65,d最大值为30.
    
    #精确度:
    
                **** 随着小数的增多,精度始终准确 ****
               对于精确数值计算时需要用此类型
               decaimal能够存储精确值的原因在于其内部按照字符串存储。

    由此可以看出随着小数的增多,精度同样都变得不精确,但是decimal的精度最高.

    3.3>日期类型:

    date time datetime timestamp year

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

    语法:
        year:
                YYYY(1901/2155)
        date:
                YYYY-MM-DD(1000-01-01/9999-12-31)
    
        time:
                HH:MM:SS("-838:59:59"/"838:59:59")
    
        datetime:
    
                YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59  Y)
    
        timestamp
    
                YYYYMMDD HHMMSS(1970-01-01 00:00:00/获取到的是年某时)

    3.3.1>:

    在year中无论指定何种宽度都是4位,年份的范围是(1901/2155)这两个临界点也包括,在这个范围插入数据才生效.

    3.3.2>date year datetime 

    在mysql中有一个自带的now()函数,获取的是当前类型的时间(时间戳时间)

     

    3.3.3>timestamp(时间戳)

    ###当插入timestamp的值为空或者为null,或者到用内置函数now()时都是获得当前时间

    4,字符类型

    官网:https://dev.mysql.com/doc/refman/5.7/en/char.html

    注意:char和varchar括号内的参数指的都是字符的长度.

    char类型:定长,简单粗暴,浪费空间,存储速度快

       字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
        存储
            存储char类型的值时,会往右填充空格来满足长度
            例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储

      检索:在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(设置SQL模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
          查询sql的默认模式:select @@sql_mode;)

    varchar类型:变长,精准,节省空间,存取速度慢
        字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)

       存储
            varchar类型存储数据的真实内容,不会用空格填充,如果'ab  ',尾部的空格也会被存起来
            强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
            如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
            如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)

        检索
            尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容

    官网:

    查看:length();查看字节数;    char_length();查看字符数;

    当我们创建好表和数据的时候,查看char字符数的时候,系统会自动的将多余的空格删掉,因此像图一显示查到的字符数是汉子的数目,而varchar不会出现这样的情况.

    如果想查看char的实际字符数,需要修改一下mode:set sql_mode = "pad_char_full_length";

    查看字节数:

    ###char类型:3个中文字符+2个空格 = bytes

    ###varchar类型:3个中文字符+1个空格=10bytes.

    5,没举型和集合型;

    字段的值只能在给定范围中选择,如单选框,复选框

    enum单选 ,只能在给定的范围内选一个值,如性别sex男male/女female

    set多选在给定的范围内 可以选择一个或一个以上的值

    enum:

      create table consumer(

            id int unsigend,

            name char(20),

            sex enum("male","female")not null default "male",

            fav set("抽烟","喝酒","烫头")

      );

      insert into consumer(id,name,sex,fav) values(1,"alex","female","抽烟","烫头");

      insert into consumer(id,name,sex) values(2,"alex2","female");

    6,表的约束:

    约束是在创建表的时候对表以后插入的数据进行约束,从而来保证数据的一致性与完整性.

    1>not null不为空

    2>default设置默认值

    3>unique唯一性

    4>primary key,表示:唯一且不为空,主键在sql中只允许表中有一个主键,通常主键是id 

    5>auto-increment表示自增长

    6>foreign key:是建立多个表中的映射关系的.

    7>undigned:表示无符号

    8>zerofill:表示使用0填充

    1,2.1>not null表示不为空,null表示为空,非字符串

    create table tb1(
                 nid int not null default 2,               #表示插入的这个数字不为空,且不给值的情况下默认值为2.         
                 num int not null               #表示插入的第二个数字不能为空
    
    );
    insert into tb1(num) values(3);

    1,)当有默认值字段的时候在插入数据表后面当不指明数据变量的时候,必须插入相应的数据,默认数据对应的数据类型不可空缺,当指明表姐够的数据变量的时候就好了指谁就插入谁.

    3.1>unique:不同的唯一的

    #单列唯一(给某一行设置它的唯一性)
    create table  department(
              id int,
              name char(10) unique   
    )
    insert into department values(1,"雪雪"),(2,"小雪");

    当插入的name字段的值相同的时候会包错:

    3.2>多列唯一:每个字段都设置unique

    #每个字段都设置unique
    create table department2(
                    in int unique,
                    name char(10) unique
    );      
    
    #或者
    
    create table department2(
                    id int,
        
                    name char(10),
                    unique(id),
    
                     unique(name)
    ); 
    
    #在最后设置字段的约束条件.必须每个都满足条件才可以插入数据
    
    insert into department2 values(1,"it1"),(2"it2");                  

    3.3>组合唯一:

    create table department3(
                  id int, 
                  name char(10),
                  unique(id,name)
    );
    
    insert into department3 values(1."it"),(2,"it");
    
    #只要有一个字段不一样,都可以插入只要有一个数据不一样就可以插入.

    4.1>primary key主键(一个列表中可以单列做主键,也可以多列做主键,约束等同于not null unique),字段的值不为空且唯一,存储引擎默认是(innoDB):对于innoDB存储引擎来说,一张表必须有一个主键.

    化学反应:not null + unique === primary key

    5.1>auto_increment:自增长(默认从1开始)

    结论:可以指定id值去插入数据,注意插入的数据id必须是增长的,中间可以有间隔,但必须是增长的,但在后边在不指定插入数据的时候会在默认最后一个id值追加一个id值,(即使前边有没有用的id值)

    5.2>设置自增长的值

    5.2.1>设置步长为会话设置,只在本次连接中有效,当关闭服务器,或者退出管理员系统这个设置就会消失

    set  session auto_increment_increment=5;

    全局设置步长都有效.

    set gloable auto_increment_increment=5;

    设置起始偏移量

    set gloable auto_increment_offset=3;

    注意:如果设置的偏移量大于步长的值,则偏移量的值会被忽略.

    设置完之后exit,待系统识别以后,再登陆才会有效.

    6,1>foreign key是在靓装关联表建立关系

    建立关系:constraint fk_id foreign key(dep_id) references dep(id)

        on delete cascade       on update cascade

    结论:1>当2张表建立关系以后,删除主表 的时候 ,从表因为关联,也会删除相关联的数据,删除从表的受任何数据,主表不会受到任何的影响 ,

      2>在建立标的时候一定要先建立主表,再建立从表,在插入数据的时候也是先插入主表的数据,再插入从表的数据(都是血的教训)

    补充:清空区分delete和truncate:

    delete from t1;  # 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始

    truncate table t1;  # 数据量大,删除速度比上一条快,且直接先从0开始.

      

     

  • 相关阅读:
    jQuery 动画之 添加商品到购物车
    <% %> 、 <%= %> 、<%# %> 的区别
    WebFrom模拟MVC
    MVC 基础
    LinQ to SQL 存储过程
    Leetcode练习(Python):数组类:第26题:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
    Leetcode练习(Python):数组类:第18题:给定一个包含&#160;n 个整数的数组&#160;nums&#160;和一个目标值&#160;target,判断&#160;nums&#160;中是否存在四个元素 a,b,c&#160;和 d&#160;,
    Leetcode练习(Python):数组类:第16题:给定一个包括&#160;n 个整数的数组&#160;nums&#160;和 一个目标值&#160;target。找出&#160;nums&#160;中的三个整数,使得它们的和与&#160;target&#160;最接近。返回这三个数的和。假定每组输入只存在唯一答案。
    Leetcode练习(Python):数组类:第15题:给你一个包含 n 个整数的数组&#160;nums,判断&#160;nums&#160;中是否存在三个元素 a,b,c ,使得&#160;a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。
    Leetcode练习(Python):数组类:第11题:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点&#160;(i,&#160;ai) 。在坐标内画 n 条垂直线,垂直线 i&#160;的两个端点分别为&#160;(i,&#160;ai) 和 (i, 0)。找出其中的两条线,使得它们与&#160;x&#160;轴共同构成的容器可以容纳最多的水。
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/9801305.html
Copyright © 2020-2023  润新知