2.mysql基础知识(创建表、增删改差、约束、ddl语句)


  •  
    事物---功能---用途---实现条件---实现步骤/操作步骤(注意事项)---问题---解决
  •  
    今天学了什么
    •  
      对已经创建的表进行添加、修改、删除、约束操作、数据类型、ddl语句、约束
  •  
    DDL语句
    DDL(Data Definition Languages)语句: 数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。 常用的语句关键字主要包括 create、drop、alter等。
    •  
      库的管理
      •  
        语法
        •  
          创建库
          •  
            CREATE DATABASE dbname;
        •  
          查看已经存在的数据库
          •  
            SHOW DATABASES;
        •  
          显示数据库创建语句
          •  
            SHOW CREATE DATABASE db_name;
        •  
          选择数据库
          •  
            USE dbname;
        •  
          查看数据库中的表
          •  
            SHOW TABLES;
        •  
          删除数据库
          •  
            DROP DATABASE [IF EXISTS] dbname;
            IF EXISTS判断是否存在而删除
        •  
          建立一个数据库并制定编码格式
          •  
            create database 数据库名 default charset utf8 collate utf8_general_ci;
      •  
        修改、备份、恢复数据库
        •  
          备份
          •  
            mysqldump -u 用户名 -p 数据库名 > 导出的文件名
        •  
          导入
          •  
            mysql>source 导入的文件名;
    •  
      表的管理
      •  
        创建表
        •  
           
          CREATE TABLE IF NOT EXISTS stuinfo(
           ​stuId INT, 
          ​stuName VARCHAR(20), ​
          gender CHAR, 
          bornDate DATETIME ​
          );

           

      •  
        修改表
        •  
          ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段类型】;
        • 添加新列及其定义放在ADD COLUMN子句之后。 请注意,COLUMN关键字是可选的,因此可以省略它。
      •  
        修改字段名
        •  
          ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR;
      •  
        修改表名
        •  
          ALTER TABLE stuinfo RENAME [TO] studentinfo;
        • TO 为可选参数,使用与否均不影响结果。
      •  
        修改表的字符集
        •  
          altertable student character set utf8;
      •  
        修改字段类型和列级约束
        •  
          ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;
      •  
        添加字段
        •  
          ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
      •  
        给表添加注释
        •  
          ALTER TABLE `mydb1`.`employees` COMMENT='员工表';
          •  
            `mydb1`.`employees`:这个可以用鼠标点2下数据库然后’.‘调用出表名
      •  
        删除字段
        •  
          ALTER TABLE studentinfo DROP COLUMN email;
      •  
        删除表
        •  
          DROP TABLE [IF EXISTS] studentinfo;
      •  
        查看表结构(以表格形式展示表结构)
        •  
          DESCRIBE <表名>;
      •  
        以SQL语句的形式展示表结构
        •  
          SHOW CREATE TABLE <表名>;
    •  
      注意事项
      •  
        创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。例:user对象
      •  
        添加新列及其定义放在ADD COLUMN子句之后。 请注意,COLUMN关键字是可选的,因此可以省略它。
      •  
        第三,MySQL允许通过指定FIRST关键字将新列添加到表的第一列。 它还允许您使用AFTER existing_column子句在现有列之后添加新列。如果没有明确指定新列的位置,MySQL会将其添加为最后一列。
  •  
    约束
    •  
      常见约束
      •  
        NOT NULL
        •  
          非空,用于保证该字段的值不能为空。
          例如学生表的学生姓名及学号等等。
      •  
        DEFAULT
        •  
          默认值,用于保证该字段有默认值。
          例如学生表的学生性别。
      •  
        UNIQUE
        •  
          唯一,用于保证该字段的值具有唯一性,可以为空。
          例如注册用户的手机号,身份证号等。
      •  
        CHECK
        •  
          检查约束(MySql不支持),检查字段的值是否为指定的值。
      •  
        PRIMARY KEY
        •  
          主键,用于保证该字段的值具有唯一性并且非空。
          例如学生表的学生学号等。
      •  
        FOREIGN KEY
        •  
          外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某些的值。
          例如学生表的专业编号
    •  
      列级约束
      •  
        作用在一个列上
      •  
        定义方式:列约束必须跟在列的定义里后面
    •  
      表级约束
      除了非空、默认其他都支持
      •  
        可以作用在多个列,也可以作用在一个列
      •  
        定义方式:表约束不与列一起,而是单独定义。
    •  
      实现步骤
      •  
        创建表时添加约束
        •  
          表级约束
          语法: 
          在各个字段的最下面 CONSTRAINT 约束名 约束类型(字段名) 
          DROP TABLE IF EXISTS stuinfo; 
          CREATE TABLE stuinfo( 
          id INT, 
          stuname VARCHAR(20), 
          sex CHAR(1), 
          seat INT, 
          age INT, 
          majorid INT, 
          # 约束 
          CONSTRAINT ys PRIMARY KEY(id),# 主键 
          CONSTRAINT uq UNIQUE(seat),# 唯一键 
          CONSTRAINT ck CHECK(sex=''OR sex=''),# 检查 
          CONSTRAINT fk FOREIGN KEY(majorid) REFERENCES major(id)# 外键 ​ ); ​
        •  
          列级约束
          语法:
          直接在字段名和类型后面追加约束类型即可 mysql只支持:默认、非空、主键、唯一 
          USE students; 
          CREATE TABLE stuinfo( 
          id INT PRIMARY KEY,#主键 
          stuName VARCHAR(20) NOT NULL,#姓名 
          sex CHAR(1) CHECK(sex=''OR sex=''),
          #性别 seat INT UNIQUE,#唯一 
          age INT DEFAULT 19,#默认约束 
          majorID INT /foreign key/ REFERENCES marjor(id)#外键 ); 
          CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) ) ​

           

      •  
        修改表时
        •  
          添加列级约束
          •  
            alter table 表名 modify column 字段名 字段类型 新约束
        •  
          添加表级约束
          •  
            alter table 表名 add [ constraint 约束名] 约束类型 (字段名) [外键的引用]
        •  
          添加约束
          USE students; DROP TABLE IF EXISTS stuinfo;
           CREATE TABLE stuinfo(
           id INT, stuname VARCHAR(20), 
          sex CHAR(1),
          seat INT, 
          age INT, 
          majorid INT ) 
          DESC stuinfo; 
          
          1.添加非空约束 
          ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL; 
          #约束 
          CONSTRAINT ys PRIMARY KEY(id),#主键
          CONSTRAINT uq UNIQUE(seat),#唯一键 
          CONSTRAINT ck CHECK(sex=''OR sex=''),#检查 
          CONSTRAINT fk FOREIGN KEY(majorid) REFERENCES major(id)#外键,references指向主键
          2.添加默认约束 
          ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18; 
          3.添加主键 
          #列级约束 
          ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY; 
          #表级约束 ALTER TABLE stuinfo ADD PRIMARY KEY(id); 
          4.添加唯一键 
          #列级约束 
          ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE; 
          #表级约束 
          ALTER TABLE stuinfo ADD UNIQUE(seat); 
          5.添加外键 
          ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id); ​

           

            

          •  
            删除约束
            #1.删除非空约束 
            ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL; 
            #2.删除默认约束 
            ALTER TABLE stuinfo MODIFY COLUMN age INT; 
            #3.删除主键 
            ALTER TBALE stuinfo DROP PRIMARY KEY; 
            #4.删除唯一 
            ALTER TABLE stuinfo DROP INDEX seat; 
            #5.删除外键 
            ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major; 
            
            SHOW INDEX FROM stuinfo;

             

    •  
      注意事项
      •  
        在什么时候创建约束:创建表时;修改表时;约束的添加分类。
      •  
        非空的约束只能定义在列上
      •  
        请注意,COLUMN关键字是可选的,因此可以省略它。
    •  
      1.查询约束: SELECT * FROM information_schema.`TABLE_CONSTRAINTS`;(可以通过where table_name=‘student‘来约定只查询某个表的约束)
      其实每次添加约束都是将添加的约束的信息存储到了information_schema这个schema的table_constraints表里;(mysql里``和bash的很像,也是执行``内的表达式而不是将里面作为字符串使用)
    •  
      2.查看所有的触发器:select* from information_schema.triggers;
  •  
    外键
    •  
      用于限制两个表的关系,从表的字段值引用了主表的某字段值,外键列和主表的被引用列要求类型一致,意义一样,名称无要求;主表的被引用列要求是一个key (一般就是主键); 插入数据,先插入主表删除数据,先删除从表
  •  
    数据类型
    •  
      主要包括以下五大类
      •  
        整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
      •  
        浮点数类型:FLOAT、DOUBLE、DECIMAL
      •  
        字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
      •  
        日期类型:Date、DateTime、TimeStamp、Time、Year
      •  
        其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等
    •  

