mysql

mysql


行(row):被称为数据/记录

列(column):被称为字段

mysql语句分类


DQL:数据查询语句(select 查)

DML:数据操作语句(insert 增 delete 删 update 改)(表数据)

DDL:数据定义语句(create:新建,增drop:删alter:修改)(表结构)

TCL:事务控制语句(事务提交:commit事务回滚:rollback)

DCL:数据控制语句(授权 grant 撤销授权 revoke)


1.简单查询

1.1查询一个字段

select 字段名 form 表名;

注意:

select和form都是关键字,字段名和表名都是标识符。

1.2查询两个或多个字段

用逗号隔开

eg:select depeon,dname from dept;

1.3查询所有字段

1.将字段都写上

2.使用*(效率低,不建议)

select * from dept;

1.4给查询列起别名

只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname

as关键字可省略,别名是中文用单引号括起来

在所有的数据库中,字符串统一用单引号括起来,双引号在oracle中不可用

字段可以使用数学表达式(+,-,*,/)

2.条件查询

select

字段一,字段二,字段三······

from

表名

where

条件;

2.1都有哪些条件

=

等于

!=或<>

不等于

<

小于

<=

小于等于

>

大于

>=

大于等于

between (小值) and (大值),两个值之间,等同于">= and<="

is null为null(is not null为不为空)

and 并且

eg:查询工作岗位是MANAGER并且工资大于2500的员工信息;

select empno,ename,job,sal

from emp

where job='MANAGER' and sal>2500;

or 或者

eg:查询工作岗位是MANAGER和SALESMAN的员工

select empno,ename,job

from emp

where job='MANAGER' or job='SALESMAN';

and优先级比or高

where sal>2500 and deptno=10 ordeptno=20;

where sal>2500 and (deptno=10 ordeptno=20);

in 包含,相当于多个or(not in表示不在这个范围)

where job='MANAGER' or job='SALESMAN'等价于

where job in('MANAGER', 'SALESMAN')

in不是一个区间。in后面跟的是具体的值

like 模糊查询,支持%或下划线匹配

%匹配任意多个字符

下划线:匹配任意一个字符

(%是一个特殊的符号,_也是一个特殊的符号)

eg:找出名字中含有o的?

select ename from emp where ename like '%o%';

找出名字以t结尾的?

select ename from emp where ename like '%t';

找出第三个字母是r的?

select ename from emp where ename like '__r%';

找出名字中有下划线的?

select ename from emp where ename like '%\_%';

3.排序

3.1查询所有员工薪资,排序?

select ename,sal

from emp

order by sal; //默认升序

3.2怎么降序

select ename,sal

from emp

order by sal desc; //指定降序

select ename,sal

from emp

order by sal asc; //指定升序

3.3按照多个字段排序

查询员工名字和薪资,要求按照薪资升序,如薪资相同,按名字升序排列

select ename,sal

from emp

order by sal asc,ename asc;//sal在前,起主导,只有sal相等时,才会考虑启用ename排序

3.4了解:根据字段的位置也可以排序

select ename,sal

from emp

order by 2;//2表示第二列,第二列是sal

开发中不建议,因为不健壮,列顺序任意发生改变。

3.5综合一点的案例

找出工资在1250到3000之间的员工信息,要求按薪资降序排列

select ename,sal

from emp

where sal between 1250 and 3000

order by sal desc;

关键字顺序不能变

第一步:from

第二步:where

第三步:select

第四步:order by (排序总是在最后执行)

4.数据处理函数

又被称为单行处理函数

特点:一个输入对应一个输出。

4.1单行处理函数常见有哪些

lower 转换小写

select lower(ename) from emp;

upper 转换大写

select upper(name) from t_student;

substr 取子串(substr(被截取的子串,起始下标,截取的长度))

select substr(ename,1,1) as ename from emp;

起始下标从1开始,没有0

concat 函数进行字符串拼接

select concat(sal,ename) from emp;

length 取长度

select length(ename) enamelength from emp;

trim 去空格

select * from emp where ename=' king';//表中有king,代码多写了空格,错误

select * from emp where ename=trim(' king');//正确

str_to_date

round()四舍五入

select 字段 from 表名;

select round(数值,保留位数) form emp;

rand()生成随机数

round(rand()*100,0)//100以内的随机数

ifnull把null转换成一个具体数

ifnull(数据,被当做哪个值)

在所有数据库中,只要null参与的数据运算,值都是null。

计算每个员工的年薪

年薪=(月薪+月补助)*12

select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;

case··when··then··when··then··else··end相当于if else

当员工的工作岗位为MANAGER时,工资上调10%,是SALESMAN,工资上调50%(不修改数据库,之上将查询结果显示为工资上调)

select ename,job,sal as oldsal,(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal

form emp;

5.分组函数(多行处理函数)

特点:输入多行,最终输出一行。

注意:必须先分组,在使用。如果未对数据进行分组,整张表默认为一组

count()数量总和

sum()总和

avg()平均值

max()最大值

min()最小值

5.1注意

1.分组函数自动忽略null,不需要对null进行处理。

2.count(*):统计表中行数的总和(含null)

count(具体字段):代表不为null的元素的总和

3.分组函数不能直接使用在where子句中。

原因:where执行时未分组,

4.所有的分组函数可以组合一起用。

6.分组查询*

6.1什么是分组查询

select

fom

group by

6.2执行顺序

写法

select

from

where

group by

order by

顺序不能颠倒

执行顺序

1.from

2.where

3.group by

4.select

5.order by

6.3找出每个工作岗位的工资和?

select job,sum(sal)

form emp

group by job;

在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数。其他一律不能跟。

6.4找出每个部门,不同工作岗位的最高薪资?

技巧:两个字段联合成一个字段看。

select job,deptno,max(sal)

from emp

group by deptno,job;

6.5having语句

使用having可以对分完组之后的数据进行过滤。

having不能单独使用,不能代替where,having必须和group by联合使用

找出每个部门最高薪资,要求只显示最高薪资大于3000的?

select deptno,max(sal)

from emp

group by deptno

having max(sal)>3000;

以上sql语句执行效率比较低,可以考虑先将大于3000的都找出来,然后再分组。

select deptno,max(sal)

from emp

where sal>3000

group by deptno;

优化策略:优先选择where,where实在完不了了,使用having。

6.6where解决不了的

找出每个部门平均薪资,要求显示“平均薪资”高于2500的。

select deptno,avg(sal)

from emp

group by deptno

having avg(sal)>2500;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中前晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值