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
字段,字段...
from
表名
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 
    ...
from 
    表名 
order by
    ...

执行顺序

select 
        字段                      3
    from
        表名                      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 表名

警告

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


关于删库跑路的一点看法

新闻

首先我们来看两条新闻

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

观点

个人认为删库跑路的程序员不负责任,没有担当意识,“删库跑路”这种行为类似与小孩子发脾气,并且违反了相关法律法规,对自己和公司都造成了严重伤害,可以说是杀敌一千,自损一万。

赔钱事小,蹲监狱事大。

更何况还是删除数据库,给公司带来极大损失,相信以后没有公司还敢再聘用这类程序员。

一时的冲动导致编程生涯的结束,可惜。

我们还是要遵守法律法规,心有不满,可以多和领导多交流,多沟通。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容