今天刷题遇见个没见过的insert or ignore,干脆贴这了= - =(当然很多人可能见过了QAQ)
insert into:插入数据,如果主键重复,则报错
insert repalce:插入替换数据,如果存在主键或unique数据则替换数据
insert ignore:如果存在数据,则忽略。
一些基础概念:
1、表的约束(constraint)
主键,外键,唯一键,默认值,非空约束,自动增长。
请简要描述sql语言的分类【5大分类】
2、SQL语言分为五大类:
DDL 语言(数据定义语言) - Create、Alter、Drop、truncate
DQL 语言(数据查询语言) - Select 查询语句
DML 语言(数据操纵语言) -对表中数据 Insert、Update、Delete
TCL 语言(事务控制语言) - Commit(提交)、Rollback(回滚) 事务提交与回滚语句
DCL 语言(数据控制语言) - Grant(授权)、Revoke(回收权限) 授予权限与回收权限语句
3、主键约束和唯一性约束的区别
主键不可以重复,不可以为空,一个表中只能有一个主键,但主键可以由一个字段构成,也可以由多个字段构成;
唯一键可以为空,数据不可以重复,一个表中可以由多个唯一键。

-- ---------------------------------------------------
1、数值型数据
-- unsigned关键字: 无符号类型,该字段的值只能是非负数,该关键字只对整数有效。
-- zerofill 关键字: 默认无符号,零填充,mysql中,在数字长度不够的时候数据前面填充0,以达到设定的长度,比如报表开发,报表中的数据按照一定的格式和长度来显示时,需要用到zerofill;
-- 如果只希望表示零和正整数,可以使用无符号关键字“unsigned”
-- 如果往表中特定字段中输入的数据前面有0,建表时可以考虑使用关键字zerofill
-- zerofill一般和unsigned 配合使用
-- 特别说明:建表时,整型数据类型后的字符长度,
-- 只有在使用了unsigned和zerofill关键字时才有意义

举例:在schoola数据库中,创建表student,表中字段sid 数据类型为int型,要求建好的表中,
插入数据时,sid字段的数据长度显示5位,如果插入的数据长度不够5位,前面自动补零。
-- 建表
CREATE TABLE schoola.student
(
sid INT(5) UNSIGNED ZEROFILL
);

-- 如果一个表中的数值型字段后出现了UNSIGNED关键字,那么这个字段中的数据只能插入正整数
-- 如果表中数值型字段限制了字段长度【比如5】,字段后也出现了zerofill关键字,
-- 并且那么该字段中可以插入的数据长度不受字段长度的影响,但如果实际插入的字段长度少于
-- 指定长度时,前面会自动补零;

-- 插入数据
INSERT INTO schoola.`student`(sid) VALUES(4);
INSERT INTO schoola.`student`(sid) VALUES(123456789);

2、字符型

CREATE TABLE test.sclass
(
cid INTEGER,  -- 班号
cname CHAR(20),
cowner VARCHAR(30), -- 班主任名称
memo TEXT -- 班级说明
);

INSERT INTO test.`sclass` (cid, cname, cowner, memo) 
VALUES(1,"zhongjiyiban","dujuan","banzhangshiwangdadong");

3、日期时间型

举例:在test数据库,创建分数表score
CREATE TABLE test.score
(
sid TINYINT, -- 学号
sname CHAR(30), -- 学生姓名 
score FLOAT(6,2), -- 分数 
sdate DATE -- 入学日期
);

INSERT INTO test.score VALUES(1,"zs",99.1,"2020-10-8");

INSERT INTO test.score VALUES(1,"zs",99.1,CURDATE());
-- CURDATE():用来获取mysql数据库所在电脑的当前日期
-- cur:current 当前的意思

4、混合型
CREATE TABLE test.teacher
(
tid INTEGER, -- 教师编号
tname CHAR(30), -- 教师名称
sex ENUM("M","F"), -- 姓名 :M:male 男,F:female 女 
subjects SET("java","linux","mysql") -- 科目
);

举例:往teacher表中,插入一条数据,[编号:1,教师姓名:zs,性别:男,科目:java,linux]
INSERT INTO test.`teacher`(tid,tname,sex,subjects) 
VALUES(1,"zs","M","java,linux");

-- 说明,往enum和set类型的字段中插入数据时,插入的值只能从建表时设定的之中选取
七、数据库中表的操作
1、创建表

#建表时指定数据库引擎和字符集
-- 数据库引擎是什么?
-- 数据库引擎是一种存储、处理、保护数据库数据的核心服务。
举例:查看mysql数据库的引擎
SHOW ENGINES; -- 查看数据库引擎
-- SHOW 展示,查看
-- ENGINE:引擎
举例:查看指定数据库中表的引擎
SHOW TABLE STATUS;

举例:在test库,创建表商品goods,商品编号gid,商品名称gname,
创建表时,指定数据库的引擎为innodb和字符集为utf8
CREATE TABLE test.goods
(
gid INT,
gname CHAR(30)
) ENGINE=INNODB DEFAULT CHARACTER SET=utf8;

-- ENGINE=INNODB:定义字符集位innodb
-- DEFAULT CHARACTER SET=utf8 自定字符集位utf8

2、修改表
-- 说明:修改表就是修改表的表名、增加字段、删除字段、修改字段、修改数据类型及数据长度、修改表的约束等。
(1)为一个表增加字段 -- 考试题
-- 语法:
ALTER TABLE 库名.表名
ADD [COLUMN] 字段名 数据类型(数据长度); 
这里 column关键字可以省略
-- 解释
-- Alter:修改
-- Add column:增加字段
-- Column:列,字段
-- Add:增加

举例:为表sclass增加系编号dno字段,数据类型为int
ALTER TABLE test.`sclass`
ADD COLUMN dno INT;

-- 添加系主任字段downer
ALTER TABLE test.`sclass`
ADD downer CHAR(30);

举例:修改test数据库的表sclass的字符集为utf8
-- 语法
ALTER TABLE 库名.表名 CONVERT TO CHARACTER SET utf8;

ALTER TABLE test.`sclass` CONVERT TO CHARACTER SET utf8;

-- convert 转换

3、删除表
-- 语法:
DROP TABLE 库名.表名;

-- Drop 删除
举例:删除test数据库中的表sclass
DROP TABLE test.`sclass`;

#特别说明:Mysql中,库名、表名、字段名都不允许重名;表中的数据,如果表中已经添加主键约束或者唯一性约束的情况下,数据不可以重复。
八、表的约束
1、表的约束(constraint)【6种】
说明:mysql常用的约束有如下6种:
作用:约束是一种表级别的限制,它通过对表的行或列的数据做出限制,保证数据的完整性和一致性
#非空(NOT NULL)约束
-- 非空约束,指定某列字段不能为null值;mysql中的NULL值,
-- 意思是不确定,没有具体值;所有数据类型的值都可以是null,包括int、float、char等;
-- 空字符串不等于null,0也不等于null;null不区分大小写。

举例:在test库创建表classa,将cname字段设置为非空
CREATE TABLE test.classa
(
cid INT, -- 班号
cname CHAR(30) NOT NULL -- 班级名称,添加非空约束
);

INSERT INTO test.`classa`(cname) VALUES(NULL); -- 执行失败 
-- 添加了非空约束,就不能插入null值

#唯一性(Unique)约束
唯一性约束用来限制不受主键约束的列上的数据的唯一性;同一个表中可以有多个唯一键。
Unique:唯一
唯一性键特点:可以为空,数据不允许重复,一个表中可以有多个唯一键
举例:在test库中创建表stu(sno,sname,cowner(班主任),cno),
将字段cowner定义为唯一键【意思是为字段cowner添加唯一性约束】
CREATE TABLE test.stu
(
sno INT,
sname CHAR(20),
cowner CHAR(30) UNIQUE, -- 定义唯一性约束
cno INT
);

