zoukankan      html  css  js  c++  java
  • 数据库操作,基础数据类型,表的完整性约束条件

    一、mysql的sql语言分类

    SQL语言一共分为4大类:
    数据定义语言DDL,
    数据操纵语言DML,
    数据查询语言DQL,
    数据控制语言DCL.  
    1.数据定义语言DDL (对象是:数据库和表)
    #数据库相关操作
    关键词: create alter drop truncate(删除当前表再新建一个一模一样的表结构)
    查看数据库:show databases; #查看数据库详细信息 show create database school G; 增加数据库:create database school; 删除数据库:drop database school; 切换数据库:use school; 查看数据库里存在的表:show tables;
       该数据库编码: alter database school charset utf8;

    2.数据操纵语言DML(Data Manipulation Language)
    #记录相关操作      对象:纪录(行)   关键词:insert update delete   插入:insert into student values(
    01,'tonbby',99); (插入所有的字段)      insert into student(id,name) values(01,'tonbby'); (插入指定的字段)   更新:update student set name = 'tonbby',score = '99' where id = 01;   删除:delete from tonbby where id = 01;
    注意:   开发中很少使用delete,删除有物理删除和逻辑删除,其中逻辑删除可以通过给表添加一个字段(isDel),若值为1,代表删除;
    若值为0,代表没有删除。此时,对数据的删除操作就变成了update操作了。
    truncate和delete的区别:   truncate是删除表,再重新创建这个表。属于DDL,delete是一条一条删除表中的数据,属于DML。
    3.数据查询语言DQL(Data Query Language)
      select ...
    from student where 条件 group by 分组字段 having 条件 order by 排序字段   执行顺序:from->where->group by->having->order by->select 注意:group by 通常和聚合函数(avg(),count()...)一起使用 ,经常先使用group by关键字进行分组,然后再进行集合运算。      group by与having 一起使用,可以限制输出的结果,只有满足条件表达式的结果才会显示。
    having和where的区别:     两者起作用的地方不一样,where作用于表或视图,是表和视图的查询条件。having作用于分组后的记录,用于选择满足条件的组
    4.数据控制语言DCL(Data Control Language)  
      数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视,用户,权限,事务等。
      grant:授权,rollback:回滚。commit:提交。

    创建数据库共享用户

    #进入mysql客户端
    $mysql
    mysql> select user();  #查看当前用户
    mysql> exit     # 也可以用q quit退出
    
    # 默认用户登陆之后并没有实际操作的权限
    # 需要使用管理员root用户登陆
    $ mysql -uroot -p   # mysql5.6默认是没有密码的
    #遇到password直接按回车键
    mysql> set password = password('root'); # 给当前数据库设置密码
    
    # 创建账号
    mysql> create user 'eva'@'192.168.10.%'   IDENTIFIED BY '123';# 创建用户并指定IP段
    mysql> create user 'eva'@'192.168.10.5'   # 指示某机器可以连接
    mysql> create user 'eva'@'%'                    #指示所有机器都可以连接  
    mysql> show grants for 'eva'@'192.168.10.5';查看某个用户的权限 
    # 远程登陆
    $ mysql -uroot -p123 -h 192.168.10.3
    
    # 给账号授权
    mysql> grant all on *.* to 'eva'@'%';
    mysql> flush privileges;    # 刷新使授权立即生效
    
    # 创建账号并授权
    mysql> grant all on *.* to 'eva'@'%' identified by '123' 

    #删除授权的账号
    Delete from mysql.user where user = "user_name" and host = "host_name" ;  host:是IP地址,uer是用户名.
    #查看都有哪些授权用户:
    SELECT DISTINCT CONCAT('User:',user,'@',host,';') AS query FROM mysql.user;

    查看mysql是否为严格模式:
    select @@sql_mode;

    #导入sql文件:
    source 文件绝对路径

    二、关于库的操作:

    什么是mysql库:
    就是在mysqldata下的目录

    创建数据库语法:
    create database 数据库名 charset utf8;
    数据库命名规则:
       1.可以由字母、数字、下划线、@、#、$
       2.区分大小写
          3.唯一性
          4.不能使用关键字如 create select
          5.不能单独使用数字
          6.最长128位
    # 基本上跟python或者js的命名规则一样        
    关于库的操作指令:
    1 查看数据库 show databases;
      show create database 数据库G; #查看详细信息

    2 创建数据库 create database db1 charset utf8;
    3 选择数据库 USE 数据库名 4 删除数据库 DROP DATABASE 数据库名; 5 修改数据库 alter database db1 charset utf8;

    三、基础数值类型

    介绍:
    存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的
    类型概览:
      1.数值类型
      2.字符串类型
      3.时间类型
      4.枚举与集合类型

       数值类型

    数值类型:整数,浮点数,位类型
    作用:存储年龄,等级,id,各种号码等
        #unsigned 无符号
        #zerofoll 使用0填充
    #在严格模式下,字段类型为无符号的整数,若输入的内容为负数或者超出存储范围,将报错;反之,会将负数改为0,超范围的值,按最大范围存储
    整数类型:tinyint,int,bigint,SMALLINT,MEDIUMINT tinyint(m) unsigned zerofill   小整数,数据类型用于保存一些范围的整数数值范围:   有符号: -128 ~ 127   无符号:0 ~ 255 int(m) unsigned zerofill   整数,数据类型用于保存一些范围的整数数值范围:   有符号:-2147483648 ~ 2147483647   无符号:0 ~ 4294967295 bigint(m) unsigned zerofill   大整数,数据类型用于保存一些范围的整数数值范围:   有符号:-9223372036854775808 ~ 9223372036854775807   无符号:0 ~ 18446744073709551615
    1.设置无符号int
    create table t4(x int unsigned);
    insert into t4 values(-1),(0),(4294967295),(4294967296); 
    select * from t4;    
    
    2.用zerofill测试整数类型的显示宽度
    create table t5(x int(3) zerofill);  #int(3) 表示的是显示宽度,不够3位用0补齐
    insert into t5 values(1),(11),(110001),(1111111);
    
    注意
      对于整型来说,数据类型后面的宽度并不是存储长度限制,而是显示限制,假如:int(8),那么显示时不够8位则用0来填充,够8位则正常显示,
      通过zerofill来测试,存储长度还是int的4个字节长度

     

      浮点数

    定点数类型  dec,等同于decimal  
    浮点类型:float(m,d)   #m 是总的位数,d 是小数部分位数  double(m,d)   decimal(m,d)
    作用:存储薪资、身高、温度、体重、体质参数等
    1.FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    #单精度浮点数(非准确小数值),m是整数部分+小数部分的总个数,d是小数点后个数。m最大值为255,d最大值为30,例如:float(255,30)
    精确度:  随着小数的增多,精度变得不准确 
    
    2.DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
     双精度浮点数(非准确小数值),m是整数部分+小数部分的总个数,d是小数点后个数。m最大值也为255,d最大值也为30
    精确度:
    随着小数的增多,精度比float要高,但也会变得不准确 
    
    3.decimal[(m[,d])] [unsigned] [zerofill]
    准确的小数值,m是整数部分+小数部分的总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。比float和double的整数个数少,但是小数位数都是30位
    精确度:随着小数的增多,精度始终准确 
    
    注意
        精度从高到低:decimal、double、float
        decimal精度高,但是整数位数少
        float和double精度低,但是整数位数多

           位类型

    BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
    注意:
      对于位字段需要使用函数读取   bin()显示为二进制   hex()显示为十六进制
     1 mysql> create table t9(id bit);
     2 mysql> desc t9; #bit默认宽度为1
     3 +-------+--------+------+-----+---------+-------+
     4 | Field | Type   | Null | Key | Default | Extra |
     5 +-------+--------+------+-----+---------+-------+
     6 | id    | bit(1) | YES  |     | NULL    |       |
     7 +-------+--------+------+-----+---------+-------+
     8 
     9 mysql> insert into t9 values(8);
    10 mysql> select * from t9; #直接查看是无法显示二进制位的
    11 +------+
    12 | id   |
    13 +------+
    14 |     |
    15 +------+
    16 mysql> select bin(id),hex(id) from t9; #需要转换才能看到
    17 +---------+---------+
    18 | bin(id) | hex(id) |
    19 +---------+---------+
    20 | 1       | 1       |
    21 +---------+---------+
    22 
    23 mysql> alter table t9 modify id bit(5);
    24 mysql> insert into t9 values(8);
    25 mysql> select bin(id),hex(id) from t9;
    26 +---------+---------+
    27 | bin(id) | hex(id) |
    28 +---------+---------+
    29 | 1       | 1       |
    30 | 1000    | 8       |
    31 +---------+---------+
    32 
    33 位类型测试
    位类型测试

          日期类型

    类型:date,time,datetime,IMESTAMP,YEAR 
    作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
    year类型介绍
            YYYY(范围:1901/2155)2018
    
    date
            YYYY-MM-DD(范围:1000-01-01/9999-12-31)例:2018-01-01 
    
    time    时分秒
            HH:MM:SS(范围:'-838:59:59'/'838:59:59')例:12:09:32
    
    datetime    #年月日时分秒,默认值为null   #常用这个,将它设置为not null,再给它个default now()就能实现timestamp的效果
                YYYY-MM-DD HH:MM:SS(范围:1000-01-01 00:00:00/9999-12-31 23:59:59    Y)例: 2018-01-01 12:09:32
    
    timestamp    #年月日时分秒,默认不为空,默认值为当前时间,但只能使用到2037年
                YYYYMMDD HHMMSS(范围:1970-01-01 00:00:00/2037 年某时
    
    示例
    year类型
      create table t10(born_year year); #无论year指定何种宽度,最后都默认是year(4)
      insert into t10 values  
      (1900),(1901),(2155),(2156);
    
    date,time,datetime类型
      create table t11(d date,t time,dt datetime);
      insert into t11 values(now(),now(),now());
    
    timestamp类型
      create table t12(time timestamp);
      insert into t12 values();
      insert into t12 values(null);
    
    注意
    1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
    2. 插入年份时,尽量使用4位值
    3. 插入两位年份时,<=69,以20开头,比如输入50,  结果2050      
                        >=70,以19开头,比如输入71,结果1971
    4.工作中一般都用datetime就可以了
    1 1.create table t1(x datetime not null default now()); # 需要指定传入空值时默认取当前时间
    2     insert into t1 values();
    3 
    4 2.create table t2(x timestamp); # 无需任何设置,在传空值的情况下自动传入当前时间
    5     insert into t2 values();
    关于datetime修改存储的默认值

       字符串类型(参数是字符长度限制,严格模式下,超过则报错)

    char()    #定长,存储时就按这个长度存储,不够补0,特点是:增加了查找时速度;
    varchar()  #在存储时有伸缩性.

      length(字段) #查看该字段数据的字节长度
      char_length(字段) #查看该字段数据的字符长度
    注意
    char和varchar括号内的参数指的都是字符的长度(存储时也时按照这个值来开辟内容空间值)
      char字符长度为(0-255) #一个中文是一个字符,是utf8编码的3个字节
          特点是插入和读取的速度很快(因为数据的存储长度是死的),缺点是浪费了空间.
      varchar字符长度为(0-21843) 应用字段:
      名字,信息等等
    1 通过mysql提供的一个char_length()方法来查看一下所有数据的长度
    2 select char_length(name) from t1;
    char_length的使用

      其他字符串类型

      枚举类型与集合类型

    enum(1,2,3) 枚举类型,单选    只能在给定的范围内选一个值,如性别 sex 男male/女female
    set("a","b","c") 集合类型,多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
    示例
    #创建表 create table consumer( name varchar(
    50), enum('male','female'), level enum('vip1','vip2','vip3','vip4','vip5'), #在指定范围内,多选一 hobby set('play','music','read','study') #在指定范围内,多选多 ); #加入数据 insert into consumer values ('xiaogui','male','vip5','read,study'), ('taibai','female','vip1','girl');

    四、表的完整性约束(需要记住)

    作用:用于保证数据的完整性和一致性
      #约束条件与数据类型的宽度一样,都是可选参数
    约束条件分类:
    primary key(pk) 主键. (唯一的标识记录.可以加快查找速度,一般和自动增长一起用) foreign KEY(fk) 外键 not null    该字段不能为空 unique key(uk) 该字段的值唯一,不可重复 auto_increment 该字段的值自动增长(整数类型,而且为主键) default x 设置默认值

     注意:

    1. 是否允许为空,默认null,可设置not null,字段不允许为空,必须赋值
    2. 字段是否有默认值,缺省的默认值是null,如果插入记录时不给字段赋值,此字段使用默认值   sex enum('male','female') not null default 'male' #enum() 单选;set()多选   age int unsigned nut null default 20 # uningned 意为必须为正值(无符号),不允许为空,默认是20
    3. 是否是key   主键 primary key   外键 foreign key   索引 (index,unique...)

      not null与default的使用

    not null  不可为空
    null      可空
    default 设置默认值,当插入时没有给该字段数据,则自动补齐为默认值

    示例   create table tb1(     nid int
    not null defalut 2,     num int not null);

    注意:
    1.即便是你只给一个字段传值了,那么也是生成一整条记录,这条记录的其他字段的值如果可以为空,那么他们就都是null空值,如果不能为空,就会报错
    2.如果是非严格模式,int类型不传值的话会默认为0,因为null不是int类型的,字段是int类型,所以他会自动将null变为0
     1 ==================not null====================
     2 mysql> create table t1(id int); #id字段默认可以插入空
     3 mysql> desc t1;
     4 +-------+---------+------+-----+---------+-------+
     5 | Field | Type    | Null | Key | Default | Extra |
     6 +-------+---------+------+-----+---------+-------+
     7 | id    | int(11) | YES  |     | NULL    |       |
     8 +-------+---------+------+-----+---------+-------+
     9 mysql> insert into t1 values(); #可以插入空
    10 
    11 
    12 mysql> create table t2(id int not null); #设置字段id不为空
    13 mysql> desc t2;
    14 +-------+---------+------+-----+---------+-------+
    15 | Field | Type    | Null | Key | Default | Extra |
    16 +-------+---------+------+-----+---------+-------+
    17 | id    | int(11) | NO   |     | NULL    |       |
    18 +-------+---------+------+-----+---------+-------+
    19 mysql> insert into t2 values(); #不能插入空
    20 ERROR 1364 (HY000): Field 'id' doesn't have a default value
    21 
    22 
    23 
    24 ==================default====================
    25 #设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值
    26 mysql> create table t3(id int default 1);
    27 mysql> alter table t3 modify id int not null default 1;
    28 
    29 
    30 
    31 ==================综合练习====================
    32 mysql> create table student(
    33     -> name varchar(20) not null,
    34     -> age int(3) unsigned not null default 18,
    35     -> sex enum('male','female') default 'male',
    36     -> hobby set('play','study','read','music') default 'play,music'
    37     -> );
    38 mysql> desc student;
    39 +-------+------------------------------------+------+-----+------------+-------+
    40 | Field | Type                               | Null | Key | Default    | Extra |
    41 +-------+------------------------------------+------+-----+------------+-------+
    42 | name  | varchar(20)                        | NO   |     | NULL       |       |
    43 | age   | int(3) unsigned                    | NO   |     | 18         |       |
    44 | sex   | enum('male','female')              | YES  |     | male       |       |
    45 | hobby | set('play','study','read','music') | YES  |     | play,music |       |
    46 +-------+------------------------------------+------+-----+------------+-------+
    47 mysql> insert into student(name) values('chao');
    48 mysql> select * from student;
    49 +------+-----+------+------------+
    50 | name | age | sex  | hobby      |
    51 +------+-----+------+------------+
    52 | chao|  18 | male | play,music |
    53 +------+-----+------+------------+
    54 
    55 not null和default测试
    代码实例

       unique

    不可重复,唯一属性(id,身份证号等)
    写在数据类型后面的附加属性,有加速查询的作用
    示例一(常规设置)
    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)
    );

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

      primary key

    primary key  不为空且唯一,并且它时innodb(索引组织表)存储引擎组织数据的依据,一张表中必须有且只有一个主键,不给出,则系统底层隐藏补齐
    
    一个表中可以:
      单字段做主键
      多字段做主键(复合主键或者叫做联合主键)
    在没有设置主键的时候,not null+unique会被默认当成主键
    示例(单列做主键)
    
    设置主键方法一:not null+unique
    create table department1(
    id int not null unique, #主键
    name varchar(20) not null unique,
    comment varchar(100)
    );
    
    设置主键方法二:在某一个字段后用primary key
    create table department2(
    id int primary key, #主键
    name varchar(20),
    comment varchar(100)
    );
    
    设置主键方法三:在字段末尾单独定义primary key
    create table department3(
    id int,
    name varchar(20),
    comment varchar(100),
    constraint pk_name primary key(id); #创建主键并为其命名pk_name
    ------------------------------------------------------------------------------
    联合主键和联合唯一类似
    create table t10(
                id int,
                port int,
                primary key(id,port));
    #联合主键.(两个字段的信息在输入时,只要有一个不重复,就为True)

       auto_increment

    约束字段为自动增长,被约束的字段必须同时被key约束,也就是说只能给约束成key的字段加自增属性,默认起始位置为1,步长也为1.
    示例
    create table student(
    id int primary key auto_increment,  #必须跟key 的字段加自动化增长
    name varchar(20),
    sex enum('male','female') default 'male'
    );
    在创建完表后,修改自增字段的起始值
    create table student(
    id int primary key auto_increment,
    name varchar(20),
    sex enum('male','female') default 'male');
    修改自增字段起始值
    alter table student auto_increment=3;
    
    也可以创建表时指定auto_increment的初始值,注意初始值的设置为表选项,应该放到括号外
    create table student(
    id int primary key auto_increment,
    name varchar(20),
    sex enum('male','female') default 'male'
    )auto_increment=3;
    
    设置全局步长(重启服务端后失效)
    set global auto_increment_increment=5;#设置步长
    
    set global auto_increment_offset=3; #设置起始偏差量

       foreign key(了解)

    设置表的关联关系
      一对多的关系 (foreign key 写在多的那边)
      多对多的关系  (创建第三张表)
    
    foreign key的几个约束作用:
      1、先要建立被关联的表才能建立关联表
      2、在插入数据记录的时候,要先向被关联表中插入数据,才能往关联表里面插入数据
      3、更新或者删除数据的时候,都需要考虑关联表和被关联表的关系
    
    注意:
      a.删除表的时候,先删除关联表,再删除被关联表
      b.重建表的时候,在加外键关联的时候加上这一句:
      #即联删除和即联更新
    on delete cascade  on update cascade
    示例
    #表类型必须是innodb存储引擎,且被关联的字段,即references指定的另外一个表的字段,必须保证唯一
    #创建父表
    create table department( id int primary key, name varchar(20) not null )engine=innodb; #创建一个名为fk_name的外键关联,这个constraint就是一个声明的作用,在创建外键的时候不加constraint fk_name也是没问题的。 create table employee( id int primary key, name varchar(20) not null, dpt_id int, constraint fk_name foreign key(dpt_id) references department(id) on delete cascade on update cascade )engine=innodb; #先往父表department中插入记录 insert into department values (1,'欧德博爱技术有限事业部'), (2,'艾利克斯人力资源部'), (3,'销售部'); #再往子表employee中插入记录 insert into employee values (1,'chao',1), (2,'alex1',2), (3,'李坦克',3), #删父表department,子表employee中对应的记录跟着删 delete from department where id=3; select * from employee;
     1 #一定是student来foreign key表customer,这样就保证了:
     2 #1 学生一定是一个客户,
     3 #2 客户不一定是学生,但有可能成为一个学生
     4 
     5 
     6 create table customer(
     7 id int primary key auto_increment,
     8 name varchar(20) not null,
     9 qq varchar(10) not null,
    10 phone char(16) not null
    11 );
    12 
    13 
    14 create table student(
    15 id int primary key auto_increment,
    16 class_name varchar(20) not null,
    17 customer_id int unique, #该字段一定要是唯一的
    18 foreign key(customer_id) references customer(id) #外键的字段一定要保证unique
    19 on delete cascade
    20 on update cascade
    21 );
    22 
    23 
    24 #增加客户
    25 insert into customer(name,qq,phone) values
    26 ('李飞机','31811231',13811341220),
    27 ('王大炮','123123123',15213146809),
    28 ('守榴弹','283818181',1867141331),
    29 ('吴坦克','283818181',1851143312),
    30 ('赢火箭','888818181',1861243314),
    31 ('战地雷','112312312',18811431230)
    32 ;
    33 
    34 
    35 #增加学生
    36 insert into student(class_name,customer_id) values
    37 ('脱产3班',3),
    38 ('周末19期',4),
    39 ('周末19期',5)
    40 ;
    41 
    42 一对一简单示例
    一对一简单示例

      将来你们接触某一些大型项目的时候,尽量不要给表建立外键关系,因为外键直接在数据库级别就变成耦合的了,那么我们要拓展或者删除或者更改某些数据库或者数据表的时候,拓展起来就比较难,我们可以自己从自己的程序代码的逻辑层面上将这些关联关系建立好,有很多公司就是这么做的,利于拓展,如果我们加了很多的foreign key ,那么当你想删除一个表的时候,可能会牵一发而动全身,了解一下就可以了

  • 相关阅读:
    C++11:22委托构造函数和继承构造函数
    C++11:21通过智能指针管理第三方库分配的内存
    python 常识
    计算机基础
    XML
    flask请求上下文 及相关源码
    Flask框架
    Django orm 常用字段和参数
    docker 使用
    视图家族
  • 原文地址:https://www.cnblogs.com/lgw1171435560/p/10279178.html
Copyright © 2011-2022 走看看