•  事物---功能---用途---实现条件---实现步骤/操作步骤(注意事项)---问题---解决
  • 对已经创建的表进行添加、修改、删除、约束操作、数据类型、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';