进阶9:联合查询
进阶9是DQL的最后一节,到此查询语句完结撒花!对了,先看完再撒花~
union 联合查询 :将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
……
应用场景:
要查询的结果来自两个不同的表,表之间没有直接联系,但要查信息是一样的
特点:
1、要求查询的列数一致,默认记录第一个查询语句的列表名称
2、要求查询的顺序和类型一致,如果不一致虽然不报错,但字段含义会混淆
3、union 关键字默认去重,union all 包含重复项
查询邮箱中含有a,或者工资>5000的员工信息
#法一
SELECT * FROM employees WHERE `email` LIKE '%a%' OR salary >5000
#法二
SELECT * FROM employees WHERE `email` LIKE '%a%'
UNION
SELECT * FROM employees WHERE salary >5000
#在涉及两个表的时候,且两个表没有联系,但查询内容相同时 优势更好
#比如: 同时存在员工信息,一张是国内员工,一张是国外员工时
进阶十: DML语言
insert update delete
一、插入语句
方式一 语法:
insert into 表名 (列名,...) values(值1,...)
方式二 语法:
insert into 表名
set 列=值,列=值,……
两种方式PK:
1、方式一支持多行,方式二不支持
2、方式一支持查询,方式二不支持
1、插入的数据要与字段的类型一致或者兼容
INSERT INTO beauty (`id`,`name`,`sex`,`borndate`,`phone`,`photo`,`boyfriend_id`)
VALUES(13,'杨幂','女','1996-6-30','1238888888',NULL,5)
SELECT * FROM beauty
2、不可以为null的列必须插入值,可以为null的列如何插入值呢?
#方式一 如上的插入语句
#可以为null的字段写上,值写null
#方式二
INSERT INTO beauty (`id`,`name`,`sex`,`borndate`,`phone`,`boyfriend_id`)
VALUES(14,'李沁','女','1996-5-30','1237777777',6)
#可以为null的字段不写上,值也不写
3、列的顺序可以颠倒,一一对应就可以
4、列的个数必须和值的个数一样
5、可以省略列名,默认个数和顺序与表一致
6、set 插入
INSERT INTO beauty
SET id=15,NAME='谢娜',phone='565656565'
7、一次插入多条数据
方式一
INSERT INTO beauty (id,NAME,phone)
VALUES(16,'关晓彤','34343434'),
(17,'杨紫','12121212'),
(18,'张雨绮','8787878787');
方式二
INSERT INTO boys
SELECT 5 ,'张一山',900 UNION
SELECT 6,'李现',800 UNION
SELECT 7,'黄子韬',800
8、支持子查询
INSERT INTO beauty (id,NAME,phone)
SELECT 19,'IU','21212121'
INSERT INTO beauty (id,NAME,phone)
SELECT 20,`boyName`,'21212121'
FROM boys
WHERE id=4
二、修改
1、修改单表的记录(❤)
语法:
update 表
set 列=值,列=值,……
where 筛选条件
执行顺序:
先锁定表,再筛选,在更新
2、修改多表的记录(补充)
语法:
1.sql92:
update 表1 别名, 表2 别名
set 列=值……
where 连接条件
and 筛选条件
2.sql99
update 表1 别名 (连接类型)join 表2 别名
on 连接条件
set 列=值……
where 筛选条件
案例1:修改单表
给杨幂一个男朋友
UPDATE beauty
SET `boyfriend_id`=8
WHERE `name` = '杨幂'
案例2:修改多表
1、修改张无忌的女朋友的手机号为114
UPDATE boys bo JOIN beauty b
ON bo.id = b.boyfriend_id
SET b.`phone`='114'
WHERE bo.`boyName`='张无忌'
2、修改没有男朋友的女神的男朋友id都为5
UPDATE beauty b LEFT JOIN boys bo
ON b.boyfriend_id = bo.id
SET b.boyfriend_id = 5
WHERE b.boyfriend_id IS NULL
三、表的删除
方式一:delete
1、单表删除(☆)
delete from 表 where 筛选条件
2、多表删除(补充)
sql92
delete 表1的别名,表2的别名 from 表1 别名 , 表2 别名
where 连接条件
and 筛选条件
sql99
delete 表1的别名,表2的别名
from 表1 别名 【连接类型】join 表2 on 连接条件
where 筛选条件
方式二:truncate
truncate table 表
delete PK truncate
1.delete 可以加where条件 ,truncate 不可以
2.truncate的效率高一点点
3.如果要删除的表中有自增长列,
delete删除后,再插入数据,自增长列从断点开始
truncate删除,再插入数据,自增长列从1开始
4.truncate删除没有返回值,delete删除可以返回受影响的行数
5.truncate删除不能回滚,delete删除后可以回滚
1、delete 单表删除
删除手机号以9结尾的女神的信息
DELETE FROM beauty
WHERE phone LIKE '%9'
2、delete 多表删除
删除张无忌的女朋友的信息
DELETE b
FROM beauty b JOIN boys bo
ON b.`boyfriend_id`=bo.id
WHERE bo.`boyName`='张无忌'
#因为只删除女神的信息,所以删除字段中只写了女神表的别名
删除黄晓明的信息以及他的女朋友的信息
DELETE b,bo
FROM beauty b JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE bo.boyName='黄晓明'
truncate
TRUNCATE TABLE 表
#又称作清空这个表,不能加条件,一删就是整张表
查看表的结构
DESC boys
进阶十一:DDL语言 数据定义语言
主要指库和表的管理
一、库的管理
创建,修改,删除
二、表的管理
创建,修改,删除
ps:之前对表的操作都是对表中的数据进行操作,这是对表的结构进行定义
关键字
创建:create 修改:alter 删除:drop
一、库的管理
1、创建库
语法: create database [if not exists] 库名;
提高容错性:if not exist如果存在就不建了,如果不存在就给我建上
CREATE DATABASE IF NOT EXISTS books;
2、库的修改
一般来说不去修改库,就算库名也不去修改,错了直接删掉
可以修改库的字符集utf8,gbk 之类的.
ALTER DATABASE books CHARACTER SET utf8;
3、库的删除
DROP DATABASE IF EXISTS books;
二、表的管理
语法:
create table 表名(
列名 列的类型 【长度,约束】,
列名 列的类型 【长度,约束】,
列名 列的类型 【长度,约束】,
...
列名 列的类型 【长度,约束】
)
1.创建Book表
CREATE DATABASE Books; #sql中是不区分大小写的
CREATE TABLE Book(
id INT,#编号
bName VARCHAR(20) ,#图书名
price DOUBLE, #价格
authorId INT, #作者编号
publishDate DATETIME #出版日期
);
DESC book;
#刷新要在上一级上刷新
创建作者表author
CREATE TABLE IF EXISTS author(
id INT,#编号
au_Name VARCHAR(20) ,#图书名
nation VARCHAR(10)
);
2、表的修改
语法:
alter table 表 add|drop|change(修改列名)|modify(修改类型)
column 列名 【列的类型,约束】
①修改表的列名 alter change
语法 alter table 表 change column 旧列名 新列名 类型
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
#column 可以省略不写,但是字段的类型必须要写,但在除change之外的其他定义语言中column必须写
#publishdate 我有故意写的不一样,但是还是可以执行的
②修改表的类型或约束 alter modify
语法 alter table 表 modify column 旧类型 新类型 【新约束】
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
DESC book;
③添加列,默认添在最后,可以用可选参数first 和 after修改
语法 alter table 表名 add column 列名 类型 【first|after 字段名】
给author表添加年薪列 alter add
ALTER TABLE author ADD COLUMN annual DOUBLE ;
DESC author;
④删除列 drop 【column】(【】不用写的)
ALTER TABLE author DROP annual;
DESC author;
#已经删除的不存在的话,再去执行会报错
⑤修改表名 raname 【to】
ALTER TABLE author RENAME TO book_author;
⑥删除表
DROP TABLE IF EXISTS book_author;
SHOW TABLES;#展示当前库的所有表
3、表的复制
①仅复制表的结构
先建个表
INSERT INTO book_author VALUES
(1,'村上春树','日本'),
(2,'唐家三少','中国'),
(3,'天蚕土豆','中国'),
(4,'余华','中国');
复制这张表,说是复制,就是创建一张相同的表
CREATE TABLE struc_book LIKE book_author;
②复制表的结构+数据
CREATE TABLE data_strc_book
SELECT * form book_author;
#当然也可以仅仅复制部分数据,加条件就是了
#可以跨库去复制表的结构,直接写 库.表 就行
③仅仅复制部分结构,但是不要里面的是数据
CREATE TABLE part_struc_book
SELECT id,au_Name FROM book_author
WHERE 0;
#where 后面加上一个恒不成立的条件,就筛选不出数来了。
到此为止呢DQL,DML,DDL就全部介绍完了,我觉得这些应该都是数据库的基础,大路边上的知识,还有深层的别的东西,还需继续学习。当然了,这些大路边上的东西用的最多,得先掌握,没事拿出来翻一翻。
网友评论