初学mysql基础

1、mysql 安装配置更改密码:

  • 1) 下在mqsql 免安装版本,解压至指定路径
  • 2) mysql 根目录创建一个data 文件夹和my.ini
        E:\software\mysql-8.0.11\data
        ‪E:\software\mysql-8.0.11\my.ini
        在my.ini下输入以下内容
     [mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=E:\\software\mysql-8.0.11
# 设置mysql数据库的数据的存放目录
datadir=E:\\software\mysql-8.0.11\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10000
# 服务端使用的字符集默认为UTF8  windows 10 1803 版本下不用设置字符集
#mysql> show variables like '%char%';
#+--------------------------+------------------------------------------+
#| Variable_name            | Value                                    |
#+--------------------------+------------------------------------------+
#| character_set_client     | gbk                                      |
#| character_set_connection | gbk                                      |
#| character_set_database   | utf8mb4                                  |
#| character_set_filesystem | binary                                   |
#| character_set_results    | gbk                                      |
#| character_set_server     | utf8mb4                                  |
#| character_set_system     | utf8                                     |
#| character_sets_dir       | E:\software\mysql-8.0.11\share\charsets\ |
#+--------------------------+------------------------------------------+
# 配置完成后字符集是utf8mb4
#character-set-server=utf8  
# 创建新表时将使用的默认存储引擎
#default-storage-engine=INNODB
#wait_timeout=31536000
#interactive_timeout=31536000
#如果远程工具如sqlyog无法连上提示Authentication plugin 'caching_sha2_password' cannot be loaded
#就加上以下这句
#default_authentication_plugin=mysql_native_password
#sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[mysql]
# 设置mysql客户端默认字符集
#default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
#default-character-set=utf8
        配置字符集为utf-8后
        mysql> show variables like '%char%';
        #+--------------------------+------------------------------------------+
        #| Variable_name            | Value                                    |
        #+--------------------------+------------------------------------------+
        #| character_set_client     | utf8                                     |
        #| character_set_connection | utf8                                     |
        #| character_set_database   | utf8                                     |
        #| character_set_filesystem | binary                                   |
        #| character_set_results    | utf8                                     |
        #| character_set_server     | utf8                                     |
        #| character_set_system     | utf8                                     |
        #| character_sets_dir       | E:\software\mysql-8.0.11\share\charsets\ |
        #+--------------------------+------------------------------------------+
  • 3) 将MySQL安装的bin目录添加到环境变量
    E:\software\mysql-8.0.11\bin 
  • 4)用管理员权限打开控制台,进入E:\software\mysql-8.0.11\bin
    输入
  mysqld --install  [服务名]--安装MySQL 服务
  mysqld --remove  [服务名]  --也可以用sc delete 服务名  删除服务 
  • 5) 初始化: mysqld --initialize
  • 6) 启动服务: net start mysql(服务名称)
           关闭服务 net stop mysql -- Windows 10 须在管理员模式下进行
  • 7) 登录:mysql -u root -p
    输入密码: –此时的密码是一个随机密码,密码在data目录下的.err文件里面
  generated for root@localhost: SpCdaszoz5,p
  • 8) 成功登陆之后 开始更改密码:
ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY 'Root1234';
        更改之后就重新登陆就可以使用新密码了      

- 9) 为管理员root授权(可选) , 操作过程很奇葩 必须先要删除root用户
再创建它才能用grant – 否则会报

You are not allowed to create a user withGRANT;             
-- 是不是很惊喜

一起来看看吧

#mysql> drop user root@localhost;   
-- 删除用户     
#Query OK, 0 rows affected (0.09 sec)                       
#mysql> flush privileges;
 -- 使得操作生效
#Query OK, 0 rows affected (0.01 sec)   
-- 重新创建用户       
#mysql> create user root@localhost identified by 'Root1234';            #Query OK, 0 rows affected (0.04 sec)   
-- 为用户授权                    
#mysql> grant all on *.* to root@localhost with grant option;           #Query OK, 0 rows affected (0.09 sec)

