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

作者: 粉红狐狸_dhf | 来源:发表于2020-07-14 20:11 被阅读0次

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

    相关文章

      网友评论

        本文标题:SQL第4/n篇(更新中)DQL,DML,DDL语言

        本文链接:https://www.haomeiwen.com/subject/nggfhktx.html