代码练习:

#选择到star数据库
USE star;
#创建一个student表
CREATE TABLE student(
    #定义id为int类型并设置主键
    id INT PRIMARY KEY,
    #定义name为varchar类型,位数为50,不能为空】
    NAME VARCHAR(50) NOT NULL,
    #定义age为int类型,位数为3
    age INT(3),
    #定义address为varchar类型,位数100
    address VARCHAR(100),
    #定义birth为datetime类型
    birth DATETIME    
)#设置储存引擎,设置编码格式
ENGINE=INNODB DEFAULT CHARSET=utf8;
#查询一个刚才创建的表   select * from 表名;
SELECT * FROM student;
#修改表名    rename table 表名 to 修改的表名;
RENAME TABLE student TO sys_student;
#查询修改后的表名看修改成功没
SELECT * FROM sys_student;#修改成功

#alter:对已经创建的表进行添加、修改、删除、约束操作

#增加列      语法:alter table 表名 add 列名 数据类型;
ALTER TABLE sys_student ADD sex CHAR(2);

#修改列   语法:alter table 表名 modify 要修改的列名 修改的数据类型;
ALTER TABLE sys_student MODIFY address VARCHAR(150) NOT NULL;

#删除列   语法:alter table 表名 drop 要删除的列名
ALTER TABLE sys_student DROP sex;
#查询下表看删除了没有
SELECT * FROM sys_student;#sex列已经被删除了



