本周我们结束了最为复杂的dql语法,完成最后一个进阶9—联合查询,然后进入剩下的dml和ddl语法介绍。一起来看看吧~
进阶9:联合查询
一、含义
union:合并、联合,将多次查询结果合并成一个结果
二、语法
查询语句1
union【all】
查询语句2
union【all】
...
三、意义
1、将一条比较复杂的查询语句拆分成多条语句
2、适用于查询多个表的时候,查询的列基本是一致的
四、特点
1、要求多条查询语句的查询列数必须一致
2、要求多条查询语句的查询的各列类型、顺序最好一致
3、union去重,union all包含重复项
以上就结束了查询语言(dql)的全部介绍,下面我们对其进行一个基本总结,将所有学到的dql语法汇总起来,写出一个模板,以后需要用到哪一条直接往里面放相应的查询语句即可。具体如下:
select 查询列表
from 表1 别名 连接类型 join 表2 别名 on 连接条件
where 筛选条件
group by 分组条件
having 分组后筛选条件
order by 排序条件
limit 起始索引,条目数
union 联合查询
DML语言
DML语言称为数据管理语言,主要负责对表格中的数据进行增删改操作。
一、插入
1、方式一
(1)语法:insert into 表名(字段名,...) values(值,....);
(2)特点:
- 要求的类型的字段的类型要一致或兼容
- 字段的个数和顺序不一定与原始表中的字段个数和顺序一致,但必须保证值和字段一一对应
- 假如表中有可以为null的字段,注意可以通过以下两种方式插入null值
- 字段名和值都省略
- 字段写,值使用null
- 字段和值的个数必须一致
- 段名可以省略,默认所有列
2、方式二
语法:insert into 表名 set 字段=值,字段=值,...;
3、两种方式的区别
(1)方式一支持一次性插入多行,语法如下:
insert into 表名 values(值1,值2,....),(值1,值2,....),(值1,值2,....),(值1,值2,....)
(2)方式一支持子查询,语法如下:
insert into 表名 查询语句;
4、案例
我们根据两种方式向一个beauty表格中插入数据,beauty表格中的各个属性如下所示:
对于各个属性参数的插入,具体语法如下:
代码语言:javascript复制#1、方式一支持插入多行,方式二不支持
INSERT INTO beauty
VALUES (23,'杨幂1','女','1985-10-1','19988886666',NULL,2)
,(24,'杨幂2','女','1985-10-1','19988886666',NULL,2)
,(25,'杨幂3','女','1985-10-1','19988886666',NULL,2)
#2、方式一支持子查询,方式二不支持
INSERT INTO beauty(id,NAME,phone)
SELECT 26,'宋茜','5436546';
#3、方式二插入数据
INSERT INTO beauty
SET id=17,NAME='刘亦菲',phone='999'
tips:在上面的3条插入语句中,我们仅仅展示一下语法输入。在表格属性中我们看到不可以为空的属性有:id、name、phone。所以这三个属性是我们必须插入的值。
第一条语句中,我们没有填写需要添加的属性,所以默认的所有属性都需要添加进去,同时,我们使用到了多行插入。
第二条语句中,我们填写了需要插入的属性,所以我们需要对应着属性来插入相关的值,与此同时,我们使用到了子查询语句,在select语句后面对应的插入参数值。
第三条语句中,我们使用的是方式二的set方法来,此时在表名后面不用填写需要插入的属性,因为set后面的语法中,已经直接填写了对应的属性。
总体而言,方式二较为简单,但是由于只能单行插入,所以使用的较少,一般都是采取方式一的语法进行操作。
二、修改
1、修改单表的记录
update 表1 别名 连接类型 join 表2 别名 on 连接条件
set 字段=值,字段=值 【where 筛选条件】;
2、修改多表的记录【补充】
(1)sql92语法:update 表1 别名,表2 别名set 列=值,....where 连接条件and 筛选条件
(2)sql99语法:update 表1 别名 【join type】 join 表2 别名 on 连接条件set 列=值,....where 筛选条件
3、案例
代码语言:javascript复制#1.修改单表中的记录
#案例:修改beauty表中姓杨的女神电话为11122233344
UPDATE beauty
SET phone='11122233344'
WHERE NAME LIKE '杨%';
#2.修改多表的记录
#案例:修改张无忌的女朋友的手机号114
UPDATE beauty b JOIN boys bo ON b.`boyfriend_id`=bo.`id`
SET b.`phone`=114
WHERE bo.`boyName`='张无忌';
tips:在上面的代码中,我们主要展示对表中数据的修改语法。查看这段代码,我们可以将其类比为插入语法中的方式二,使用set关键字,将特定的列值修改为设定的参数值。对比单表修改和多表修改,我们可以发现,不同点就在于多表中有一个多表连接,连接语法与我们在dql语言中使用的类似。
三、删除
1、方式一
使用delete
(1)删除单表的记录
delete from 表名 【where 筛选条件】【limit 条目数】
(2)级联删除【补充】
delete 别名1,别名2 from 表1 别名 连接类型 join 表2 别名 on 连接条件
【where 筛选条件】
2、方式二
使用truncate
语法:truncate table 表名
3、案例
代码语言:javascript复制#1.单表删除
#案例:删除手机号以9结尾的女神信息
DELETE FROM beauty WHERE phone LIKE '%9';
#2.级联删除
#案例:删除黄晓明的信息以及他女朋友的信息
DELETE b,bo
FROM beauty b JOIN boys bo ON b.`boyfriend_id`=bo.`id`
WHERE bo.`boyName`='黄晓明';
#方式二:truncate语句
#无法添加筛选条件,直接将整张表清空
TRUNCATE TABLE boys;
tips:对于单表删除,直接查看语句就会一目了然,我们不再赘述。主要提一下级联删除,级联删除还是属于多表删除,使用到了多表互连的语法。在对表中数据进行删除时,需要注意一点,delete后面,需要加上需要删除的表,因为语法中涉及到了多表,而我们可能只是删除其中某个表格中的数据,其他表格仅仅是用于筛选,如果需要删除所有表格中符合筛选条件的数据,那么我们就需要将每个表名放在delete关键字后面。
对于truncate语句,其默认的是将整个表格的数据全部清空,所以该语法中不需要加入筛选条件。对于两种删除语法的区别,我们在下面将会加以介绍。
4、两种方式的区别【面试题】
(1)truncate删除后,如果再插入,标识列从1开始;delete删除后,如果再插入,标识列从断点开始
(2)delete可以添加筛选条件;truncate不可以添加筛选条件
(3)truncate效率较高,delete效率较低
(4)truncate没有返回值,delete有返回值
(5)truncate是彻底删除,不能回滚,delete可以回滚
DDL语言
date define language数据定义语言,主要负责对数据库和表的结构进行修改,而不是对表中数据进行修改。
一、库的管理
1、创建库
create database 【if not exists】 库名 【character set 字符集】;
2、修改库
alter database 库名 character set 字符集;
3、删除库
drop database 【if exists】 库名;
4、案例
代码语言:javascript复制#1、创建库Books
CREATE DATABASE IF NOT EXISTS books;
#2、库的修改
#更改库的字符集
ALTER DATABASE books CHARACTER SET utf8;
#3、库的删除
DROP DATABASE IF EXISTS books;
tips:在一般的工程中,我们不会对库有什么具体的修改,因为对库的修改容易导致整个数据的不稳定。数据库的命名以及字符集等等属性设置,一般在创建的初始时就需要被设置好。在以后的运维过程中基本也不会有什么变动,可能变化的主要就是数据库的字符集。所以在对库的操作中,我们主要介绍了创建和删除,以及对数据库字符集的修改。对比后面对表的管理,使用的关键字也是一样的!
二、表的管理
1、创建表
create table 【if not exists】 表名(
字段名 数据类型 【约束】,
......
字段名 数据类型 【约束】
);
2、修改表
(1)添加新列
alter table 表名 add column 列名 类型 【first|after 字段名】;
(2)修改列的类型
alter table 表名 modify column 旧字段名 新类型 【新约束】;
(3)对字段重命名
alter table 表名 旧字段名 change column 新字段名 数据类型
(4)删除列
alter table 表名 drop column 列名;
(5)修改表名
alter table 表名 rename 【to】 新表名
3、删除表
drop table 【if exists】 表名;
4、复制表
(1)仅仅复制表的结构
create table 表名1 like 表名2
(2)复制表的结构 数据
create table 表名1
select * from 表名2 【where 筛选】
5、案例
代码语言:javascript复制#1、表的创建
#案例:创建表Book
CREATE TABLE IF NOT EXISTS book(
id INT,#图书编号
bName VARCHAR(20),#图书的名称
price DOUBLE,#价格
authorId INT,#作者编号
publishDate DATETIME#出版日期
);
#案例:创建表author
CREATE TABLE IF NOT EXISTS author(
id INT,#作者id
au_name VARCHAR(20),#作者姓名
nation VARCHAR(20)#国籍
)
#2.表的修改
#(1)修改列名
ALTER TABLE book CHANGE COLUMN publishDate puDate DATETIME;
#(2)修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pudate TIMESTAMP;
#(3)添加列
ALTER TABLE author ADD COLUMN annual DOUBLE;
#(4)删除列
ALTER TABLE author DROP COLUMN annual;
#(5)修改表名
ALTER TABLE author RENAME book_author;
#3.表的删除
DROP TABLE IF EXISTS book_author;
#4.表的复制
INSERT INTO author
VALUES(1,'村上春树','日本'),(2,'莫言','中国'),(3,'金庸','中国'),(4,'古龙','中国');
#(1)仅仅复制表的结构
CREATE TABLE copy LIKE author;
#(2)复制表的结构 数据
CREATE TABLE copy2 SELECT * FROM author;
#(3)仅仅复制表的部分数据
CREATE TABLE copy3 SELECT * FROM author WHERE nation = '中国';
#(4)仅仅复制表的部分结构,不复制数据
CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 0;
tips:在上面对表的增删改中,全都是按照上述的基本语法进行操作,修改列的时候,一定要注意将列的类型重新更新一下。还有一点就是表的复制,通过上面的案例可以发现一点,表的复制,使用的是create关键字,在表的后面可以添加子查询语句,有点类似于dml语句中的插入语法。
三、数据类型
1、数值型
(1)整型
tinyint、smallint、mediumint、int、integer、bigint
特点:
- 都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号
- 如果超出了范围,会报out of range异常,插入临界值
- 长度可以不指定,默认会有一个长度
长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型。
tips:当设置为无符号时,插入负数,将会在数据库中用0进行填充。
(2)浮点型
定点数:decimal(M,D)
浮点数:
float(M,D)
double(M,D)
特点:
- M代表整数部位 小数部位的个数,D代表小数部位
- 如果超出范围,则报out of range 异常,并且插入临界值
- M和D都可以省略,但对于定点数,M默认为10,D默认为0,如果是float和double,则会根据插入的数值的精度来决定精度。
- 如果精度要求较高,则优先考虑使用定点数。如:货币运算等则考虑使用。
tips:double所占字节数为8,float所占字节数为4,无其他区别。
2、字符型
char、varchar、binary、varbinary、enum、set、text、blob
char:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1
varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M不可以省略
tips:对于char和varchar两种类型,需要根据实际情况进行选择。当某一列确定为性别或学号等等信息时,已经可以知道其长度,此时应该选择char,可以占用更小的内存空间。
3、日期型
year年
date日期
time时间
datetime 日期 时间 8字节
timestamp 日期 时间 4字节 比较容易受时区,语法模式、版本的影响,更能反映当前时区的真实时间
tips:timestamp可以根据所在时区的不同,自动的将存储的时间转换为对应时区的时间,所以,timestamp类型所反映的时间更加精准。
四、常见的约束
1、含义
一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠
2、分类
(1)not null :非空,用于保证该字段的值不能为空。比如姓名,学号等(2)default:默认,用于保证该字段有默认值。比如性别
(3)primary key:主键,用于保证该字段的值具有唯一性,并且非空。比如学号、员工编号等
(4)unique:唯一,用于保证该字段的值具有唯一性,可以为空。比如座位号(5)check:检查约束【mysql中不支持】。比如年龄。性别
(6)foreign key:外键。用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外加约束,用于引用主表中某列的值。比如学生表的专业编号
3、添加约束
(1)添加约束的时机
- 创建表时
- 修改表时
(2)约束的添加分类
- 列级约束:六大约束语法上都支持,但是外键约束没有效果
- 表级约束:除了非空、默认,其他的都支持
4、案例
代码语言:javascript复制#一、创建表时添加约束
#1、添加列级约束
/*
语法
直接在字段名和类型后面追加 约束类型即可。
只支持:默认、非空、主键、唯一
*/
CREATE TABLE stuinfo(
id INT PRIMARY KEY,#主键
stuName VARCHAR(20) NOT NULL,#非空
gender CHAR(1) CHECK(gender='男' OR gender='女'),#检查
seat INT UNIQUE,#唯一
age INT DEFAULT 18,#默认约束
majorId INT REFERENCES major(majorid)#外键
);
#2.添加表级约束
/*
语法:在各个字段的最下面
【constraint 约束名】 约束类型(字段名)
*/
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id),#主键
CONSTRAINT uq UNIQUE(seat),#唯一键
CONSTRAINT ck CHECK(gender='男' OR gender='女'),#检查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(majorid)#外键
);
#二、修改约束
/*
1、添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
2、添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
*/
#1、添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
#2、添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#3、添加主键
#(1)列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#(2)表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#4、添加唯一
#(1)列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#(2)表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
#5、添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(majorid);
#三、修改表时删除约束
#1、删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20);
#2、删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#3、删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4、删除唯一
ALTER TABLE stuinfo DROP INDEX seat;
#5、删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
tips:在上面的案例中,我们将每种情况都列出了相应的案例。最主要的语法并没有特别大的改变,主要是反复修改相应的约束关键字。在列级修改和表级修改中, 主要在于约束类型的限制。