INSERT INTO test.`stu`(sno,sname,cowner,cno) VALUES(1,"zs","ldh",2);
INSERT INTO test.`stu`(sno,sname,cowner,cno) VALUES(2,"ls","zxy",3);
#主键(Primary Key,简称PK)约束
-- 主键(PRIMARY KEY)是用于约束表中的每一行,主键字段,对于表中的数据来说,就类似于一个人的身份证号,不允许重复。
-- 定义主键的作用:避免表中的数据重复。
-- 特殊说明:一个表只能有一个主键,这个主键可以由一个字段构成,也可以由多个字段构成。
-- 主键特点:唯一(unique),非空(not null),可以由单个字段或者多个字段构成,一个表只能有一个主键
-- PRIMARY:主要的,基本的
-- KEY:键,关键字
-- 往表中插入数据时,违反主建约束,系统会做如下提示:
-- Duplicate entry '1' for key 'PRIMARY':由于主键原因导致数据重复。
-- Duplicate 重复
举例:在schoola库,创建teacher表,
将表中的字段tid定义为主键【意思是为字段tid添加唯一性约束】

CREATE TABLE schoola.teacher
(
tid INT PRIMARY KEY, -- 定义主键约束
tname CHAR(30)
); 

-- 当主键由多个字段构成时,称为复合主键;-- 面试题
举例:在schoola数据库中,创建表stu7,表中包括字段学号sid,名称sname,
分数score,班号cno,将字段sid和sname设置为复合主键。
CREATE TABLE schoola.stu7
(
sid INT,
sname CHAR(20),
score FLOAT(5,2),
cno INT,
PRIMARY KEY(sid,sname) -- 定义复合主键
);
INSERT INTO schoola.`stu7`(sid,sname,score,cno)
VALUES(1,"ls",100,2);
-- 作为主键的两个字段的值同时重复,数据才叫重复

INSERT INTO schoola.`teacher`(tid,tname) VALUES(2,"zs");

#外键(Foreign Key,简称FK)约束
/*外键(FOREIGN KEY)既能确保数据完整性,也可以用来建立一个表和另一个表的直接关系;
一个表可以有一个或者多个外键,每个外键的数据必须REFERENCES引用另一个表的主键或者唯一键
添加了外键约束的列,取值必须在它引用的列(另一个表的主键或者唯一键)中有对应值。*/

举例:在schoola库中:
创建班级表classa[ 班级编号cid 主键,班级名称cname]
创建表student[学号sid,学生名称sname,班号classno,classno定义为外键]
-- 创建班级表

CREATE TABLE schoola.classa
(
cid INT,
cname CHAR(30),
PRIMARY KEY(cid) -- 定义主键
);

-- 创建student表
CREATE TABLE schoola.`student`
(
sid INT,
sname CHAR(30),
classno INT,
FOREIGN KEY(classno) REFERENCES schoola.classa(cid) -- 定义外键约束
);
-- 说明:当两个表建立了数据引用关系时,被引用数据的表,称为主表,
-- 引用其他表数据的表,称为从表
-- 当往表中,插入数据时,需要先往主表插入数据,才可以往从表插入数据,否则,报错
INSERT INTO schoola.`classa`(cid,cname) VALUES(1,"一班");
INSERT INTO schoola.`student`(sid,sname,classno) VALUES(1,"zs",1);
-- student表中classno的数据引用自classa表的cid字段的数据

#默认值(Default)约束
DEFAULT 约束用于向列中插入默认值。
-- 如果表中的一个字段,在建表时,设定了默认值,
-- 往表中插入数据时,插入语句中没有指定插入的值,那么会将默认值插入到表中;
-- 如果指定了插入的值,那么将插入指定的值。

举例:创建表wclass,将cno字段设置为主键,为字段cowner设置默认值为“zhangxueyou”
CREATE TABLE test.wclass
(
cno INT PRIMARY KEY,
cowner CHAR(30) DEFAULT "zhangxueyou" -- 定义默认值约束
);

INSERT INTO test.`wclass`(cno,cowner) VALUES(1,"liudehua");
INSERT INTO test.`wclass`(cno) VALUES(2);