SELECT * FROM employees;

#创建员工表,并添加外键约束
CREATE TABLE employees(
employee_id INT,
first_name VARCHAR(50),
job_id VARCHAR(50) NOT NULL,
#定义一个salary,类型为double
salary DOUBLE,
dept_id INT,

 /*    约束英文:constraint
    约束实际上就是表中数据的限制条件
    表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
    
    在定义完所有列之后指定主键,语法:constraint 约束的名字 约束类型 (作用列名)*/
    
#emp_id_pk是约束名字,employee_id是约束的列,primary key:主键约束     
CONSTRAINT emp_id_pk PRIMARY KEY(employee_id),

/*MySQL提供了另一种称为UNIQUE索引的索引,它允许您在一个或多个列中强制实现值的唯一性。与PRIMARY KEY索引不同,每个表可以有多个UNIQUE索引。
*/
#给first_name列约束值唯一
CONSTRAINT emp_first_name_uk UNIQUE(first_name),

/*CHECK <表达式>
    “表达式”指的就是 SQL 表达式,用于指定需要检查的限定条件。
    注意:若将CHECK约束子句置于所有列的定义以及主键约束和外键定义之后,则这种约束也称为基于表的 CHECK 约束。该约束可以同时对表中多个列设置限定条件。*/
    
#给salary约束值不能为负数
CONSTRAINT emp_salary_min CHECK(salary>0),

/*REFERENCES对象权限。
建立外键关系权限。
用户要在tb1上建立外键,外键指向tb2,那么该用户必须在tb2上有REFERENCES权限。
外键首先是表中的一个字段,它可以不是本表的主键 但对应另外一个表的主键!

主表与从表:若同一个数据库中,b表的外键与a表的主键相对应,则a表为主表,b表为从表
*/

#创建外键的语法:  [constraint<外键名>] FOREIGN KEY 字段1[,字段名2,...]
          #references<主键名> 主键列1[,主键列2,...]
#外键名 为定义外键约束的名称;字段名 表示子表需要添加外键约束的子段列

#给dept_id列添加外键并和主键建立关系,用references建立
CONSTRAINT emp_dept_fk FOREIGN KEY (dept_id)REFERENCES department(dept_id)

)



#创建主表
CREATE TABLE department(
dept_id INT,
dept_name VARCHAR(50),
#在定义完所有列之后指定主键,语法:[constraint<约束名>] primary key[字段名]
CONSTRAINT dept_name_uk PRIMARY KEY(dept_id),
#用给(约束)给dept_name列约束唯一(UNIQUE)
CONSTRAINT dept_name_uk UNIQUE(dept_name)

)

SELECT *FROM employees;
SELECT * FROM department;

#delete删除 where条件   语法:delete from 表名 where 条件
#从employees表中删除employee_id 为1的行
DELETE FROM employees WHERE employee_id=1;
DELETE FROM employees WHERE salary;
#alter:对已经创建的表进行添加(add)、修改(modify)、删除(drop)、约束操作
SELECT * FROM employees;
#增加一个salary列,类型double
ALTER TABLE employees ADD salary DOUBLE;
#删除empoyees下的salary列
ALTER TABLE employees DROP salary;
#修改salary列类型为int not null
ALTER TABLE employees MODIFY salary INT NOT NULL;
#在department表里添加dept_count列并设置类型为int
ALTER TABLE department ADD dept_count INT;


#添加约束:  ALTER TABLE <表名> ADD <列定义>|<完整性约束>。
#由于使用此方式中 增加的新列 自动填充null值,所以不能为增加的新列指定not null约束。

#约束唯一  constraint 约束名 约束(字段名)
ALTER TABLE department ADD CONSTRAINT dept_count_uk UNIQUE(dept_count);

#添加外键为department表里的字段,并和department里的主键(dept_id)建立联系
ALTER TABLE employees ADD CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id)REFERENCES department(dept_id);
SELECT 
#删除外键约束名
ALTER TABLE employees DROP FOREIGN KEY emp_dept_fk;
#删除外键约束列
ALTER TABLE employees DROP dept_id;

SHOW CREATE TABLE employees;#show create table 表名:查看表的详细信息,
SHOW CREATE TABLE department;
#以表格形式展现结构:DESCRIBE <表名>;
DESCRIBE department;
DESCRIBE employees;

 

#查询约束:SELECT * FROM information_schema.`TABLE_CONSTRAINTS`;(可以通过where table_name=‘student‘来约定只查询某个表的约束)

#其实每次添加约束都是将添加的约束的信息存储到了information_schema这个schema的table_constraints表里;(mysql里``和bash的很像,也是执行``内的表达式而不是将里面作为字符串使用)

#查询定义约束的列
SELECT * FROM information_schema.`TABLE_CONSTRAINTS` WHERE TABLE_NAME='employees';
#查询定义约束的列
SELECT COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_COLUMN_NAME, REFERENCED_TABLE_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'EMPLOYEES';
 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM