MySQL-CRUD

SQL语句分类

  • DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
  • DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
  • DDL(数据定义语言):create drop alter,对表结构的增删改。
  • TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)
  • DCL(数据控制语言): grant授权、revoke撤销权限等。
  • Select语句

    查看表结构

    desc + table_name

    mysql> desc dept; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | DEPTNO | int(2) | NO | PRI | NULL | | 部门编号 | DNAME | varchar(14) | YES | | NULL | | 部门名称 | LOC | varchar(13) | YES | | NULL | | 部门位置 +--------+-------------+------+-----+---------+-------+

    简单查看表中数据

    语法格式:
    select 字段名1,字段名2,字段名3,.... from 表名;

    1、任何一条sql语句以“;”结尾。
    2、sql语句不区分大小写。

    给查询结果的列重命名

    as 关键字,as 关键字可以省略

    select ename,sal * 12 as yearsal from emp;
    

    查询所有字段

    select * from table_name;

    实际开发中不建议使用*,效率较低。

    mysql> select * from dept;
    +--------+------------+----------+
    | DEPTNO | DNAME      | LOC      |
    +--------+------------+----------+
    |     10 | ACCOUNTING | NEW YORK |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    +--------+------------+----------+
    

    语法格式:
    select
    字段,字段...
    where

    执行顺序:先from,然后where,最后select

    模糊查询使用关键字like
    在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_
    %代表任意多个字符,_代表任意1个字符。

    找出名字当中含有O的?
    (在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_)
    %代表任意多个字符,_代表任意1个字符。
    select ename from emp where ename like '%O%';
    +-------+
    | ename |
    +-------+
    | JONES |
    | SCOTT |
    | FORD  |
    +-------+
    找出名字中第二个字母是A的?
    select ename from emp where ename like '_A%';
    +--------+
    | ename  |
    +--------+
    | WARD   |
    | MARTIN |
    | JAMES  |
    +--------+
    找出名字中有下划线的?
    mysql> select * from t_user;
    +------+----------+
    | id   | name     |
    +------+----------+
    |    1 | zhangsan |
    |    2 | lisi     |
    |    3 | WANG_WU  |
    +------+----------+
    select name from t_user where name like '%_%';
    +----------+
    | name     |
    +----------+
    | zhangsan |
    | lisi     |
    | WANG_WU  |
    +----------+
    select name from t_user where name like '%\_%';
    +---------+
    | name    |
    +---------+
    | WANG_WU |
    +---------+
    找出名字中最后一个字母是T的?
    select ename from emp where ename like '%T';
    +-------+
    | ename |
    +-------+
    | SCOTT | 
    +-------+
    

    结果集去重

    distinct关键字

    mysql> select distinct job from emp; // distinct关键字去除重复记录。
    +-----------+
    | job       |
    +-----------+
    | CLERK     |
    | SALESMAN  |
    | MANAGER   |
    | ANALYST   |
    | PRESIDENT |
    +-----------+   
    mysql> select ename,distinct job from emp;
    以上的sql语句是错误的。
    记住:distinct只能出现在所有字段的最前面。
    

    关键字order by

    MySQL中默认是升序。asc表示升序,desc表示降序

    select 
    order by
    
    select 
            字段                      3
            表名                      1
        where
            条件                      2
        order by
            ....                        4
        order by是最后执行的。
    

    查看当前 数据库与版本号

    mysql> select database(); 查看当前使用的是哪个数据库
    +-------------+
    | database()  |
    +-------------+
    | swu         |
    +-------------+
    mysql> select version(); 查看mysql的版本号。
    +-----------+
    | version() |
    +-----------+
    | 8.0.28    |
    +-----------+
    

    分组函数又称多行处理函数,输入多行,最终输出的结果是1行

  • count 计数
  • sum 求和
  • avg 平均值
  • max 最大值
  • min 最小值
  • 所有的分组函数都是对“某一组”数据进行操作

    分组函数自动忽略NULL

    where中不能直接使用

    select ename,sal from emp where sal > avg(sal);
    //ERROR 1111 (HY000): Invalid use of group function
    

    思考以上的错误信息:无效的使用了分组函数?
    原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中

    我们用序号来表示执行的先后顺序

    因为group by是在where执行之后才会执行的
    select      5
    from        1
    where       2
    group by    3
    having      4
    order by    6
    

    count(*)和count(字段)的区别

    count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
    count(comm): 表示统计comm字段中不为NULL的数据总数量
    

    group by and having

    group by : 按照某个字段或者某些字段进行分组。
    having : having是对分组之后的数据进行再次过滤

    案例:找出每个工作岗位的最高薪资

    select max(sal),job from emp group by job;
        +----------+-----------+
        | max(sal) | job       |
        +----------+-----------+
        |  3000.00 | ANALYST   |
        |  1300.00 | CLERK     |
        |  2975.00 | MANAGER   |
        |  5000.00 | PRESIDENT |
        |  1600.00 | SALESMAN  |
        +----------+-----------+
    
  • 分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。
  • 并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
  • 当一条sql语句没有group by的话,整张表的数据会自成一组。
  • select ename,max(sal),job from emp group by job;
    以上在mysql当中,查询结果是有的,但是结果没有意义,在Oracle数据库当中会报错。语法错误。
    

    Oracle的语法规则比MySQL语法规则严谨。
    记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段

    完整DQL语句写法

    数字代表执行顺序

    select          5
    from            1   
    where           2
    group by        3
    having          4
    order by        6
    

    insert语句

    语法格式:

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

    要求:字段的数量和值的数量相同,并且数据类型要对应相同

  • 当一条insert语句执行成功之后,表格当中必然会多一行记录。
  • 即使多的这一行记录当中某些字段是NULL,后期也没有办法在执行
  • insert语句插入数据了,只能使用update进行更新。
  • 一次插入多行数据

    insert into t_student(no,name,sex,classno,birth) values
    (3,'rose','1','1101','1952-12-14'),
    (4,'jack','1','1201','1955-12-14');
    

    查询结果插入表

    mysql> insert into dept1 select * from dept;
    mysql> select * from dept1;
        +--------+------------+----------+
        | 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   |
        +--------+------------+----------+
    create table 表名 as select语句;
    将查询结果当做表创建出来

    update语句

    语法格式:

    update 表名 set 字段名1=值1,字段名2=值2... where 条件;
    
    将部门10的LOC修改为SHANGHAI,将部门名称修改为RENSHIBU
        update dept1 set loc = 'SHANGHAI', dname = 'RENSHIBU' where deptno = 10;
        mysql> select * from dept1;
        +--------+------------+----------+
        | DEPTNO | DNAME      | LOC      |
        +--------+------------+----------+
        |     10 | RENSHIBU   | SHANGHAI |
        |     20 | RESEARCH   | DALLAS   |
        |     30 | SALES      | CHICAGO  |
        |     40 | OPERATIONS | BOSTON   |
        |     10 | RENSHIBU   | SHANGHAI |
        |     20 | RESEARCH   | DALLAS   |
        |     30 | SALES      | CHICAGO  |
        |     40 | OPERATIONS | BOSTON   |
        +--------+------------+----------+
        更新所有记录
            update dept1 set loc = 'x', dname = 'y';
            mysql> select * from dept1;
            +--------+-------+------+
            | DEPTNO | DNAME | LOC  |
            +--------+-------+------+
            |     10 | y     | x    |
            |     20 | y     | x    |
            |     30 | y     | x    |
            |     40 | y     | x    |
            |     10 | y     | x    |
            |     20 | y     | x    |
            |     30 | y     | x    |
            |     40 | y     | x    |
            +--------+-------+------+
    

    delete语句

    语法格式:

    delete from 表名 where 条件;
    

    注意:没有where设置条件,表中的数据将会被全部删除

    如何快速删除大数据量的表

    在实际开发过程中,一张表可能有成千上万条记录,此时执行delete语句往往需要十多分钟,我们可以直接使用truncate截断表数据,速度在瞬间完成。

    truncate table 表名
    

    表被截断,不可回滚,数据永久丢失

    关于删库跑路的一点看法

    首先我们来看两条新闻

  • 百度 95 后程序员删库跑路被判刑,动机是工作变动及对领导不满 (baidu.com)
  • 程序员离职当天“删库跑路”,后果很严重,法院判了 (baidu.com)