#主键字段自增长 auto_increment
-- auto 自动
-- increment 增长
举例:在test库创建表stua[sid 主键 添加主键字段自增长约束,sname]

CREATE TABLE test.stua
(
sid INT PRIMARY KEY AUTO_INCREMENT, -- 添加自增长约束
sname CHAR(20)
);

INSERT INTO test.`stua`(sid,sname) VALUES(1,"sz");


INSERT INTO test.`stua`(sname) VALUES("ls");
 -- 插入数据时,sid的字段没有给值,自动在上一条数据的基础上增加1

2、表的修改
-- 说明:修改表,就是对表的表名、字段【添加、修改、删除】、字段类型、字段长度、约束等进行修改。
2.1 表的名称修改
-- 修改表名语法:
ALTER TABLE 库名.表名 RENAME TO 新表名;

举例:修改test库中stu表名称为sstuu
ALTER TABLE test.`stu`
RENAME TO sstuu;

2.2 修改表的字段或者约束(修改表结构)

-- 建销售表sales表以备练习:
在test数据库中创建销售表sales:
CREATE TABLE test.sales
(customer_no INT(10),
customer_name CHAR(30),
sales_no INT(10),
product_name VARCHAR(30));

2.2.1 为表添加主键约束
 -- 语法:
ALTER TABLE 库名.表名
ADD PRIMARY KEY(字段名);

举例1: 
修改sales表,为字段customer_no添加主键约束
ALTER TABLE test.`sales`
ADD PRIMARY KEY(customer_no);

举例2:删除sales表的主键customer_no
ALTER TABLE test.`sales`
DROP PRIMARY KEY;   -- 删除主键
-- 语法:
ALTER TABLE 库名.表名
DROP PRIMARY KEY; 

INSERT INTO test.`sales`(customer_no) VALUES(NULL);

举例:修改test库的字段customer_no的非空约束
ALTER TABLE test.`sales`
MODIFY customer_no INT(10) NULL;

2.2.2 为表添加非空约束
举例3:修改sales表约束,使客户名称sales_no不允许为空
-- 语法:
ALTER TABLE 库名.表名
MODIFY 字段名 数据类型(数据长度) NOT NULL;
-- modify 修改

ALTER TABLE test.`sales`
MODIFY sales_no INT(10) NOT NULL;

2.2.3 修改表中某个字段的名称
举例4:修改表sales,将字段`product_name`名称修改为pct_name
-- 语法:
ALTER TABLE 库名.表名
CHANGE 原字段名 新字段名  数据类型(数据长度);
-- 解释:change为更换的意思

ALTER TABLE test.`sales`
CHANGE product_name pct_name VARCHAR(30);

2.2.5 修改表中指定字段的数据类型和数据长度
举例6:修改sales表中字段`pct_name`的字段类型为char(20)
-- 语法:
ALTER TABLE 库名.表名
MODIFY [COLUMN] `字段名` 新数据类型(新数据长度);

ALTER TABLE test.`sales`
MODIFY pct_name CHAR(20);

2.2.6 删除表中指定的字段
举例7:删除表sales中的字段pct_name
-- 语法:
ALTER TABLE 库名.表名
DROP 【COLUMN】 字段名;  -- column可以省略

ALTER TABLE test.`sales`
DROP pct_name; 

3、复制表
3.1只复制表结构,不复制数据
-- 语法:
CREATE TABLE 库名.表名1 LIKE 库名.表名2;
意思:创建一个类似于表名2的表名1。
like:像,类似

举例:在test库中,创建一个表wclass1,表结构从wclass表复制
CREATE TABLE test.wclass1 LIKE test.`wclass`;

3.2同时复制表结构和数据
-- 语法:
CREATE table库名.表名1 [AS] SELECT * FROM 库名.表名2;

举例:在hrdb数据库,创建一个表temp,表结构和数据从employees表复制
CREATE TABLE hrdb.temp AS SELECT * FROM hrdb.employees;