从今天开始,我会把自己学习MySQL的心得写在这里,希望能和大家一起进步!!!
所有MySQL使用的sql文本内容都出自B站老杜,有需要的小伙伴可以加我QQ1845356586。
一:SQL语句的分类
SQL语句分为DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言):create drop alter,对表结构的增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)
DCL(数据控制语言): grant授权、revoke撤销权限等。
二:基本的MySQL指令
1.在dos窗口下登录MySQL:mysql -u root -p(这里是你的登陆密码)
2.查看数据库指令:show databases;(这个不是SQL语句,属于MySQL的命令。)
3.创建数据库指令:create database xxxx;(这个不是SQL语句,属于MySQL的命令。)
4.使用数据库指令:use xxxx;(这个不是SQL语句,属于MySQL的命令。)
5.查看当前的数据库有哪些表:show tables;(这个不是SQL语句,属于MySQL的命令。)
6.删除数据库指令:drop database xxxx;
7.查看表中数据:select * from xxxx;
由于我电脑本身已经有了相关数据,所以接下来的操作我会直接用数据进行操作。
8.查看当前使用的是哪个数据库:select database();
9.查看当前数据库版本号:select version();
10.查看创建表的语句:show create table emp;
11.给查询的列重命名:select ename,sal * 12 as '年薪' from emp;
注意:标准sql语句中要求字符串使用单引号括起来,虽然mysql支持双引号,但是尽量别使用。
12.条件查询语法格式:select 字段,字段.... from 表名 where 条件;
执行顺序:先from,然后where,最后select
例如:eg1查询工资等于5000的员工姓名
select ename,sal from emp where sal = 5000;
eg2查询工资不等于3000的员工姓名
select ename,sal from emp where sal <> 3000;或select ename,sal from emp where sal != 3000;
eg3找出工资在1100和3000之间的员工
select ename,sal from emp where sal between 1100 and 3000;
注意:between .... and ....是闭区间,即上述例子是查 [1100,3000],包含1100和3000
13.NULL,在数据库中NULL不是一个值,代表什么也没有,为空。空不是一个值,不能用等号衡量。必须使用is null 或 is not null。
例如:eg1找出哪些人的津贴不为NULL
select ename,sal,comm from emp where comm is not null;
eg2找出哪些人没有津贴
select ename,sal,comm from emp where comm is null or comm = 0;
eg3找出工作岗位是manager和salesman的员工
select ename,sal,job from emp where job = 'manager' or job = 'salesman';
and和or联合起来用:找出薪资大于1000的并且部门编号是20或30部门的员工。
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);
14.模糊查找like,(在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_)%代表任意多个字符,_代表任意1个字符。
eg1找出名字里面有o的
select ename from emp where ename like '%o%';
eg2找出第二个字母是A的
select ename from emp where ename like '_A%';
15.排序,升序
格式: select 字段名,字段名.... from 表名 order by 条件;
例如:eg1 按照工资升序,找出员工名和薪资
select ename,sal from emp order by sal;
注意:默认是升序,那怎么指定升序和降序勒? asc升序,desc降序
eg2 还是拿上面的例子
select ename,sal from emp order by sal;//升序
select ename,sal from emp order by sal asc;//升序
select ename,sal from emp order by sal desc;//降序
eg3按照工资的降序排,如果工资一样,那就按照名字的升序排。
select ename,sal from emp order by sal desc,ename asc;
注意:多字段排序时,越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。
where和order by同时使用,格式
select 字段名,字段名.... from 表名 where 条件 order by ....
先执行 from 接着where 接着select 最后 order by排序。
eg1查询工作是salesman的并且按照工资的升序排
select ename,sal,job from emp where job = 'salesman' order by sal;
16.分组函数
count计数,sum求和会自动忽略NULL,max最大值,min最小值,avg平均值
注:count(*)和count(具体的某个字段),他们有什么区别?
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm): 表示统计comm字段中不为NULL的数据总数量。
注意:所有的分组函数都是对'某一组'数据进行操作的。
分组函数一共有5个,同时分组函数还有另外一个名字:多行处理函数。其特点是:输入多行,最终输出的结果是1行。并且分组函数会自动忽略NULL。
17.单行处理函数:输入一行,输出一行。
重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
eg1计算所有工人的年薪
select ename,(sal+comm) * 12 as '年薪' from emp;
要想不出现NULL,就得使用ifnull() 空处理函数
ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。
eg2:如果津贴是NULL,那就当作0来处理
18.group by 和 having
group by:按照某个字段或者某些字段进行分组
having:having是对分组之后的数据进行再次过滤
eg1找出每个工作岗位的最高薪资
select max(sal) from emp group by job;
注意:分组函数一般和group by联合使用,这也是为什么它被称为分组函数的原因。
并且任何一个分组函数(sum,avg,max,min,count)都是在group by语句执行结束后才会执行。当一条sql语句没有group by的话,整张表的数据会自成一组。
另外:分组函数之所以不能用在where子句中,是因为group by是在where之后执行的
结论:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。
eg2找出每个工作岗位的平均薪资
select avg(sal),job from emp group by job;
eg3找出每个部门的最高薪资,要求显示薪资大于2900的数据
select deptno,max(sal) from emp group by deptno havind max(sal) > 2900;//这种方式效率低
可以直接使用where过滤
select deptno,max(sal) from emp where sal > 2900 group by deptno;//效率较高,建议能使用where过滤尽量使用
19.总结一个完整的DQL语句怎么写
执行顺序如下:
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
感谢观看!我是酷酷的涛!!!