1.mysql中的一些mysql命令
命令 | 作用 |
---|---|
mysql -u用户名 -p密码 | 登录mysql |
create database 数据库名称 | 创建数据库 |
use 数据库名称 | 使用数据库 |
show tables | 展示当前数据库所有的表 |
source sql文件路径 | 初始化数据库(加载sql文件) |
drop database 数据库名称 | 删除数据库 |
desc 表名 | 展示表结构 |
select database() | 查询当前所用数据库 |
select version() | 查询当前版本 |
\c | 结束一条语句 |
exit | 退出 |
show create table 表名 | 显示创建该表所使用的语句 |
show tables from 数据库名字 | 显示来自目标数据库中的表 |
2.SQL
名称 | 主要关键字 |
---|---|
DML数据操纵语言 | insert、update、delete |
DQL数据查询语言(这个实际上可以算作DML中的) | select |
DDL数据定义语言 | create、drop、alter |
DCL数据控制语言 | grant、revoke |
下面是案例要用的表
1.dept
2.emp
3.salgrade
简单的DQL语句
a.普通查询
语法格式:
select 字段名1 ,字段名2,字段名3,....from 表面;
1.任何一条sql语句以“;”结尾。
2.sql语句不区分大小写。
字段还可以进行算术运算。
select 字段1 * 12;
也可以给查询结果的列重命名
select sal *12 as yearsal from emp;
这里sal指薪水,yearsal是重新命名的名字。
如果要写中文则需要加 ‘’ 好。
select sal*12 as '薪水' from emp;
这里的as
关键字可以省略。
select * from emp;
查询所有语句。(实际开发中,不介意写*,效率低)
b.条件查询
语法格式:
select
字段,字段...
from
表名
where
条件;
执行顺序:from,where,select
查询工资为5000的员工姓名?
select ename from emp where sal = 5000;
查询工资大于等于5000并且小于等于50000的员工姓名?
select ename from emp where sal >= 2000 and sal<=5000;
或者
select ename from emp where sal between 2000 and 5000;
between and还可以用在字符串方面
select ename from emp where ename between ‘a’ and 'c';
首字母在a~c的名字查询。
c.查找为空
is null
null在数据库中不是一个值而是为空
select ename from emp where sal is null;
is not null
则就是找不为null的元组。
or
select ename from emp where comm is null or sal = 0;
and优先级大于or的优先级
in等同于or:select ename ,job from emp from where job in('SALESMAN','MANGER');
同样也有not in;
d.模糊查询like ?
找出名字当中含有O的?
(在模糊查询中,必须掌握两个特殊的符号,一个是%,一个是_)%代表任意多个字符
select ename from emp where ename like '%O%';
找出名字中第二个字母是A的?
select ename from emp where ename like '_A%;
找出,名字中有下划线?
select ename from emp where ename like '%\_%'
使用转义字符\
。
b.排序(升序、降序)
按照工资升序,找出员工名和薪资?
select
ename,sal
from
emp
order by
sal;
注意:默认是升序。通过asc表示升序,desc表示降序。
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;
降序
工资一样按照名字的升序排列。
select ename,sal from emp order by sal desc,ename asc
当sal相等时就会比较asc字段。
select ename ,sal from emp order by 1
按照第一列排序
order by是最后执行的。
e.分组函数?
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
以上五个都会自动忽略null值
记住:所有的分组函数都是对“某一组”数据进行操作。
例如:
找出工资总和:select sum (sal) from emp;
分组函数还另一个名字,多行处理函数。
会自动忽略掉NULL的数据。
注意:分组函数不能直接使用在where子句中。
count(*)与count(具体的某个字段) 的区别,第一个是指总字段条数,第二个则是不为null的字段数。
f .单行处理函数
输入一行处理一行。
只要数据中有个NULL进行参于了运算,其结果一定是NULL。
ifnull()空处理函数?
ifnull(可能为null的数据,就当做什么处理);属于单行处理函数。
例:
计算每个员工的年薪?(这里的comn代表补贴奖金)
select ename ,(ifnull(comn,0)+sal)*12 as yearsal from emp;
g.group by 和 having
group by:按照某个字段或者某些字段进行分组。
having:having是对分组之后的数据进行再次过滤。
案例:找出某个工作岗位的最高薪资。
select max(sal) from emp group by job;
分组函数一般都会配合group by函数使用。任何一个分组函数都会在group by执行后执行。如果没有group by来限定,则会将整张表的数据分成一组,例如:select avg(sal) from emp;
这条语句没有写group by 来进行分组筛选,但实际上有个默认的group byselect avg(sal) from emp group by ...
这个默认的group by就是将整张表看做一组。
group by是在where后执行的。
分组函数则是在group后执行的。
案例:找出高于平均工资的员工。
select ename , sal from emp where (select avg(sal) from emp);
这里用了个子查询
当一条语句有group by,select后面只能添加分组函数和参加分组的字段,如果不这样的话,得到的东西毫无意义(oracle数据库则会直接报错)
多字段分组:
案例:找出每个部门不同工作岗位的最高薪资。
select deptno,job,max(sal) from emp group by deptno,job;
案例:找出每个部门的最高薪资,并且薪资大于2900。
select max(sal) deptno from emp group by depyno having max(sal) > 2900;
但这条语句效率低,可以使用where语句进行提前过滤。
select max(sal),deptno from emp where sal > 2900 group by deptno;
在进行分组之前就将条件不满足的过滤,提高效率,但是也有不得不使用having的情况,例如:
找出每个部门的平均薪资,要求薪资大于2000的数据。
select deptno,avg(sal) from emp group deptno having avg(sal) > 2000
总结一个完整的DQL语句怎么写:
select 5
...
from 1
...
where 2
...
group by 3
...
having 4
...
order by 6
...
这里的数据不能换,上面的数字代表着排序输出。