• MySql学习笔记05——DML


    DML

    插入数据insert

    insert into 表名(字段名1,字段名2,字段名3...)values(1,值2,值3)
    • 1

    字段名和值要一一对应(顺序对应,数据类型对应)

    insert into t_student(no,name,sex,age,email) values(1,'Jack','b',12,'123456@123.com');
    +------+------+------+------+----------------+
    | no   | name | sex  | age  | email          |
    +------+------+------+------+----------------+
    |    1 | Jack | b    |   12 | 123456@123.com |
    +------+------+------+------+----------------+
    insert into t_student(email,name,sex,age,no) values('lisi@123.com','lisi','f',20,2);
    +------+------+------+------+----------------+
    | no   | name | sex  | age  | email          |
    +------+------+------+------+----------------+
    |    1 | Jack | b    |   12 | 123456@123.com |
    |    2 | lisi | f    |   20 | lisi@123.com   |
    +------+------+------+------+----------------+
    insert into t_student(no) values(3);
    +------+------+------+------+----------------+
    | no   | name | sex  | age  | email          |
    +------+------+------+------+----------------+
    |    1 | Jack | b    |   12 | 123456@123.com |
    |    2 | lisi | f    |   20 | lisi@123.com   |
    |    3 | NULL | NULL | NULL | NULL           |
    +------+------+------+------+----------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    insert语句只负责插入数据,不负责修改数据。

    没有给其它字段指定值的话,默认值是NULL。

    通过关键字default可以设置字段的默认值,例如:

    sex char(1) default 'm',
    
    • 1

    insert语句中的字段名可以省略,但是values中的值就必须全部写上,并且一一对应。

    insert插入时间

    create table t_user(
        id int(11),
        name varchar(32),
        birth date
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
     insert into t_user values(123,'Jack',str_to_date('01-10-1990','%d-%m-%Y'));
    
    • 1

    使用str_to_date函数将字符串类型转换成data类型。

    str_to_date('字符串日期','日期格式')
    • 1

    MySQL日期格式:

    %Y    年// 注意这里Y大写
    %m  月
    %d  日
    %h    时
    %i    分
    %s    秒
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通常使用在插入insert方面,因为插入的时候需要一个日期类型的数据,需要通过该函数将字符串转换成date

    如果你提供的日期字符串是%Y-%m-%d这个格式,str_to_date函数就不需要了!!!

    查询的时候可以使用date-format函数将日期类型转化成特定格式的字符串。

    date_format('日期类型数据', '日期格式')
    
    • 1
    mysql> select * from t_user;
    +------+------+------------+
    | id   | name | birth      |
    +------+------+------------+
    |  123 | Jack | 1990-10-01 |
    |  124 | Lili | 1991-06-21 |
    +------+------+------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    默认的日期显示格式是%Y-%m-%d

    自定义显示格式:

    mysql> select id,name,date_format(birth,'%Y/%m/%d') as birth from t_user;
    +------+------+------------+
    | id   | name | birth      |
    +------+------+------------+
    |  123 | Jack | 1990/10/01 |
    |  124 | Lili | 1991/06/21 |
    +------+------+------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    date和datetime之间的区别

    date是短日期,只包括年月日

    datetime是长日期,包括年月日,时分秒

    mysql短日期默认格式:%Y-%m-%d
    mysql长日期默认格式:%Y-%m-%d %h:%i:%s

    create table t_user(
        id int,
        name varchar(32),
        birth date,
        create_time datetime
    );
    
    insert into t_user(id,name,birth,create_time) values(123,'Tim','1990-10-01','2021-06-21 12:12:52');
    mysql> select * from t_user;
    +------+------+------------+---------------------+
    | id   | name | birth      | create_time         |
    +------+------+------------+---------------------+
    |  123 | Tim  | 1990-10-01 | 2021-06-21 12:12:52 |
    +------+------+------------+---------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    now()函数可以获取系统的时间,并且是datetime类型的。

    insert into t_user (id,name,birth,create_time) values(122,'Jan','2012-12-23',now());
    mysql> select * from t_user;
    +------+------+------------+---------------------+
    | id   | name | birth      | create_time         |
    +------+------+------------+---------------------+
    |  123 | Tim  | 1990-10-01 | 2021-06-21 12:12:52 |
    |  122 | Jan  | 2012-12-23 | 2022-07-17 12:28:10 |
    |  111 | Nik  | 2011-06-23 | 2022-07-17 12:28:34 |
    +------+------+------------+---------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    当然了,datetime也是支持函数date_format进行格式化显示的

    mysql> select id,name,birth,date_format(create_time,'%h/%i/%s %Y-%m-%d')as create_time from t_user;
    +------+------+------------+---------------------+
    | id   | name | birth      | create_time         |
    +------+------+------------+---------------------+
    |  123 | Tim  | 1990-10-01 | 12/12/52 2021-06-21 |
    |  122 | Jan  | 2012-12-23 | 12/28/10 2022-07-17 |
    |  111 | Nik  | 2011-06-23 | 12/28/34 2022-07-17 |
    +------+------+------------+---------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    修改表中数据update

    update 表名 set 字段名1=新值1,字段名2=新值2,字段名3=新值3...where 条件
    
    • 1

    这里的where条件是用来判断修改哪一行的数据。

    mysql> select * from t_user;
    +------+------+------------+---------------------+
    | id   | name | birth      | create_time         |
    +------+------+------------+---------------------+
    |  123 | Tim  | 1990-10-01 | 2021-06-21 12:12:52 |
    |  122 | Jan  | 2012-12-23 | 2022-07-17 12:28:10 |
    |  111 | Nik  | 2011-06-23 | 2022-07-17 12:28:34 |
    +------+------+------------+---------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    update t_user set birth='2013-12-01',create_time=now() where id=123;
    mysql> select * from t_user;
    +------+------+------------+---------------------+
    | id   | name | birth      | create_time         |
    +------+------+------------+---------------------+
    |  123 | Tim  | 2013-12-01 | 2022-07-17 12:58:55 |
    |  122 | Jan  | 2012-12-23 | 2022-07-17 12:28:10 |
    |  111 | Nik  | 2011-06-23 | 2022-07-17 12:28:34 |
    +------+------+------------+---------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果没有了where条件,就是更新了所有。

     update t_user set create_time=now();
     mysql> select * from t_user;
    +------+------+------------+---------------------+
    | id   | name | birth      | create_time         |
    +------+------+------------+---------------------+
    |  123 | Tim  | 2013-12-01 | 2022-07-17 13:00:18 |
    |  122 | Jan  | 2012-12-23 | 2022-07-17 13:00:18 |
    |  111 | Nik  | 2011-06-23 | 2022-07-17 13:00:18 |
    +------+------+------------+---------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    删除表中数据delete

    delete from 表名 where 条件;
    
    • 1

    如果没有条件,整个表都会被删除!!

    delete from t_user where id=111;
    mysql> select * from t_user;
    +------+------+------------+---------------------+
    | id   | name | birth      | create_time         |
    +------+------+------------+---------------------+
    |  123 | Tim  | 2013-12-01 | 2022-07-17 13:00:18 |
    |  122 | Jan  | 2012-12-23 | 2022-07-17 13:00:18 |
    +------+------+------------+---------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    insert插入多条数据

    insert into t_user (id,name,birth,create_time) values
    (1,'zs','1980-10-11',now()), 
    (2,'lisi','1981-10-11',now()),
    (3,'wangwu','1982-10-11',now());
    mysql> select * from t_user;
    +------+--------+------------+---------------------+
    | id   | name   | birth      | create_time         |
    +------+--------+------------+---------------------+
    |    1 | zs     | 1980-10-11 | 2022-07-17 13:41:43 |
    |    2 | lisi   | 1981-10-11 | 2022-07-17 13:41:43 |
    |    3 | wangwu | 1982-10-11 | 2022-07-17 13:41:43 |
    +------+--------+------------+---------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    语法:

    insert into t_user(字段名1,字段名2...) values
    (),
    (),
    (),
    ();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    快速创建表(复制表)

    create table emp2 as select * from emp;
    mysql> show tables;
    +------------------------+
    | Tables_in_bjpowernnode |
    +------------------------+
    | dept                   |
    | emp                    |
    | emp2                   |
    | salgrade               |
    | t_student              |
    | t_user                 |
    +------------------------+
    mysql> select * from emp2;
    +-------+--------+-----------+------+------------+---------+---------+--------+
    | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
    +-------+--------+-----------+------+------------+---------+---------+--------+
    |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
    |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
    |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
    |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
    |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
    |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
    |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
    |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
    |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
    |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
    |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
    |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
    |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
    |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
    +-------+--------+-----------+------+------------+---------+---------+--------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    原理是将一个查询结果当作一张新表,实现快速表的复制

    create table mytable as select empno,ename from emp where job = 'MANAGER';
    mysql> select * from mytable;
    +-------+-------+
    | empno | ename |
    +-------+-------+
    |  7566 | JONES |
    |  7698 | BLAKE |
    |  7782 | CLARK |
    +-------+-------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    将查询结果插入到表中

    用的不多,了解就行了。

    create table dept_bak as select * from dept;
    mysql> select * from dept_bak;
    +--------+------------+----------+
    | DEPTNO | DNAME      | LOC      |
    +--------+------------+----------+
    |     10 | ACCOUNTING | NEW YORK |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    +--------+------------+----------+
    insert into dept_bak select * from dept;
    mysql> select * from dept_bak;
    +--------+------------+----------+
    | DEPTNO | DNAME      | LOC      |
    +--------+------------+----------+
    |     10 | ACCOUNTING | NEW YORK |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    |     10 | ACCOUNTING | NEW YORK |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    +--------+------------+----------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    快速删除表中所有数据

    使用delete不增加where条件也能删除表中所有数据

    delete from dept_bak;
    mysql> select * from dept_bak;
    Empty set (0.00 sec)
    
    • 1
    • 2
    • 3

    但是它可以回滚数据:

    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from dept_bak;
    +--------+------------+----------+
    | DEPTNO | DNAME      | LOC      |
    +--------+------------+----------+
    |     10 | ACCOUNTING | NEW YORK |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    |     10 | ACCOUNTING | NEW YORK |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    +--------+------------+----------+
    8 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    但是从底层逻辑上来说,delete是一个个来删除表中的数据,效率比较低。

    另外一个快速删除表中所有数据的方法是truncate

    truncate table 表名;
    
    • 1

    这个操作属于DDL中的操作。

    使用truncate可以快速删除表中的所有数据,但是不支持数据回滚,因此要考虑再三再去使用它。

    delete语句删除数据的原理?(delete属于DML语句!!!)
    表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放!!!
    这种删除缺点是:删除效率比较低。
    这种删除优点是:支持回滚,后悔了可以再恢复数据!!!
    truncate语句删除数据的原理?
    这种删除效率比较高,表被一次截断,物理删除。
    这种删除缺点:不支持回滚。
    这种删除优点:快速。

    DDL中也有删除表的操作drop,但是drop是删除整个表,表和表的数据全部删除,truncate删除的仅仅只是表中的所有数据,表的结构还在。

  • 相关阅读:
    Q-learning算法实战
    力扣L9--- 12. 整数转罗马数字--2024年3月12日
    8、SpringBoot_多环境开发
    基于java百姓点评网的设计与实现计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
    项目(交友)
    【一般排查思路】针对银河麒麟高级服务器操作系统磁盘空间已满
    【2023CANN训练营第二季】——通过一份入门级算子开发代码了解Ascend C算子开发流程
    Linux该如何学习,给你支招
    DuckDB优化器之Filter提升
    Android Fragment动画实现
  • 原文地址:https://blog.csdn.net/Maxcu/article/details/132664240