草庐IT

mysql中group by,having,order by,limit,distinct的用法和简单的的多表查询

小胖子学编程 2023-03-28 原文

分组查询:关键字group by的用法

group:组

by:通过

group by :通过....。
分组group by列名:通过指定列来分组

一般情况下在题目中出现 "每个" "各个" "不同的" 这一类词语时基本都会用到group by 分组关键字

语法: select 列名 from表名 group by列名;

多字段分组语法:select * from 表名 group by 列名1 ,列名2;

分组后的筛选 having的用法

功能:类似于where

注意: 不能代替where,位置不能再group by 前面。且having 后面可以跟列名

也可以跟聚合函数。

语法:select * from 表名 group by 列名 having 条件表达式;

1.查询各个部门员工平均工资大于2500的员工部门编号;

2.查询各个部门各个岗位的工资大于1500的员工;

3.查询部门编号30的各个岗位平均工资;

having 和 where的区别:

1.where 是对分组前的数据进行筛选;

2.having 是对分组后的数据进行筛选;

3.having 后面可以跟列名,函数;

4.where 不能对分组后的数据进行筛选;

5.where 后面不能跟函数;

排序关键字 order by :

注意:

1.mysql中查询结果是按升序排序;

2.查询时排序后如果要求升序或降序那么,需要将两种排序的关键字补充上;

3.方法一:升序排序关键字asc 用法 order by 列名 asc;

4.方法二:降序排序关键字desc 用法 order by 列名 desc;

5.多字段排序:order by 列名1 [asc]desc,列名2[asc] desc ------先按列1排序如果列1值相同则按列2排序;

1.查询工资大于2000的员工信息按工资降序排序;

select * from emp where sal>2000 order by sal desc;

2.查询每个岗位平均工资按岗位降序排序;

select job,avg(sal) from emp order by job desc;

3.查询每个部门平均工资按部门降序排序;

select deptno ,avg(sal) from emp group by deptno order by deptno desc;

4.查询部门10的员工信息按工资降序排序;

select * from emp where deptno=10 order by sal desc;

5.查询工资大于等于3000的员工信息按员工编号降序排序;

select * from emp where sal>=3000 order by empno desc;

6.查询各个部门的员工的姓名并按部门编号降序排序;

select deptno,ename from emp order by deptno desc;

7.查询emp表,输出每个部门的各个职位的平均工资,并按部门编号升序、平均工资降序排序。

select deptno,job,avg(sal) from emp group by deptno,job order by deptno asc,avg(sal) desc;

查询关键字limit的用法

limit一般是用在order by后面

limit又有限制的意思,我们可以抽象的理解为截取

limit m,n------意思是从m+1条开始,连续取n条数据

例如: select * from emp order by sal lirmit 0,3;

意思是:查询emp,表员工所有信息按工资升序排序,只显工资的1-3位;

1.查询工资第五高的人信息;

select ename ,sal from emp order by sal desc limit 4,1;

2.查询工资倒数第三的人信息;

select ename ,sal from emp order by sal asc limit 2,1;

模糊匹配:关键字like

like: 像......

模糊匹配支持两种字符匹配符号

第一种:% 匹配任意个字符;

第二种:_ 匹配一个任意字符;

用法:一般是用在where 条件表达式中;

例如:查询名字中含R的员工姓名和工资;

select ename ,sal from emp where ename like'%R%';

例如:查询名字是四个字符的员工姓名和工资;

select ename,sal from emp where ename like"____";

去重: 关键字distinct

作用:就是将查询出来的列值相同的进行去重

例如:查询有多少个领导;

select count(distinct mgr) from emp;

多表查询

说明:多表查询就是根据查询需要的数据,但是数据部分在不同的表中,查询的时候需要多个表来获取数据。

查询步骤:

第一步:需要先分析即将查询的数据和给出的条件分别属于哪些表;
第二步:根据表中的列,来分析表与表之间的联系有哪些
直接关系:两张表之间有相同的列
间接关系:两张表之间没有相同的列,但是可以通过其他表建立联系;
第三步:mysql语句的编写
语法:

select 别名1.列名1,别名2.列名2

from 表名1 as 别名1, 表名2 as 别名2

where 别名1.相同列=别名2.相同列

and 其他条件语句;

语句一共有四个部分:

第一部分是确定要查询显示的列

第二部分是确定数据来源于哪些表

第三部分是建立两张表的关系,一般用的是两张表相同列名的列

第四部分阐述题目中的其他条件

  1. 查询部门编号10上班的员工姓名,城市,部门编号;

​ select ename,loc,e.deptno

​ from emp e,dept d

​ where e.deptno=d.deptno and e.deptno=10;

  1. 查询在NEW YORK 上班的员工工号和员工姓名和员工工资和部门名字;
    select e.empno,ename,sal,d.dname -- 查询的列
    from emp e,dept d -- 查询的数据源
    where -- 条件关键字
    e.deptno=d.deptno -- 建立连接
    and d.loc='NEW YORK'; -- 筛选条件

  2. 查询芝加哥员工的平均工资
    select d.loc '城市',round(avg(sal),2)'平均工资'
    from emp e,dept d
    where
    e.deptno=d.deptno
    and
    d.loc='CHICAGO';

4.查询research部门有多少员工;

  1. 第一种方式(不存在重名时可以用这种方法)
    select d.dname '部门',count(e.ename) '员工'
    from emp e,dept d
    where
    e.deptno=d.deptno and d.dname='RESEARCH';

  2. 第二种方式(防止有重名的因素干扰)
    select dname'部门',count(empno)'员工' from emp e ,dept d
    where
    e.deptno=d.deptno and dname='RESEARCH';

  3. 查询在dallas和new york上班有多少人

select count(empno) -- 查询的列

from emp e,dept d --查询的数据来源

where

e.deptno=d.deptno --建立表之间的联系

and (loc='DALLAS' or loc='NEW YORK');--题目中的筛选条件

4.查询sales部门的最低工资的员工姓名和工号
---第一种子查询方式
select ename ,empno from emp e,dept d

where e.deptno=d.deptno and dname='SALES' and sal=(select min(sal) from emp e ,dept d where e.deptno=d.deptno and dname='SALES');
---第二种截取方式
select ename ,empno from emp e,dept d

where e.deptno=d.deptno and dname='SALES' order by sal limit 1;

-- 查询每年要给RESEARCH部门划多少工资钱

select sum(sal*12) from emp e,dept d

where e.deptno=d.deptno

and dname='RESEARCH';

-- 查询ACCOUNTING部门员工的平均工资

select d.deptno,avg(sal) from emp e,dept d

where e.deptno=d.deptno

and dname='ACCOUNTING' group by deptno;

有关mysql中group by,having,order by,limit,distinct的用法和简单的的多表查询的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  3. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  4. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  7. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  8. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  9. Qt Designer的简单使用 - 2

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q

  10. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

随机推荐