mysql基础–查询语句select使用

mysql基础–查询语句select使用

1.查询不重复记录

select distinct deptno from emp;

2.条件查询

select * from where deptno=1;

select * from where deptno=1 and sal<2000;

3.排序和限制

1>常用取出按照某个字段进行排序后的记录结果,用关键字order by.

desc 降序,asc 升序,默认是升序

select * from emp order by sal;

select * from emp order by sal desc;

2>对于排序后相同的字段进行再次排序

select * from emp order by sal, deptno desc;

3>对于排序后的记录只显示一部分使用limit

select * from tbname……[limit 偏移量,记录行数]

例子:
select * from emp order by sal limit 3;
select * from emp order by sal limit 2,3;从第三条开始

备注:
默认起始偏移量为0,只写记录行数就行

4.聚合

聚合一般用于数据统计

语法:
select [field1,field2…]fun_name

from tbname

[where where_conditon]

[group by field1,field2…[with rollup]]

[having where_condition]

参数说明:

fun_name 表示要做的聚合操作,也就是聚合函数,常用的有sum(求和)\count(*)(记录数)\max(最大值)\min(最小值).

group by 关键字表示和聚合的字段,比如按照部门分类统计员工数量,group by后就写部门

with rollup 表示对分类聚合后的结果进行再汇总,记录是上面所有记录的总和。

having 表示对分类后的结果进行条件过滤

备注:

having对聚合后的结果进行过滤,where是在聚合前先进行过滤

有必要的话可以先where后进行聚合操作可以提高效率

例子:

1>统计公司中的总人数

select count(1) as c from emp;

2>统计各个部门的人数

select deptno,count(1) from emp group by deptno;

3>既要统计各部门人数,又要统计总人数

select deptno,count(1) from emp group by deptno with rollup;

4>统计人数大于1的部门

select deptno,count(1) from emp group by deptno having count(1)>1;

5>统计公司所有员工的薪水总额\最高和最低

select sum(sal),max(sal),min(sal) from emp;

6>寻找雇员工数超过两个的部门的最高薪水和最低薪水

select bumen,max(xinshui),min(xinshui) from yuangong
group by bumen

having count(*)>2 //count(表示汇总后各部门的人数–总记录数,因为count()条件在having后)
order by bumen;

7>寻找雇员平均工资大于3000的部门的最高和最低薪水

select bumen,max(xinshui),min(xinshui) from yuangong
group by bumen
having avg(xinshui)>3000
order by bumen;

8>使用GROUP_CONCAT()函数可以很好的把分组情况表示出来。

例子:
显示所有部门员工的名字,按部门分组显示

select bumen,group_concat(name) form yuangong group by bumen;

9>各部门的男女的数量

select bumen,sex,count(*) from yuangogn group by bumen,sex;

10>各部门的年龄大于25的男女数量

select bumen,sex,count(*) from yuangong where age>25 group by bumen,sex;

11>年龄大于25,各部门的男女的数量总和大于10 的男女数量

select bumen,sex,count() from yuangong where age>25 group by bumen,sex having sum()>10;

12>求每个部门的平均薪资

select user_id,round(avg(ifnull(sc_id,0)),2) as avg from sc group by user_id;

5.表连接

内连接: 只连接匹配的行
左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
交叉连接: 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配

效率问题:
1.inner join比left join快
注:inner join 内连接等价于下面的sql: SELECT A.name, B.address FROM A, B WHERE A.id = B.A_id所以一般要用一般的连接就可以了.
2.连接字段建索引

1>内连接:仅选出两张表互相匹配的记录,A,B表中至少有1个匹配时,才返回行。两表的交集

例子:

如果两张表中对应的字段一定有对应使用内连接

select ename,deptname from emp,dept where emp.deptno=dept.deptno;

select A.name,B.address from A inner join B on A.id = B.A_id


2>左连接:包含所有左边表中的记录甚至是右边表中没有和它匹配的记录

select ename,deptname from emp left join dept on emp.deptno=dept.deptno;


3>右连接:包含所有的右边表中的记录甚至是左边表中没有和他匹配的记录,和左连接类似可以互相转化

select ename,deptname from dept right join emp on emp.deptno=dept.deptno;

备注:

链接都是以on作为条件的

6.子查询

某些情况下需要查询的时候,需要的条件是另一个select语句的结果,这时候用子查询.

用于子查询的关键字包括(in|not in|=|!=|exists|not exists)等.

例子:

1>in 条件记录为多个

select * from emp where deptno in(select deptno from dept)

2.= 条件记录为1

select * from emp where deptno=(select deptno from dept where id=1);

备注:

某些情况下表连接可以替代子查询用于优化

7.记录联合

有时候需要将两张表的记录查询出来之后合并到一起显示

union 合并到一起并且进行一次distinct去重

union all 合并到一起显示

select deptno from emp

union

select deptno from dept;

8.子查询和表连接还有汇总可以一起使用

例子:

SELECT Sub1.login AS User_name, Sub1.article AS Activity, Sub1.p_article AS Activity id, Sub1.tottime AS Totaltime(worker), Sub2.tottime AS Totaltime(company)

FROM (SELECT u.login,a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime

FROM pos p

INNER JOIN users u ON u.login = p.p_login

INNER JOIN articles a ON p.p_article = a.id

WHERE REPLACE( u.login, ‘.’, ‘_’ ) = ‘users_name’

AND p.p_datum >= ‘2013-04-09’

AND p.p_datum <= ‘2013-04-16’

GROUP BY a.article) Sub1

INNER JOIN

(SELECT a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime

FROM pos p

INNER JOIN articles a ON p.p_article = a.id

WHERE p.p_datum >= ‘2013-04-09’

AND p.p_datum <= ‘2013-04-16’

GROUP BY a.article) Sub2

ON Sub1.p_article = Sub2.p_article;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值