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 表名
警告
表被截断,不可回滚,数据永久丢失
关于删库跑路的一点看法
新闻
首先我们来看两条新闻
观点
个人认为删库跑路的程序员不负责任,没有担当意识,“删库跑路”这种行为类似与小孩子发脾气,并且违反了相关法律法规,对自己和公司都造成了严重伤害,可以说是杀敌一千,自损一万。
赔钱事小,蹲监狱事大。
更何况还是删除数据库,给公司带来极大损失,相信以后没有公司还敢再聘用这类程序员。
一时的冲动导致编程生涯的结束,可惜。
我们还是要遵守法律法规,心有不满,可以多和领导多交流,多沟通。