2、mysql 忘记密码:
这一块儿按照网上的教程还没有成功过
3、数据库的编码一般和本地机器的编码一致.
查看数据库编码:show create database 数据库名;
4、创建数据库:create database 数据库名;
5、查询当前使用的数据库:select database();
6、查询数据库中的表:show tables;
7、数据库中使用的数据类型:

  • 1> 字符类型:

    • 固定长度的字符类型:
      • char(#number):#number的值范围[0-255]字节 非二进制字符串
      • binary(#number):#number的值范围[0-255]字节 二进制字符串没有字符集
    • 自动变换长度的字符类型:
      • varchar(#number) #number的值范围[0-65535]字节 非二进制字符串
      • varbinary(#number) #number的值范围[0-65535]字节 二进制字符串
      • blob类型:BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
    tinyblob:   0-255字节       不超过 255 个字符的二进制字符串    
    blob:       0-65535字节         二进制形式的长文本数据       2^16 -1  64 kb
    mediumblob: 0-16777215字节      二进制形式的中等长度文本数据  2^24 -1, 2^14kb,2^4Mb,
    longblob:   0-4294967295字节  二进制形式的极大文本数据    2^32 -1, 2^22kb,2^12Mb,2^2Gb
  • Text类型:tinyblob 类似,存储普通文本数据
tinytext:   短文本字符串
text:       长文本字符串
mediumtext: 中等长度文本数据
longtext:   极大长度文本数据
  • char,varchar,text 的常用修饰符:
A>.NOT NULL(非空约束)
B>.NULL(允许为空)
C>.default 'string'(默认值,不适用于text类型)
D>.CHARACTER SET 字符集
      mysql>show variables like '%char%'; #查看默认的字符集
      mysql>show character set;     #查看数据库支持的字符集
E>.collation '规则':排序规则  
       msyql>show collation;                #查看数据库支持的排序规则
  • 2> 数值类型:

    • 精确数值类型:

          类型       大小 范围(有符号) 范围(无符号) 用途
          TINYINT      1字节    [-2^7 ,2^7 -1]  [0,2^8-1]       小整数值
          SMALLINT     2字节    [-2^15,2^15-1]  [0,2^16-1]      大整数值
          MEDIUMINT    3字节    [-2^23,2^23-1]  [0,2^24-1]      大整数值
          INT或INTEGER 4字节 [-2^31,2^31-1]  [0,2^32-1]      大整数值
          BIGINT       8字节    [-2^63,2^63-1]  [0,2^64-1]      极大整数值
      
       
      
      • 整形的常用属性修饰符:

             A>. AUTO_INCREMENT: 自动增长(前提:非空,且唯一,
        支持索引,非负值[UNSIGNED],
        注意:TRUNCATE 用来清空表中数据)
             B>. LEST_INSERT_ID():可以查看上次增长的数值,当插入
        多行时,只记录第一行
             C>. UNSIGNED:无符号
             D>. NULL
             E>. NOT NULL
             F>. DEFAULT

    • 近似数值类型:

+----------------------------------------------------------------------------------------+  
|类型   | 大小  |范围(有符号)                | 范围(无符号)            |用途           |
|FLOAT  | 4字节 |(-3.402823466E+38,           | 0,(1.175494351E-38,        |单精度浮点数值 |
|       |       |-1.175494351E-38),         | 3.402823466E+38)           |               |
|       |       |0,(1.175494351E-38,        |                            |               |
|       |       |3.402823466351E+38)        |                            |               |
|-------+-------+---------------------------+----------------------------+---------------+
|DOUBLE | 8字节 |(-1.7976931348623157E+308, | 0,(2.2250738585072014E-308,| 双精度浮点数值|
|       |       |-2.2250738585072014E-308), | 1.7976931348623157 E+308)  |               |
|       |       |0,(2.2250738585072014E-308,|                            |               |
|       |       |1.7976931348623157E+308)   |                            |               |
|-------+-------+---------------------------+----------------------------+---------------+
|DECIMAL| 对DECIMAL(M,D),  |依赖于M和D的值  | 依赖于M和D的值             |    小数值     |
|       | 如果M>D,为M+2否  |                |                            |               |
|       | 则为D+2            |                |                            |               |
+----------------------------------------------------------------------------------------+

浮点型常用修饰符:(使用g,f来定义总共有多少数字和小数点后有多少数字)
      

    A>. NULL
  B>.   NOT NULL
  C>.   UNSIGNSD
  D>.   DEFAULT

3> 日期类型:

+--------------------------------------------------------------------------------------+
|类型   |小(字节)|             范围             |   格式         | 用途               |
|DATE     |3       |    1000-01-01/9999-12-31    |   YYYY-MM-DD     | 日期值          |
|---------+--------+-----------------------------+------------------+------------------|
|TIME     |3       |    '-838:59:59'/'838:59:59' |   HH:MM:SS       | 时间值或持续时间 |
|---------+--------+-----------------------------+------------------+------------------|
|YEAR     |1       |    1901/2155                |   YYYY           | 年份值          |
|---------+--------+-----------------------------+------------------+------------------|
|DATETIME |8       |    1000-01-01 00:00:00/     |   YYYY-MM-DD     | 混合日期和时间值 |
|         |        |    9999-12-31 23:59:59      |   HH:MM:SS       |                  |
|---------+--------+-----------------------------+------------------+------------------|       
|TIMESTAMP|4       |    1970-01-01 00:00:00/2038 |   YYYYMMDD HHMMSS|  混合日期和时间值|        
|         |        |结束时间是第 2147483647 秒, |                  |   时间戳        |
|         |        |北京时间 2038-1-19 11:14:07  |                  |                  |
|         |        |格林尼治时间 2038年1月19日    |                  |                  |
|         |        |凌晨 03:14:07              |                  |                  |
+--------------------------------------------------------------------------------------+

日期时间型常用的修饰符
 

 A>.NULL
 B>.NOT NULL
 C>.DEFAULT 
  • 4> 布尔类型:MySQL其实没有真正意义上的布尔型,而是使用的tinyint(微整型),而且只显示一位来表示的,要么是0,要么是1.
  • 5> null值:表示什么也没有存,注意空白字符不等于空哟,数字0也不代表空。

  • 6> 内置类型:

enumENUM是枚举类型,它虽然只能保存一个值,却能够处理多达65535个预定义的值
ENUM('value1','value2','value3','....);

setset多选字符串数据类型,适合存储表单界面的“多选值”。设定set的时候,同样需要给定“固定的几个选项”;存储的时候,可以存储其中的若干个值。
    设定set的格式:
        set("选项1","选项2","选项3",...)
同样的,set的每个选项值也对应一个数字,依次是124816...,最多有64个选项
使用的时候,可以使用set选项的字符串本身(多个选项用逗号分隔),也可以使用多个选
项的数字之和(比如:1+2+4=7
  • 8、查看表的结构:desc 表名;
  • 9、show create tables student;查看建表使用的sql语句
  • 10、约束:

    分类:
        主键约束:   primary key
        外键约束:  foreign key
        唯一约束:   unique
        非空约束:   not null
        自增:     auto_increment
        无符号约束:UNSIGNED(无符号位)
        零填充约束:ZEROFILL(零填充)
        check 约束:mysql check约束没什么用,check约束只检查,但是不具有约束力
        默认值约束:default
    
    • 1)主键约束:

      主键约束相当于   唯一约束 + 非空约束  的组合,主键约束列不允许重复,也不允许出现空值。
      每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。
      当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
      创建表时:
          列级别添加主键约束:
              create table  student (
                  id int primary key auto_increment, -- 列级别添加主键约束
                  name varchar(20) not null,         -- 非空约束
                  sex enum('男','女') default '男',  -- default 约束
                  qqnum varchar(12)
              );
          表级别添加主键约束:
               create table teacher (
                  id int auto_increment,
                  name varchar(20) not null,
                  sex  enum('男','女') default '男',
                  phone varchar(11),
                  primary key(id) -- 表级别添加主键约束
              );
              也可以通过表级别添加联合主键 
              例如:constriant `pri_key` primary key(id,name);
      表创建好之后:
          删除主键约束:
              mysql> alter table student drop primary key;
              # ERROR 1075 (42000): Incorrect table definition; 
              # there can be only one auto column and it must be defined as a key
      
              mysql> desc student;
          #+-------+-------------------+------+-----+---------+----------------+
          #| Field | Type              | Null | Key | Default | Extra          |
          #+-------+-------------------+------+-----+---------+----------------+
          #| id    | int(11)           | NO   | PRI | NULL    | auto_increment |
          #| name  | varchar(20)       | NO   |     | NULL    |                |
          #| sex   | enum('男','女')   | YES  |     | 男      |                |
          #| qqnum | varchar(12)       | YES  |     | NULL    |                |
          #+-------+-------------------+------+-----+---------+----------------+
              也就是说表中唯一的自增列必须设置为主键
              接下来更id 列
              alter table student modify id int(11);
              mysql> desc student;
          #+-------+-------------------+------+-----+---------+-------+
          #| Field | Type              | Null | Key | Default | Extra |
          #+-------+-------------------+------+-----+---------+-------+
          #| id    | int(11)           | NO   | PRI | NULL    |       |
          #| name  | varchar(20)       | NO   |     | NULL    |       |
          #| sex   | enum('男','女')   | YES  |     | 男      |       |
          #| qqnum | varchar(12)       | YES  |     | NULL    |       |
          #+-------+-------------------+------+-----+---------+-------+
              可以看到auto_increment 自增已经没有了
              mysql> alter table student drop primary key;
                  #Query OK, 0 rows affected (0.06 sec)
                  #Records: 0  Duplicates: 0  Warnings: 0
              mysql> desc student;
          #+-------+-------------------+------+-----+---------+-------+
          #| Field | Type              | Null | Key | Default | Extra |
          #+-------+-------------------+------+-----+---------+-------+
          #| id    | int(11)           | NO   |     | NULL    |       |
          #| name  | varchar(20)       | NO   |     | NULL    |       |
          #| sex   | enum('男','女')   | YES  |     | 男      |       |
          #| qqnum | varchar(12)       | YES  |     | NULL    |       |
          #+-------+-------------------+------+-----+---------+-------+
      
              成功删除主键
          添加主键约束:
              列级别:更改字段属性,将某一字段设置为主键
              mysql> alter table student modify id int(11) primary key;
              表级别:可以设置联合主键
              mysql> alter table student add primary key(id);
              可以通过联合约束的方式添加联合主键
                  alter table 表名 add primary key(字段1,字段2,..);
      
    • 2)外键约束: MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。
      外键的使用条件:

      • 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);

      • 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在
        建立外键时会自动创建索引,但如果在较早的版本则
        需要显示建立;

      • 3.外键关系的两个表的列必须是数据类型相似,也就是
        可以相互转换类型的列,比如int和tinyint可以,而int
        和char则不可以;
        外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
        外键格式:

    [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
        REFERENCES tbl_name (index_col_name, ...)
        [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
        [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
    ON DELETE、ON UPDATE表示事件触发限制,可设参数:
    RESTRICT:(限制外表中的外键改动) 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
    CASCADE:(跟随外键改动)
            从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。
            ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。
    SET NULL:(设空值)
            从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
    SET DEFAULT:(设默认值) InnoDB目前不支持。
    NO ACTION:(无动作,默认的)InnoDB拒绝删除或者更新父表。
    具体操作:
    mysql> -- 创建一张班级表,classes(id,name,teacherid);
                mysql> -- 为学生表添加字段名 classid  并设置外键关联到班级表
                mysql>  -- 为班级表设置外键 teacherid
                mysql> create table classes(
                    -> id int primary key auto_increment,
                    -> name varchar(20),
                    -> teacherid int,
                    -> foreign key(teacherid) references teacher(id) on delete cascade on update cascade
                    -> --  添加teacherid外键关联到teacher级联删除,级联更新,也就是说 如果teacher 表中的
                    -> -- id发生删除,会级联删除班级表中对应teacherid的项,teacher表id发生更改,classes表
                    -> -- 中对应的id号也会对应更改。
                    -> );
                mysql> -- 现在先往teacher表中添加几条数据
                mysql> desc teacher;
                #+-------+-------------------+------+-----+---------+----------------+
                #| Field | Type              | Null | Key | Default | Extra          |
                #+-------+-------------------+------+-----+---------+----------------+
                #| id    | int(11)           | NO   | PRI | NULL    | auto_increment |
                #| name  | varchar(20)       | NO   |     | NULL    |                |
                #| sex   | enum('男','女')   | YES  |     | 男      |                |
                #| phone | varchar(11)       | YES  |     | NULL    |                |
                #+-------+-------------------+------+-----+---------+----------------+
                mysql> insert into teacher values
                    -> (null,'关羽','男','18800000001'),
                    -> (null,'赵云','男','18800000002'),
                    -> (null,'曹操','男','18800000003'),
                    -> (null,'小乔','女','18800000004'),
                    -> (null,'大乔','女','18800000005'),
                    -> (null,'孙尚香','女','18800000006');
                mysql> select * from teacher;
                +----+-----------+------+-------------+
                | id | name      | sex  | phone       |
                +----+-----------+------+-------------+
                |  1 | 关羽      | 男   | 18800000001 |
                |  2 | 赵云      | 男   | 18800000002 |
                |  3 | 曹操      | 男   | 18800000003 |
                |  4 | 小乔      | 女   | 18800000004 |
                |  5 | 大乔      | 女   | 18800000005 |
                |  6 | 孙尚香    | 女   | 18800000006 |
                +----+-----------+------+-------------+
                mysql> -- 现在已经在teacher表中插入了六条数据
                mysql> -- 我们可以在班级表中插入几条数据
                mysql> desc classes;
                +-----------+-------------+------+-----+---------+----------------+
                | Field     | Type        | Null | Key | Default | Extra          |
                +-----------+-------------+------+-----+---------+----------------+
                | id        | int(11)     | NO   | PRI | NULL    | auto_increment |
                | name      | varchar(20) | YES  |     | NULL    |                |
                | teacherid | int(11)     | YES  | MUL | NULL    |                |
                +-----------+-------------+------+-----+---------+----------------+
                mysql> insert into classes values
                    -> (null,'15级计算机1班',1),
                    -> (null,'15级计算机2班',1),
                    -> (null,'15级计算机3班',1),
                    -> (null,'15级计算机4班',1),
                    -> (null,'15级信息管理1班',2),
                    -> (null,'15级信息管理2班',2),
                    -> (null,'15级信息管理3班',2),
                    -> (null,'15级物联网0班',3),
                    -> (null,'15级物联网1班',3),
                    -> (null,'15级物文传1班',4),
                    -> (null,'15级物文传2班',5);
                mysql> select * from classes;
                +----+-----------------------+-----------+
                | id | name                  | teacherid |
                +----+-----------------------+-----------+
                |  1 | 15级计算机1班         |         1 |
                |  2 | 15级计算机2班         |         1 |
                |  3 | 15级计算机3班         |         1 |
                |  4 | 15级计算机4班         |         1 |
                |  5 | 15级信息管理1班       |         2 |
                |  6 | 15级信息管理2班       |         2 |
                |  7 | 15级信息管理3班       |         2 |
                |  8 | 15级物联网0班         |         3 |
                |  9 | 15级物联网1班         |         3 |
                | 10 | 15级物文传1班         |         4 |
                | 11 | 15级物文传2班         |         5 |
                +----+-----------------------+-----------+
                mysql> -- 现在我们将删除teacher 表中3号曹操老师
                mysql> -- 看看classes表中会发生什么现象
                mysql> delete from teacher where id=3;
                mysql> select  * from teacher;
                +----+-----------+------+-------------+
                | id | name      | sex  | phone       |
                +----+-----------+------+-------------+
                |  1 | 关羽      | 男   | 18800000001 |
                |  2 | 赵云      | 男   | 18800000002 |
                |  4 | 小乔      | 女   | 18800000004 |
                |  5 | 大乔      | 女   | 18800000005 |
                |  6 | 孙尚香    | 女   | 18800000006 |
                +----+-----------+------+-------------+
                mysql> -- 3号曹操老师已经被删除了
                mysql> -- 查看classes表吧
                mysql> select * from classes;
                +----+-----------------------+-----------+
                | id | name                  | teacherid |
                +----+-----------------------+-----------+
                |  1 | 15级计算机1班         |         1 |
                |  2 | 15级计算机2班         |         1 |
                |  3 | 15级计算机3班         |         1 |
                |  4 | 15级计算机4班         |         1 |
                |  5 | 15级信息管理1班       |         2 |
                |  6 | 15级信息管理2班       |         2 |
                |  7 | 15级信息管理3班       |         2 |
                | 10 | 15级物文传1班         |         4 |
                | 11 | 15级物文传2班         |         5 |
                +----+-----------------------+-----------+
                mysql> -- 和上面的classes表对比,我们发现15级物联网0班和15级物联网1班的记录已经没有了
                mysql> -- 我们再看看级联更新 update cascade
                mysql> select * from teacher;
                +----+-----------+------+-------------+
                | id | name      | sex  | phone       |
                +----+-----------+------+-------------+
                |  1 | 关羽      | 男   | 18800000001 |
                |  2 | 赵云      | 男   | 18800000002 |
                |  4 | 小乔      | 女   | 18800000004 |
                |  5 | 大乔      | 女   | 18800000005 |
                |  6 | 孙尚香    | 女   | 18800000006 |
                +----+-----------+------+-------------+
                5 rows in set (0.00 sec)
                mysql> -- 我们将小乔的编号改为3号,看看classes表中15级物文传1班记录的teacherid的变化
                mysql> update teacher set id=3 where name='小乔';
                mysql> select * from teacher;
                +----+-----------+------+-------------+
                | id | name      | sex  | phone       |
                +----+-----------+------+-------------+
                |  1 | 关羽      | 男   | 18800000001 |
                |  2 | 赵云      | 男   | 18800000002 |
                |  3 | 小乔      | 女   | 18800000004 |
                |  5 | 大乔      | 女   | 18800000005 |
                |  6 | 孙尚香    | 女   | 18800000006 |
                +----+-----------+------+-------------+
                5 rows in set (0.00 sec)
                mysql> -- 已经更改了
                mysql> -- 看看classes中的情况吧
                mysql> select * from classes;
                +----+-----------------------+-----------+
                | id | name                  | teacherid |
                +----+-----------------------+-----------+
                |  1 | 15级计算机1班         |         1 |
                |  2 | 15级计算机2班         |         1 |
                |  3 | 15级计算机3班         |         1 |
                |  4 | 15级计算机4班         |         1 |
                |  5 | 15级信息管理1班       |         2 |
                |  6 | 15级信息管理2班       |         2 |
                |  7 | 15级信息管理3班       |         2 |
                | 10 | 15级物文传1班         |         3 |
                | 11 | 15级物文传2班         |         5 |
                +----+-----------------------+-----------+
                9 rows in set (0.00 sec)
                mysql> -- 我们发现15级物文传1班的班主任编号变成了3


                mysql> -- 当然我们在表classes中设置delete cascade 明显是不合理的如果
                mysql> -- 老师的记录删除,我们可以认为老师退休了,或者老师调走了,但是
                mysql> -- 班级依旧存在,不会因为老师的离开而不复存在,所以可以认为,老师
                mysql> -- 调走了,班主任的位置就空置出来了,但是班级依旧存在
                mysql> -- 因此我们可以更改classes中对teacherid外键限制的约束,这就用到了set null
                mysql> -- 在此之前我们得先删除对teacherid的外键约束,但是我们的外键约束是在创建
                mysql> -- 表的时候创建的,我们并不知道外键名 ,我们知道
                mysql> -- 删除外键约束的命令格式是:删除外键约束:alter table 表名 drop foreign key 外键名(区分大小写);
                mysql> -- 那怎么办呢
                mysql> -- 可以用到一个命令 desc 表名; 用于查看表的创建过程的命令,可以查看外键名称
                mysql> desc  classes;
                -- +-----------+-------------+------+-----+---------+----------------+
                -- | Field     | Type        | Null | Key | Default | Extra          |
                -- +-----------+-------------+------+-----+---------+----------------+
                -- | id        | int(11)     | NO   | PRI | NULL    | auto_increment |
                -- | name      | varchar(20) | YES  |     | NULL    |                |
                -- | teacherid | int(11)     | YES  | MUL | NULL    |                |
                -- +-----------+-------------+------+-----+---------+----------------+
                -- 3 rows in set (0.00 sec)
                mysql> -- 呃呃 记错了,desc 表名是查看表结构的,哈,不过没有关系突然想起来了
                mysql>
                mysql> -- show creat table 表名;
                mysql> show create table classes;
                -- +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                -- | Table   | Create Table                                                                                                                                                                                                                                                                                                                                                                  |
                -- +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                -- | classes | CREATE TABLE `classes` (
                --   `id` int(11) NOT NULL AUTO_INCREMENT,
                --   `name` varchar(20) DEFAULT NULL,
                --   `teacherid` int(11) DEFAULT NULL,
                --   PRIMARY KEY (`id`),
                --   KEY `teacherid` (`teacherid`),
                --   CONSTRAINT `classes_ibfk_1` FOREIGN KEY (`teacherid`) REFERENCES `teacher` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
                -- ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 |
                -- +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                -- 1 row in set (0.00 sec)
                mysql> -- 哈找到了  `classes_ibfk_1` 不就是么,开始我们的删除之旅吧
                mysql> alter table classes drop foreign key  `classes_ibfk_1`;
                -- Query OK, 0 rows affected (0.04 sec)
                -- Records: 0  Duplicates: 0  Warnings: 0
                mysql> -- OK;
                mysql> show create table classes;
                -- +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                -- | Table   | Create Table                                                                                                                                                                                                                                         |
                -- +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                -- | classes | CREATE TABLE `classes` (
                --   `id` int(11) NOT NULL AUTO_INCREMENT,
                --   `name` varchar(20) DEFAULT NULL,
                --   `teacherid` int(11) DEFAULT NULL,
                --   PRIMARY KEY (`id`),
                --   KEY `teacherid` (`teacherid`)
                -- ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 |
                -- +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                -- 1 row in set (0.00 sec)
                mysql> -- 接下来我们重新添加对teacherid的外键约束
                mysql> alter table classes add constraint `fk_TeacherClasses` 
                    foreign key classes(teacherid) references teacher(id) 
                        on delete set null on update cascade;
                -- Query OK, 9 rows affected (0.13 sec)
                -- Records: 9  Duplicates: 0  Warnings: 0
                mysql> -- 接下来我们就来验证以下set null 吧
                mysql> select * from teacher;
                -- +----+-----------+------+-------------+
                -- | id | name      | sex  | phone       |
                -- +----+-----------+------+-------------+
                -- |  1 | 关羽      | 男   | 18800000001 |
                -- |  2 | 赵云      | 男   | 18800000002 |
                -- |  3 | 小乔      | 女   | 18800000004 |
                -- |  5 | 大乔      | 女   | 18800000005 |
                -- |  6 | 孙尚香    | 女   | 18800000006 |
                -- +----+-----------+------+-------------+
                -- 5 rows in set (0.00 sec)
                mysql> select * from classes;
                -- +----+-----------------------+-----------+
                -- | id | name                  | teacherid |
                -- +----+-----------------------+-----------+
                -- |  1 | 15级计算机1班         |         1 |
                -- |  2 | 15级计算机2班         |         1 |
                -- |  3 | 15级计算机3班         |         1 |
                -- |  4 | 15级计算机4班         |         1 |
                -- |  5 | 15级信息管理1班       |         2 |
                -- |  6 | 15级信息管理2班       |         2 |
                -- |  7 | 15级信息管理3班       |         2 |
                -- | 10 | 15级物文传1班         |         3 |
                -- | 11 | 15级物文传2班         |         5 |
                -- +----+-----------------------+-----------+
                -- 9 rows in set (0.00 sec)
                mysql> -- 我们将teacher表中的小乔删除
                mysql> delete from teacher where name='小乔';
                -- Query OK, 1 row affected (0.01 sec)
                mysql> select * from teacher;
                -- +----+-----------+------+-------------+
                -- | id | name      | sex  | phone       |
                -- +----+-----------+------+-------------+
                -- |  1 | 关羽      | 男   | 18800000001 |
                -- |  2 | 赵云      | 男   | 18800000002 |
                -- |  5 | 大乔      | 女   | 18800000005 |
                -- |  6 | 孙尚香    | 女   | 18800000006 |
                -- +----+-----------+------+-------------+
                -- 4 rows in set (0.00 sec)
                mysql> select * from classes;
                -- +----+-----------------------+-----------+
                -- | id | name                  | teacherid |
                -- +----+-----------------------+-----------+
                -- |  1 | 15级计算机1班         |         1 |
                -- |  2 | 15级计算机2班         |         1 |
                -- |  3 | 15级计算机3班         |         1 |
                -- |  4 | 15级计算机4班         |         1 |
                -- |  5 | 15级信息管理1班       |         2 |
                -- |  6 | 15级信息管理2班       |         2 |
                -- |  7 | 15级信息管理3班       |         2 |
                -- | 10 | 15级物文传1班         |      NULL |
                -- | 11 | 15级物文传2班         |         5 |
                -- +----+-----------------------+-----------+
                -- 9 rows in set (0.00 sec)
                mysql> --  我们发现15级物文传1班 的teacherid已经为空了
        总结:
            添加外键:
                创建表时:
                    foreign key(字段名) references 
                        父表(字段名) [on delete cascade on update cascade];
                    constraint `约束名` foreign key(字段名) 
                        references 父表名(字段名));
                创建表之后:
                    alter table 子表名 add [constraint [`约束名`]]
                            foreign key (字段名) references 
                                父表名(字段名) [on delete [...] on update[...]];
                    alter table 子表名 add [constrint [`约束名`]]
                            foreign key 子表名(字段名) references 
                                父表名(字段名) [on delete [...] on update[...]];

            删除外键:
                alter table 表名 drop foreign key `约束名`;


 - 3)唯一约束 UNIQUE:

        添加非空约束:
            在创建表的时候:
                mysql> create table temp(
                    -> id int primary key auto_increment,
                    -> name varchar(20) unique, -- 在创建表的时候创建唯一约束
                    -> otherid int);
                Query OK, 0 rows affected (0.14 sec)

                mysql> create table temp(
                    -> id int,
                    -> name varchar(20),
                    -> unique key(id,name) -- 联合约束
                    -> );
                Query OK, 0 rows affected (0.08 sec)
            其他时候:
                通过更改 字段属性
                ALTER TABLE t_user MODIFY user_id INT(10) UNIQUE;
                通过更改 字段名及属性
                ALTER TABLE t_user CHANGE user_id user_id INT(10) UNIQUE;
                添加约束
                ALTER TABLE t_user ADD UNIQUE(user_id);
                ALTER TABLE t_user ADD UNIQUE KEY(user_id);
                ALTER TABLE t_user ADD CONSTRAINT UN_ID UNIQUE(user_id);
                ALTER TABLE t_user ADD CONSTRAINT UN_ID UNIQUE KEY(user_id);
        删除非空约束:
                ALTER TABLE t_user DROP INDEX user_id;
                如果是联合约束,删除一个相当于将两个都删除了


 - 4)ZEROFILL(零填充)

        添加零填充
            1)在创建表的时候添加
                CREATE TABLE t_user(user_id INT(10) ZEROFILL);
            2)通过ALTER语句
                ALTER TABLE t_user MODIFY user_id INT(10) ZEROFILL;
                ALTER TABLE t_user CHANGE user_id user_id INT(10) ZEROFILL;
        删除零填充
            ALTER TABLE t_user MODIFY user_id INT(10);
            ALTER TABLE t_user CHANGE user_id user_id INT(10);
        注:零填充会将未将有效位以外的位用零来显示,比如某字段数据类型为INT(5),
        而插入的值为2,那么零填充会显示00002
        但是,这个效果在Navicat for MySQL中显示不出来,只有在DOS窗口下才能显示


     - 5)UNSIGNED(无符号位)

        添加无符号
            1)在创建表的时候添加
                CREATE TABLE t_user(user_id INT(10) UNSIGNED);
            2)通过ALTER语句
                ALTER TABLE t_user MODIFY user_id INT(10) UNSIGNED;
                ALTER TABLE t_user CHANGE user_id user_id INT(10) UNSIGNED;
        删除无符号
            ALTER TABLE t_user MODIFY user_id INT(10);
            ALTER TABLE t_user CHANGE user_id user_id INT(10);
        注:无符号作用于数值类型


     - 6)DEFAULT(默认)

        添加默认约束
            1)在创建表的时候添加
                CREATE TABLE t_user(user_id INT(10) DEFAULT  3);
            2)通过ALTER语句
                ALTER TABLE t_user MODIFY user_id INT(10) DEFAULT  2;
                ALTER TABLE t_user CHANGE user_id user_id INT(10) DEFAULT  2;
        删除默认约束
            ALTER TABLE t_user MODIFY user_id INT(10);
            ALTER TABLE t_user CHANGE user_id user_id INT(10);


     - 7)AUTO_INCREMENT(自增长)

        添加自增长
            1)在创建表的时候添加
                CREATE TABLE t_user(user_id INT(10) AUTO_INCREMENT PRIMARY KEY);
            2)通过ALTER语句
                ALTER TABLE t_user MODIFY user_id INT(10) AUTO_INCREMENT;
                ALTER TABLE t_user CHANGE user_id user_id INT(10) AUTO_INCREMENT;
        删除自增长
            ALTER TABLE t_user MODIFY user_id INT(10);
            ALTER TABLE t_user CHANGE user_id user_id INT(10);
        注:There can be only one auto column and it must be defined as a key.
            一张表只能有一个自增长列,并且该列必须定义了约束(可以是主键约束,也可以
        是唯一约束,也可以是外键约束,但是不可以是非空和检查约束)
        不过自增长一般配合主键使用,并且只能在数字类型中使用


     - 8)非空约束NOT NULL

        添加非空约束
            1)建表时直接添加
                CREATE TABLE t_user(user_id INT(10) NOT NULL);
            2)通过ALTER 语句
                ALTER TABLE t_user MODIFY user_id INT(10) NOT NULL;
                ALTER TABLE t_user CHANGE user_id user_id INT(10) NOT NULL;
        删除非空约束
            1)ALTER TABLE t_user MODIFY user_id INT(10);
            2)ALTER TABLE t_user CHANGE user_id user_id INT(10);
    注意:非空约束NOT NULL,自增长约束AUTO_INCREMENT,默认约束DEFAULT,无符号为约束UNSIGNED,
        零填充约束ZEROFILL的添加约束,删除约束的格式都一致
        唯一约束unique和他们略有不同,添加约束的时候还可以设置联合约束,
        删除约束的时候通过 alter table 表名 drop index 字段名;删除,通过
        alter table modify/chang 字段名,字段属性 约束 ;无法删除unique约束
        所以可以看出唯一约束,主键约束,外键约束是可以是表级的约束
        而其他5中约束只能是列级别的约束
        从查询information_schema中查询指定表中的约束
        USE INFORMATION_SCHEMA;
        SELECT CONSTRAINT_NAME FROM TABLE_CONSTRAINTS WHERE TABLE_NAME='student';   
  • 11、更改表结构:以student表为例

    为表添加字段:  关键字  alter,add
        alter table student add id int(10) primary key;--为student 表 添加id字段并设为主键
    更改字段属性:关键字 alter,modify
        alter table student modify age int(10) not null;
    更改字段名: 关键字 alter,chang
        alter table student chang name username varchar(20);--将student name字段更名为username
    
  • 12、控制台插入中文字符乱码,报错 set names gbk;

  • 13、数据库备份:

    mysqldump -u root -p 数据库名
    
  • 14、聚集函数:

    sum(),avg(),count(),max(),min()
    where 子句后面的条件不能是聚集函数
    
  • 15、分组:

    group by : group by 子句应该放在 having子句之前 
    where子句之后
    
  • 16、order by 字句:

    order by  字段名 (desc/asc);
    
  • 17、关系运算:

    >:
    <:
    <>:
    =:
    between ...and ...
    in(..,..,...,..)
    
  • 18、字符匹配:

    %:匹配0个或者多个字符
    _: 匹配1个字符
    字符匹配一般配合着like 子句使用
    
  • 19、了解什么是范式并且能够根据范式设计表格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值