大数据 爬虫Python AI SqlSQL极简教程 · MySQL · MyBatis · JPA 技术笔记 教程 总结呆鸟的Python数据分析

SQL第4/n篇(更新中)DQL,DML,DDL语言

2020-07-14  本文已影响0人  粉红狐狸_dhf

进阶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就全部介绍完了,我觉得这些应该都是数据库的基础,大路边上的知识,还有深层的别的东西,还需继续学习。当然了,这些大路边上的东西用的最多,得先掌握,没事拿出来翻一翻。

上一篇下一篇

猜你喜欢

热点阅读