数据库
-
show databases 查看一共有几个表
-
creat database 表明:创建一个表
-
select * form 表名:查询表中的数据
-
不看表中的数据,只看表中的结构用:desc 表名;
-
查看mysql的版本号 select version();
-
查看当前用的哪个数据库:select database;
-
\c用来终止一个语句的输入
简单查询
-
查询一个字段
-
select 字段名 from 表名; 其中select 和from 是关键字
-
sql语句不用区分大小写
-
-
查询两个或者多个字段
-
select 字段名,字段名 from 表名;用,号隔开
-
-
查询所有字段
-
select * from 表名(这种方式效率低,因为要先转换成字段)
-
或者select 字段名,字段名.... from 表名;用,号隔开
-
-
将dept表中显示出来的dname,改成deptname
-
select dname as deptname from dept;
-
注意select 永远不会进行修改的,只是将显示出来的dname改成了deptname,所以原列表还是dname;
-
如果起别名的时候别名有空格,那么要将别名用"" 或''括起来(单引号是标准的)
-
-
查询 emp员工表,员工的年薪
-
select ename,sal * 12 as years from emp; 可以得到,支持使用运算表达式
-
如果想把years改成年薪,那么要给年薪加上单引号
-
select ename,sal * 12 as '年薪 'from emp;
-
条件查询
-
将符合条件的数据查询出来语法格式为:
-
select
字段1,字段2,字段3...
from
表名
where
条件;
-
-
数据库中的条件
大于> 小于< 等于= 不等于!= 和<>
大于等于>= 小于等于<= 两个值之间 between .. and ..或者>= ..and <=..使用betwee and的时候必须遵守左小右大
is null 等于空(is not null不等于空)不能用=null 等于='' (后面跟的东西要加单引号) 或者用or 和用and
注意! and的优先级比 or高
-
如果要找一个工资大于2500,并且 办公室为10或者20的人语句应该是:
-
select empno,ename from emp where sal>2500(class = 10 or class = 20);
-
in() 相当于多个or ()里面加条件的值,他并不是一个区间
比如查找工资为2500 和800的人的值
select empno,ename from emp where sal in(2500,800);
-
比如查找工资为2500 和800和2450的人的值
-
select empno,ename from emp where sal in(5000,800,2450);
-
not in() 不在这些值的数据 比如
-
查找工资不为2500 和800和2450的人的值
-
select empno,ename from emp where sal not in(2450,500,800.2500);
注意!between and 是一个区间,而且必须是前面小后面大
in()不是一个区间
总结not : 主要用在is或者in
-
is null
-
is not null
-
in
-
not in
-
模糊查询
-
like
-
支持%或下划线匹配
-
%匹配任意多个字符
-
下划线:任意一个字符
-
%和下划线都是一个特殊的符号
-
比如找出一个名字带有o的?
select empno,ename from emp where ename like '%o%';
-
找出名字是以o结尾的
select empno,ename from emp where ename like '%o';
-
找出名字是o开头的
select empno,ename from emp where ename like 'o%';
-
找出第三个字母是r的名字
select empno,ename from emp where ename like '__r%';(两个下划线)
-
-
如果一个人的名字里面带有_这种东西字查询的时候应该先转义字符,比如要查询一个带有 _ 的名字
select empno,ename from emp where ename like '%_%';注意加了一个\这就是转义字符
-
查询员工所有的薪资,并且按照升序排列(默认的是升序,也可以加asc指定升序)
select ename,sal from emp order by sal;
-
降序排列呢,在末尾价格desc
select ename,sal from emp order by sal desc;
-
查询员工的工资,按照升序排列,如果工资一样按照员工名字首字母的 升序排列
select ename,sal from emp order by sal asc , ename asc;(中间用,隔开)
-
查询工资在1250到3000之间的员工,并且按照工资降序排列
select ename,sal from emp where sal between 1250 and 3000 order by sal desc;
数据处理函数
-
数据处理函数又被称为单行处理函数特点是:一个输入对应一个输出
-
和单行处理函数相对的是:多行处理函数(对行处理函数特点:多个输入对应一个输出)
-
常见的单行处理函数有哪些
-
lower():转换成小写
比如将ename的名字全部转换成小写
select lower(ename) from emp;(多少个输入就有多少个输出)
-
upper():转换成大写 (其他同上)
-
substr 取子串 格式为substr(被截取的字符串 , 起始下标,长度)
截取表中第一个字母为A的人的名字
-
第一种方式
select ename from emp where substr(ename,1,1) = 'K';
-
第二种方式
select ename from emp where ename like 'K';
-
-
contant(字符串1,字符串2)字符串拼接
-
获取length 长度
select length(ename) enamelength from emp;
+-------------+ | enamelength | +-------------+ | 5 | | 5 | | 4 | | 5 | | 6 | | 5 | | 5 | | 5 | | 4 | | 6 | | 5 | | 5 | | 4 | | 6 | +-------------+
-
trim去掉空格
比如我在输入的时候给名字加了空格
select * from emp where ename = ' King';
这样输出不了 用trim取空格
select * from emp where ename = trim(' King');
-
round 四舍五入 , select后面要么跟字段,要么跟字面值
-
mysql> select 1000 from emp; +------+ | 1000 | //这个1000只是个名字 +------+ | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | +------+
为什么会有14个1000呢,因为我们创建的emp表有14个数据
用round(数,保留位置)0是整数位,1是小数点后一位
select round(3.1415926, 0);
+---------------------+ | round(3.1415926, 0) | +---------------------+ | 3 | +---------------------+
当保留位置是-1的时候四舍五入的就是个数为比如
select round(333.333,-1); 如果是-2那就是十位
+-------------------+ | round(333.333,-1) | +-------------------+ | 330 | +-------------------+
-
rand()*一个数: 其中这个数如果输入100 就是生产一个100以内的随机数,同理20的话就生成20以内的随机数
select round(rand()*5,0) 这个加了round 方法,生产的随机数都会变成整数
-
在数据库中,只要有null参与的数学运算,最终结果就是null
-
+--------+-----------+ | ename | allmonkey | +--------+-----------+ | SMITH | NULL | | ALLEN | 1900.00 | | WARD | 1750.00 | | JONES | NULL | | MARTIN | 2650.00 | | BLAKE | NULL | | CLARK | NULL | | SCOTT | NULL | | KING | NULL | | TURNER | 1500.00 | | ADAMS | NULL | | JAMES | NULL | | FORD | NULL | | MILLER | NULL | +--------+-----------+
if null ,当某个数据为null是把ifnull加上去就不会出现上述情况
select ename,(sal + ifnull(comm,0))*12 from emp;
ename | (sal + ifnull(comm,0))*12 | +--------+---------------------------+ | SMITH | 9600.00 | | ALLEN | 22800.00 | | WARD | 21000.00 | | JONES | 35700.00 | | MARTIN | 31800.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 |
-
其中ifnull(为null的值,0)为什么是0呢 意思是这个是null的值,我们把它当成0看待,如果协议那么我们 就把他当成1看待
case .. when ... then...when ..then..else end
当员工的职位是manager时工资上涨10%,是salsman时上涨50%
-
-
select ename,job,(case job when 'manager' then sal1.1 when 'salesman' then sal1.5 else sal end) as result from emp;
总结 数据处理函数(单行处理函数一共是哪些):
-
rand()*x;生成随机数,x是你输入的数字如果是5就生成5以内的随机数
-
case .. when ... then...when ..then..else end: 如果怎么 就怎么
-
ifnull(为null的值,0)将为null的值看成是0这样结果就不会是null
-
lowr()转换成小写
-
upper()转换成大写
-
substr(被截取的字符串 , 起始下标,长度)
-
contant(字符串1,字符串2)字符串拼接
-
trim去掉空格
比如我在输入的时候给名字加了空格
select * from emp where ename = ' King';
这样输出不了 用trim取空格
分组函数(多行处理函数)
-
多行处理函数的特点:输入多行,最终输出一行
5个:
count 计数
sum 求和
avg 平均数
max 最大值
min 最小值
-
比如求工资最多的名字
select max(sal) from emp;
-
求工资最少的
select min(sal) from emp;
-
求工资的总和
select sum(sal) from emp;
-
求工资的平均数
select avg(sal) from emp;
-
计算公司有多少人
select count(ename) from emp;count表示的是该字段下所有不为空的元素的个数
-
分组函数自动忽略null
-
count(*)from emp表示计算这张章一共有多少行
-
count(comm)from emp;表示这张表comm字段下这一列的不为null的个数总数
-
分组函数不能使用在where 后面
分组查询
-
关键字执行的顺序
select ...
from...
where...
group by...
order by...
以上关键字的执行顺序为
-
from
-
where
-
group by
-
select
-
order by
-
-
分组函数执行之前必须先分组所以分组函数不能出现在where后面
-
但是为什么selec 后面可以出现 sun(sal)这个分组函数呢,因为如果没有分组,那么系统默认整个表为一个组,也就是说已经分组了,只是group by 没有写,所以在执行select的时候其实分组已经完成了,素以可以
-
按照职位分组,打印出每个职位的工资总数
select job,sum(sal) from emp group by job;
+-----------+----------+ | job | sum(sal) | +-----------+----------+ | ANALYST | 6000.00 | | CLERK | 4150.00 | | MANAGER | 8275.00 | | PRESIDENT | 5000.00 | | SALESMAN | 5600.00 | +-----------+----------+
结论:在一条select语句当作,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不能跟
比如select ename,obj,sum(sal)from emp group by obj 这就是没有意义的 ename 不能出现在这里
-
-
找出每个部门,不同工作岗位的最高工资
select deptno,job,max(sal) from emp group by deptno,job;
注意group by 分了两次组,用,隔开
-
找出每个部门工资大于3000的
这种方式是选选出工资小于3000的在分组
select deptno,max(sal) from emp where sal>3000 group by deptno;
也可以先分组在用having筛选sal》3000的
select deptno,max(sal) from emp group by deptno having max(sal)>3000;
where和having 优先选择where
-
找出每个部门平均工资,并且显示出平均工资高于2500
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
不能使用where 不然分组函数出现在了where后面会报错
select deptno,avg(sal) from emp where avr(sal)>2500 group by deptno ;
大总结
单表查询关键字有:
select ...
from ...
where...
group by ...
having ...
order by ....
以上关键字的执行顺序是
from
where
group by
having
select
order by
作业:
找出每个岗位的平均工资,要求显示平均工资不高于1500的岗位,除了manager之外
select job,avg(sal) from emp where job != 'manager' group by job having avg(sal)>1500
也可以采用job not like 'manager'
select job,avg(sal) from emp where job not like 'manager' group by job having avg(sal)>1500