RDIFramework.NET » ORACLE http://blog.rdiframework.net  ——  专注、交流、分享、成长 Fri, 20 Apr 2018 09:38:35 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.2.20 【干货】再上数据分页控件 ━ 更加灵活,更加实用-提供源码 http://blog.rdiframework.net/97.html http://blog.rdiframework.net/97.html#comments Tue, 06 Jan 2015 17:50:00 +0000 http://blog.scbz.org/index.php/archives/97 再上数据分页控件-更加灵活,更加实用 

  关于数据分页的文章太多了,各有各的一套方案,但大多都很类似,要么使用存储过程,要么直接使用代码进行分页。各种方案分页的效率也不尽相同,我们不一定要找一个最高效的(根据实际的项目情况),找一个最合适的就OK了。下面我要谈的分页控件非常灵活,可以支持任意类型的数据库,同时可以支持存储过程或代码分页(会自动判断),也支持多表的分页,非常的方便。对于数据分页的相关文章,在我的博客中可以找到很多,下面我做一个简单的汇总,方便大家查阅。 

1、 原创企业级控件库之大数据量分页控件

2、 再上数据分页控件(不用存储过程)

3、 RDIFramework.NET 中多表关联查询分页实例

  下面要给大家分享的分页控件只做分页的处理,不做与数据库相关的操作。直接提供分页的数据给分页控件即可。它不关心你的数据来源是什么,也不关心你采用的数据分页的方式(存储过程或代码等)。这个分页控件我取名为:UcPagerEx,如下图所示:

 

  实现分页控件的代码非常的简单,下面直接给出全部源码,大家可以参考下,整个分页控件的源码如下:

  1 using System;
  2 using System.ComponentModel;
  3 using System.Windows.Forms;
  4 namespace RDIFramework.Controls
  5 {
  6     public delegate void PageChangedEventHandler(object sender, EventArgs e);
  7     /// 
  8     /// 分页用户控件,仅提供分页信息显示及改变页码操作
  9     /// 
 10 public partial class UcPagerEx : UserControl
 11 {
 12         public event PageChangedEventHandler PageChanged;
 13         private int _pageSize;
 14         private int m_PageCount;
 15         private int _recordCount;
 16         private int _pageIndex;
 17 
 18 
 19         public UcPagerEx()
 20         {
 21             InitializeComponent();
 22             this._pageSize = 10;
 23             this._recordCount = 0;
 24             this._pageIndex = 1; //默认为第一页
 25         }
 26         ///  
 27         /// 带参数的构造函数
 28         /// 每页记录数
 29         /// 总记录数
 30         /// 
 31         public UcPagerEx(int recordCount, int pageSize)
 32         {
 33             InitializeComponent();
 34 
 35             this._pageSize = pageSize;
 36             this._recordCount = recordCount;
 37             this._pageIndex = 1; //默认为第一页
 38             this.InitPageInfo();
 39         }
 40         protected virtual void OnPageChanged(EventArgs e)
 41         {
 42             if (PageChanged != null)
 43             {
 44                 InitPageInfo();
 45                 PageChanged(this, e);
 46             }
 47         }
 48         [Description("设置或获取一页中显示的记录数目"), DefaultValue(20), Category("分页")]
 49         public int PageSize
 50         {
 51             set
 52             {
 53                 this._pageSize = value;
 54             }
 55             get
 56             {
 57                 return this._pageSize;
 58             }
 59         }
 60 
 61         [Description("获取记录总页数"), DefaultValue(0), Category("分页")]
 62         public int PageCount
 63         {
 64             get
 65             {
 66                 return this.m_PageCount;
 67             }
 68         }
 69 
 70         [Description("设置或获取记录总数"), Category("分页")]
 71         public int RecordCount
 72         {
 73             set
 74             {
 75                 this._recordCount = value;
 76             }
 77             get
 78             {
 79                 return this._recordCount;
 80             }
 81         }
 82 
 83         [Description("当前的页面索引, 开始为1"), DefaultValue(0), Category("分页")]
 84         [Browsable(false)]
 85         public int PageIndex
 86         {
 87             set
 88             {
 89                 this._pageIndex = value;
 90             }
 91             get
 92             {
 93                 return this._pageIndex;
 94             }
 95         }
 96 
 97         ///  
 98         /// 初始化分页信息
 99         /// 每页记录数
100         /// 总记录数
101         /// 
102         public void InitPageInfo(int recordCount, int pageSize)
103         {
104             this._recordCount = recordCount;
105             this._pageSize = pageSize;
106             this.InitPageInfo();
107         }
108 
109         ///  
110         /// 初始化分页信息
111         /// 总记录数
112         /// 
113         public void InitPageInfo(int recordCount)
114         {
115             this._recordCount = recordCount;
116             this.InitPageInfo();
117         }
118         ///  
119         /// 初始化分页信息
120         /// 
121         public void InitPageInfo()
122         {
123             if (this._pageSize < 1)
124                 this._pageSize = 10; //如果每页记录数不正确,即更改为10
125             if (this._recordCount < 0)
126                 this._recordCount = 0; //如果记录总数不正确,即更改为0
127 
128             //取得总页数
129             if (this._recordCount % this._pageSize == 0)
130             {
131                 this.m_PageCount = this._recordCount / this._pageSize;
132             }
133             else
134             {
135                 this.m_PageCount = this._recordCount / this._pageSize + 1;
136             }
137 
138             //设置当前页
139             if (this._pageIndex > this.m_PageCount)
140             {
141                 this._pageIndex = this.m_PageCount;
142             }
143             if (this._pageIndex < 1)
144             {
145                 this._pageIndex = 1;
146             }
147 
148             //设置上一页按钮的可用性
149             bool enable = (this.PageIndex > 1);
150             this.btnPrevious.Enabled = enable;
151 
152             //设置首页按钮的可用性
153             enable = (this.PageIndex > 1);
154             this.btnFirst.Enabled = enable;
155 
156             //设置下一页按钮的可用性
157             enable = (this.PageIndex < this.PageCount);
158             this.btnNext.Enabled = enable;
159 
160             //设置末页按钮的可用性
161             enable = (this.PageIndex < this.PageCount);
162             this.btnLast.Enabled = enable;
163             this.txtPageIndex.Text = this._pageIndex.ToString();
164             this.lblPageInfo.Text = string.Format("共 {0} 条记录,每页 {1} 条,共 {2} 页", this._recordCount, this._pageSize, this.m_PageCount);
165         }
166 
167         public void RefreshData(int page)
168         {
169             this._pageIndex = page;
170             EventArgs e = new EventArgs();
171             OnPageChanged(e);
172         }
173 
174         private void btnFirst_Click(object sender, System.EventArgs e)
175         {
176             this.RefreshData(1);
177         }
178 
179         private void btnPrevious_Click(object sender, System.EventArgs e)
180         {
181             if (this._pageIndex > 1)
182             {
183                 this.RefreshData(this._pageIndex - 1);
184             }
185             else
186             {
187                 this.RefreshData(1);
188             }
189         }
190         private void btnNext_Click(object sender, System.EventArgs e)
191         {
192             if (this._pageIndex < this.m_PageCount)
193             {
194                 this.RefreshData(this._pageIndex + 1);
195             }
196             else if (this.m_PageCount < 1)
197             {
198                 this.RefreshData(1);
199             }
200             else
201             {
202                 this.RefreshData(this.m_PageCount);
203             }
204         }
205 
206         private void btnLast_Click(object sender, System.EventArgs e)
207         {
208             this.RefreshData(this.m_PageCount > 0 ? this.m_PageCount : 1);
209         }
210 
211         private void txtPageIndex_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
212         {
213             if (e.KeyCode == Keys.Enter)
214             {
215                 int num;
216                 try
217                 {
218                     num = Convert.ToInt16(this.txtPageIndex.Text);
219                 }
220                 catch
221                 {
222                     num = 1;
223                 }
224 
225                 if (num > this.m_PageCount)
226                     num = this.m_PageCount;
227                 if (num < 1)
228                     num = 1;
229 
230                 this.RefreshData(num);
231             }
232         }
233     }
234 }

  代码基本没有什么难度,相信大家都能看得懂,那么如何使用这个控件呢?

  首先在生成的工具箱中拖动这个分页控件到界面上,再后再做数据绑定的代码即可。我直接展示一个已经做成的界面,如下图所示:

  上面就是分页的效果,如何实现的呢?下面给出实现代码。

  我们可以在Load事件中调用下面的Search()方法对数据进行绑定,如下代码所示:

 

 1 private void Search()
 2 {
 3     var recordCount = 0;            
 4     this.DTProductInfo = GetData(out recordCount, ucPager.PageIndex, ucPager.PageSize, this.searchValue);
 5     ucPager.RecordCount = recordCount;
 6     ucPager.InitPageInfo();
 7     // 加载绑定数据
 8     this.GetList();
 9 }
10 
11 private DataTable GetData(out int recordCount, int pageIndex, int pageSize,string search)
12 {
13     return new ProductInfoManager(dbProvider).GetDTByPage(out recordCount, pageIndex, pageSize, search,ProductInfoTable.FieldCreateOn + " DESC ");
14 }
15 
16 public override void GetList()
17 {
18     this.dgvProductInfo.AutoGenerateColumns = false;
19     if (this.DTProductInfo.Columns.Count > 0)
20     {
21         this.DTProductInfo.DefaultView.Sort = ProductInfoTable.FieldCreateOn;
22     }
23 
24     this.dgvProductInfo.DataSource = this.DTProductInfo.DefaultView;
25     this.SetControlState();
26 }

   同时需要对UcPagerEx的PageChanged事件做处理,以启用用户分页的需求,代码如下:

1 private void ucPager_PageChanged(object sender, EventArgs e)
2 {
3     var holdCursor = this.Cursor;
4     this.Cursor = Cursors.WaitCursor;
5     Search();
6     this.Cursor = holdCursor;
7 }

  附注:对于上面的“GetDTByPage”方法可以任意实现,可以调用存储过程,也可以使用代码进行分页。只要返回分页的数据即可。

  下面给出一些分页的效果,如下图所示:

 

 

转载请注明:RDIFramework.NET » 【干货】再上数据分页控件 ━ 更加灵活,更加实用-提供源码

]]>
http://blog.rdiframework.net/97.html/feed 0
【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)–系列文章导航 http://blog.rdiframework.net/157.html http://blog.rdiframework.net/157.html#comments Sun, 29 Jul 2012 17:28:00 +0000 http://blog.scbz.org/index.php/archives/157

ORACLE PL/SQL编程详解》 系列文章目录导航

——通过知识共享树立个人品牌。

        本是成书的,但后来做其他事了,就无偿的贡献出来,被读者夸其目前为止最实在、经典的写ORACLE PL/SQL编程的文章~!

       觉得对你有帮助,请留言猛点分享

[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

        本篇主要内容如下:第一章 PL/SQL 程序设计简介 1.1 SQL与PL/SQL 1.1.1 什么是PL/SQL? 1.2 PL/SQL的优点或特征 1.2.1 有利于客户/服务器环境应用的运行 1.2.2 适合于客户环境 1.2.3 过程化 1.2.4 模块化 1.2.5 运行错误的可处理性 1.2.6 提供大量内置程序包 1.3 PL/SQL 可用的SQL语句 1.4 运行PL/SQL程序 阅读全文

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

        本篇主要内容如下: 2.1 PL/SQL块 2.2 PL/SQL结构 2.3 标识符 2.4 PL/SQL 变量类型 2.4.1 变量类型 2.4.2 复合类型 2.4.2.1 记录类型 2.4.2.2 数组类型 2.4.2.3 使用%TYPE 2.4.3 使用%ROWTYPE 2.4.4 LOB类型 2.4.5 BIND 变量 2.4.6 PL/SQL 表(TABLE) 2.5 运算符和表达式(数据定义) 阅读全文

[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

本篇主要内容如下: 3.1 条件语句 3.2 CASE 表达式 3.3 循环 3.4 标号和GOTO 3.5 NULL 语句 介绍PL/SQL的流程控制语句, 包括如下三类: 控制语句: IF 语句循环语句: LOOP语句, EXIT语句顺序语句: GOTO语句, NULL语句 阅读全文

[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

        本篇主要内容如下: 4.1 游标概念 4.1.1 处理显式游标 4.1.2 处理隐式游标 4.1.3 关于 NO_DATA_FOUND 和 %NOTFOUND的区别 4.1.4 使用游标更新和删除数据 4.2 游标变量 4.2.1 声明游标变量 4.2.2 游标变量操作 阅读全文

[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

        本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发异常错误 5.2.2 在声明部分引发异常错误 5.3 异常错误处理编程 5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM异常处理函数 阅读全文

ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

        本篇主要内容如下: 6.1 引言 6.2 创建函数 6.3 存储过程 6.3.1 创建过程 6.3.2 调用存储过程 6.3.3 AUTHID 6.3.4 PRAGMA AUTONOMOUS_TRANSACTION 6.3.5 开发存储过程步骤 6.3.6 删除过程和函数 6.3.7 过程与函数的比较 阅读全文

[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

        在这篇中,我讲给大家讲解PL/SQL最引人注目的特色“ORACLE的程序包”,此篇文章花了我近两周的时间,今天终于出文了。有的地方可能还不全面,望大虾们多多指教!一定要推荐、推荐、推荐、推荐、推荐、推荐、推荐、推荐、推荐、推荐、评论与支持呀~! 本篇主要内容如下:第七章 程序包的创建和应用 7.1 程序包简介 7.2 程序包的定义 7.3 包的开发步骤 7.4 包定义的说明 7.5 子程序重载 7.6 加密实用程序 7.7 删除包 7.8 包的管理 阅读全文

ORACLE PL/SQL编程之八:把触发器说透

        8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.2.6 重新编译触发器 8.3 删除和使能触发器 8.4 触发器和数据字典 阅读全文

 

 欢迎加入数据库交流群(多位DBA阵容),群号:190401986 (注:博客园邀请进入)

 

 

转载请注明:RDIFramework.NET » 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)–系列文章导航

]]>
http://blog.rdiframework.net/157.html/feed 3
[推荐推荐][提供下载]ORACLE SQL:经典查询练手系列文章收尾(目录篇) http://blog.rdiframework.net/250.html http://blog.rdiframework.net/250.html#comments Tue, 28 Jun 2011 16:56:00 +0000 http://blog.scbz.org/index.php/archives/250  

[推荐推荐][提供下载]ORACLE SQL

经典查询练手系列文章收尾(目录篇)

——通过知识共享树立个人品牌。

 

通过近一个月的努力,《经典查询练手系列》也快告一段落,但并不代表结束,以后还会增加!我很荣幸本系列每一篇文章都上了评论或推荐头条,这离不开大家的支持,这也促蹴了我写博文的动力,在此真心的感谢大家!

在每一篇文章开始前,我都在想如何才能写得更好,才能让需要的人看了后有所收获,以至让我在写作上更严格的要求自己。当然,博客园中不乏高手如云,我写的东西也受到了某些人的批判,我不怪他们,相反,这更是我进步与努力的动力,说明我做得还不够好,还需更加努力,在此对反对与批判我的人表示忠心的感谢!

每一篇文章都是作者的辛勤与汗水,很多朋友经常问我,写博客有什么意义,又没人发工资,又花费无比多的时间。我也说不清楚,只觉得我的文章会有很多人看,能给需要的人带来帮助,我就感觉很欣慰,当一个求知者叫你一声老师的时候,你写作的意义已经体现。

 


 

经典查询练手暂时发布五篇,欢迎大家继续补充!

所有文章链接地址如下(后附电子版与建库脚本下载):

 

[推荐]ORACLE SQL:经典查询练手第一篇

[推荐]ORACLE SQL:经典查询练手第二篇

[推荐]ORACLE SQL经典查询练手第三篇

[推荐]ORACLE SQL经典查询练手第四篇

[推荐]ORACLE SQL:经典查询练手第五篇


 

申明

 各位博友或网友:下载前请先推荐与评论下,这样我才有动力写下面的文章呀,谢谢! 

电子版下载地址(下载前请先评论与推荐,仅几秒时间,尊重作者的辛勤劳动,感谢!):

ORACLE SQL:经典查询练手系列文章汇总

建库脚本与测试数据 


   QQ 群交流:190401986(专注数据库DB、欢 迎加入)

转载请注明:RDIFramework.NET » [推荐推荐][提供下载]ORACLE SQL:经典查询练手系列文章收尾(目录篇)

]]>
http://blog.rdiframework.net/250.html/feed 0
[推荐]ORACLE SQL:经典查询练手第三篇(不懂装懂,永世饭桶!) http://blog.rdiframework.net/552.html http://blog.rdiframework.net/552.html#comments Tue, 28 Jun 2011 06:01:00 +0000 http://blog.rdiframework.net/?p=552 [推荐]ORACLE SQL经典查询练手第三篇(不懂装懂,永世饭桶!)

 本文与大家共同讨论与分享ORACLE SQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来。在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出。交流与分享才能共同进步嘛,感谢!

 接上两篇:

[推荐]ORACLE SQL:经典查询练手第一篇

[推荐]ORACLE SQL:经典查询练手第二篇

        本篇相对上两篇来说难度有所增加,继续努力,通过我为大家设立的这个系列,只要你对每一篇,每一个试题都实践测试,认真练习。我相信你对常用、经典的SQL已能熟能生巧,信手拈来!

本文使用ORACLE自带的人力资源(HR)实例数据,本文所用表结构如下:

HR.EMPLOYEES员工表结构如下:

HR.DEPARTMENTS表结构如下:

HR.REGIONS表结构如下:

SQL> DESC HR.REGIONS;
Name        Type         Nullable Default Comments
———– ———— ——– ——- ——–
REGION_ID   NUMBER
REGION_NAME VARCHAR2(25) Y

 

用SQL完成以下问题列表:

1. 让SELECT TO_CHAR(SALARY,’L99,999.99′) FROMEMPLOYEES WHEREROWNUM < 5 输出结果的货币单位是¥和$。

2. 列出前五位每个员工的名字,工资、涨薪后的的工资(涨幅为8%),以“元”为单位进行四舍五入。

3. 找出谁是最高领导,将名字按大写形式显示。

4. 找出First_Name 为David,Last_Name为Austin 的直接领导名字。

5. First_Name 为Alexander,Last_Name为Hunold领导谁。(谁向David 报告)。

6. 哪些员工的工资高于他直接上司的工资,列出员工的名字和工资,上司的名字和工资。

7. 哪些员工和Chen(LAST_NAME)同部门。

8. 哪些员工跟De Haan(LAST_NAME)做一样职位。

9. 哪些员工跟Hall(LAST_NAME)不在同一个部门。

10. 哪些员工跟William(FIRST_NAME)、Smith(LAST_NAME)做不一样的职位。

11. 显示有提成的员工的信息:名字、提成、所在部门名称、所在地区的名称。

12. 显示Executive部门有哪些职位。

13. 整个公司中,最高工资和最低工资相差多少。

14. 提成大于0 的人数。

15. 显示整个公司的最高工资、最低工资、工资总和、平均工资保留到整数位。

16. 整个公司有多少个领导。

17. 列出在同一部门入职日期晚但工资高于其他同事的员工:名字、工资、入职日期。

 

各试题解答如下(欢迎大家指出不同的方法或建议!):

/*——–1、改变NLS_LANG 的值,让SELECT TO_CHAR(SALARY,’L99,999.99′) FROM HR.EMPLOYEES WHERE ROWNUM < 5 输出结果的货币单位是¥和$。———*/
—–在没有设置NLS_LANG的情况下:

SQL> SELECT TO_CHAR(SALARY,’L99,999.99′)
2  FROM HR.EMPLOYEES
3  WHERE ROWNUM < 5;

TO_CHAR(SALARY,’L99,999.99′)
—————————-
24,000.00
20,000.00
20,000.00
9,000.00

SQL> SELECT TO_CHAR(SALARY,’$99,999.99′)
2  FROM HR.EMPLOYEES
3  WHERE ROWNUM < 5;

TO_CHAR(SALARY,’$99,999.99′)
—————————-
$24,000.00
$20,000.00
$20,000.00
$9,000.00

/*–说明:对于’$99,999.99’格式符:
L:表示强制显示当地货币符号
$: 表示显示美元符号
9: 表示一个数字
0: 表示强制0显示
.: 表示一个小数点
,: 表示一个千位分隔符
————–*/

/*——–2、列出前五位每个员工的名字,工资、涨薪后的的工资(涨幅为8%),以“元”为单位进行四舍五入。———*/

SQL> SELECT FIRST_NAME,SALARY,ROUND(SALARY * 1.08) FROM HR.EMPLOYEES
2  WHERE ROWNUM <=5;

FIRST_NAME               SALARY ROUND(SALARY*1.08)
——————– ———- ——————
Steven                 24000.00              25920
Neena                  20000.00              21600
Lex                    20000.00              21600
Alexander               9000.00               9720
Bruce                   6000.00               6480

/*——–3、找出谁是最高领导,将名字按大写形式显示。———*/
SQL> SELECT UPPER(FIRST_NAME || ‘ ‘ || LAST_NAME) AS NAME
2  FROM HR.EMPLOYEES
3  WHERE MANAGER_ID IS NULL;

NAME
———————————————-
STEVEN KING

/*——–4、找出David 的直接领导的名字。———*/
SQL> SELECT UPPER(FIRST_NAME ||’ ‘ || LAST_NAME) AS NAME
2  FROM HR.EMPLOYEES
3  WHERE EMPLOYEE_ID IN(
4  SELECT MANAGER_ID FROM HR.EMPLOYEES
5  WHERE FIRST_NAME = ‘David’ AND LAST_NAME = ‘Austin’);

NAME
———————————————-
ALEXANDER HUNOLD

–或采用以下方法

SQL> SELECT UPPER( EMP1.FIRST_NAME ||’ ‘ ||  EMP1.LAST_NAME) AS NAME
2  FROM HR.EMPLOYEES EMP1,HR.EMPLOYEES EMP2
3  WHERE EMP1.EMPLOYEE_ID = EMP2.MANAGER_ID
4  AND EMP2.FIRST_NAME = ‘David’ AND EMP2.LAST_NAME =  ‘Austin';

NAME
———————————————-
ALEXANDER HUNOLD

/*——–5、First_Name 为Alexander,LAST_NAME为Hunold领导谁。(谁向David 报告)。———*/
SQL> SELECT UPPER(FIRST_NAME ||’ ‘ || LAST_NAME) AS NAME
2  FROM HR.EMPLOYEES
3  WHERE MANAGER_ID IN(
4  SELECT EMPLOYEE_ID FROM HR.EMPLOYEES
5  WHERE FIRST_NAME = ‘Alexander’ AND LAST_NAME = ‘Hunold’);

NAME
———————————————-
BRUCE ERNST
DAVID AUSTIN
VALLI PATABALLA
DIANA LORENTZ

–或采用以下方法

SQL> SELECT UPPER( EMP1.FIRST_NAME || ‘ ‘ ||  EMP1.LAST_NAME) AS NAME
2  FROM HR.EMPLOYEES EMP1,HR.EMPLOYEES EMP2
3  WHERE EMP1.MANAGER_ID = EMP2.EMPLOYEE_ID
4  AND EMP2.FIRST_NAME = ‘Alexander’ AND EMP2.LAST_NAME =  ‘Hunold';

NAME
———————————————-
BRUCE ERNST
DAVID AUSTIN
VALLI PATABALLA
DIANA LORENTZ

/*——–6、哪些员工的工资高于他直接上司的工资,列出员工的名字和工资,上司的名字和工资。———*/

SQL> SELECT E.FIRST_NAME,E.SALARY,M.FIRST_NAME,M.SALARY
2  FROM EMPLOYEES E,EMPLOYEES M
3  WHERE E.MANAGER_ID = M.EMPLOYEE_ID AND E.SALARY > M.SALARY;

FIRST_NAME               SALARY FIRST_NAME               SALARY
——————– ———- ——————– ———-
Lisa                   11500.00 Gerald                 11000.00
Ellen                  11000.00 Eleni                  10500.00

–要是只列出员工的名字与工资的话,还可以这样:

SQL> SELECT E.FIRST_NAME,E.SALARY
2  FROM EMPLOYEES E WHERE E.SALARY >
3 (SELECT M.SALARY FROM EMPLOYEES M
4  WHERE E.MANAGER_ID = M.EMPLOYEE_ID);

FIRST_NAME               SALARY
——————– ———-
Lisa                   11500.00
Ellen                  11000.00

/*——–7、哪些员工和Chen(LAST_NAME)同部门。———*/

SQL> SELECT FIRST_NAME FROM EMPLOYEES
2  WHERE DEPARTMENT_ID IN
3  (SELECT DEPARTMENT_ID FROM EMPLOYEES WHERE LAST_NAME = ‘Chen’)
4  AND LAST_NAME <> ‘Chen';

FIRST_NAME
——————–
Nancy
Daniel
Ismael
Jose Manuel
Luis
–或者–

SQL> SELECT E1.FIRST_NAME FROM EMPLOYEES E1,EMPLOYEES E2
2  WHERE E1.DEPARTMENT_ID = E2.DEPARTMENT_ID
3  AND E2.LAST_NAME = ‘Chen’ AND E1.LAST_NAME <> ‘Chen';

FIRST_NAME
——————–
Nancy
Daniel
Ismael
Jose Manuel
Luis

/*——–8、哪些员工跟De Haan(LAST_NAME)做一样职位。———*/
SQL> SELECT FIRST_NAME FROM EMPLOYEES
2  WHERE JOB_ID IN
3  (SELECT JOB_ID FROM EMPLOYEES
4  WHERE LAST_NAME = ‘De Haan’)
5  AND LAST_NAME <> ‘De Haan';

FIRST_NAME
——————–
Neena

–或者–

SQL> SELECT E1.FIRST_NAME FROM EMPLOYEES E1,EMPLOYEES E2
2  WHERE E1.JOB_ID = E2.JOB_ID
3  AND E2.LAST_NAME = ‘De Haan’ AND E1.LAST_NAME <> ‘De Haan';

FIRST_NAME
——————–
Neena

/*——–9、哪些员工跟Hall(LAST_NAME)不在同一个部门。———*/

SQL> SELECT FIRST_NAME || ‘ ‘ || LAST_NAME FROM HR.EMPLOYEES
2  WHERE DEPARTMENT_ID NOT IN(
3  SELECT DEPARTMENT_ID FROM HR.EMPLOYEES
4  WHERE LAST_NAME = ‘Hall’);

FIRST_NAME||”||LAST_NAME
———————————————-
Steven King
Neena Kochhar
Lex De Haan
Alexander Hunold
Bruce Ernst
David Austin
Valli Pataballa
Diana Lorentz
Nancy Greenberg
–…初始有72条数据

–或者:

SQL> SELECT e1.FIRST_NAME FROM EMPLOYEES e1,EMPLOYEES e2
2  WHERE e1.DEPARTMENT_ID = e2.DEPARTMENT_ID(+)
3  and e2.LAST_NAME(+) = ‘Hall’
4  and e2.LAST_NAME IS NULL;

/*——-10、哪些员工跟William(FIRST_NAME)、Smith(LAST_NAME)做不一样的职位。——–*/

SQL> SELECT FIRST_NAME || ‘ ‘ || LAST_NAME FROM HR.EMPLOYEES
2  WHERE JOB_ID <> (SELECT DISTINCT JOB_ID FROM EMPLOYEES
3  WHERE FIRST_NAME = ‘William’ AND LAST_NAME = ‘Smith’);

FIRST_NAME||”||LAST_NAME
———————————————-
Steven King
Neena Kochhar
Lex De Haan
Alexander Hunold
—-…初始有77条数据

 

 

 

/*——–11、显示有提成的员工的信息:名字、提成、所在部门名称、所在地区的名称。———*/

SQL> SELECT E.FIRST_NAME || ‘ ‘ || E.LAST_NAME AS NAME,
2  E.COMMISSION_PCT,D.DEPARTMENT_NAME,L.CITY
3  FROM HR.EMPLOYEES E,HR.DEPARTMENTS D,HR.LOCATIONS L
4  WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID
5  AND D.LOCATION_ID = L.LOCATION_ID
6  AND E.COMMISSION_PCT IS NOT NULL;

/*——–12、显示Executive部门有哪些职位。———*/
SQL> SELECT DISTINCT E.JOB_ID FROM HR.EMPLOYEES E,HR.DEPARTMENTS D
2  WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID
3  AND D.DEPARTMENT_NAME = ‘Executive';

JOB_ID
———-
AD_PRES
AD_VP

/*——–13、整个公司中,最高工资和最低工资相差多少。———*/
SQL> SELECT MAX(SALARY) – MIN(SALARY) FROM HR.EMPLOYEES;

MAX(SALARY)-MIN(SALARY)
———————–
21900

/*——–14、提成大于0 的人数。———*/
SQL> SELECT COUNT(*) AS 提成大小0的人数 FROM HR.EMPLOYEES
2  WHERE COMMISSION_PCT > 0;

提成大小0的人数
—————
35
–或者

SQL> SELECT COUNT(COMMISSION_PCT) AS 提成大小0的人数
2   FROM HR.EMPLOYEES
3   WHERE COMMISSION_PCT > 0;
提成大小0的人数
—————
35

/*——–15、显示整个公司的最高工资、最低工资、工资总和、平均工资保留到整数位。———*/

SQL> SELECT MAX(NVL(SALARY,0)) AS 最高工资,
2           MIN(NVL(SALARY,0)) AS 最低工资,
3           SUM(NVL(SALARY,0)) AS 工资总和,
4           ROUND(AVG(NVL(SALARY,0))) AS 平均工资
5  FROM HR.EMPLOYEES;

最高工资       最低工资       工资总和       平均工资
———-    ———-      ———-     ———
24000          2100           698011         6523

/*——–16、整个公司有多少个领导。———*/
SQL> SELECT COUNT(DISTINCT(MANAGER_ID))  FROM HR.EMPLOYEES
2  WHERE MANAGER_ID IS NOT NULL;

COUNT(DISTINCT(MANAGER_ID))
—————————
18

/*——–17、列出在同一部门入职日期晚但工资高于其他同事的员工:
名字、工资、入职日期。———*/

SQL> SELECT DISTINCT E1.FIRST_NAME || ‘ ‘ || E1.LAST_NAME AS 姓名,
2         E1.SALARY AS 工资,E1.HIRE_DATE AS 入职日期
3  FROM HR.EMPLOYEES E1,HR.EMPLOYEES E2
4  WHERE E1.DEPARTMENT_ID = E2.DEPARTMENT_ID
5  AND E1.HIRE_DATE > E2.HIRE_DATE
6  AND E1.SALARY > E2.SALARY
7  ORDER BY 工资 DESC;

姓名                                                   工资 入职日期
———————————————- ———- ———–
John Russell                                     14000.00 1996101
Karen Partners                                   13500.00 199715
Alberto Errazuriz                                12000.00 1997310
Nancy Greenberg                                  12000.00 1994817
Lisa Ozer                                        11500.00 1997311
Ellen Abel                                       11000.00 1996511
Gerald Cambrault                                 11000.00 19991015
Clara Vishney                                    10500.00 19971111
Eleni Zlotkey                                    10500.00 2000129
Harrison Bloom                                   10000.00 1998323
Peter Tucker                                     10000.00 1997130
Tayler Fox                                        9600.00 1998124
Danielle Greene                                   9500.00 1999319
David Bernstein                                   9500.00 1997324
Peter Hall                                        9000.00 1997820
Alyssa Hutton                                     8800.00 1997319
Jonathon Taylor                                   8600.00 1998324
Adam Fripp                                        8200.00 1997410
Christopher Olsen                                 8000.00 1998330
Jack Livingston                                   8000.00 1998423
Matthew Weiss                                     8000.00 1996718
Jose Manuel Urman                                 7800.00 199837
Nanette Cambrault                                 7500.00 1998129
William Smith                                     7400.00 1999223
Elizabeth Bates                                   7300.00 1999324
Charles Johnson                                   7211.00 200014
Mattea Marvins                                    7200.00 2000124
Shanta Vollman                                    6500.00 19971010
Kevin Mourgos                                     5800.00 19991116
Nandita Sarchand                                  4200.00 1996127
Alexis Bull                                       4100.00 1997220
Sarah Bell                                        4000.00 199624
Britney Everett                                   3900.00 199733
Kelly Chung                                       3800.00 1997614
Jennifer Dilly                                    3600.00 1997813
Julia Dellinger                                   3400.00 1998624
Laura Bissot                                      3300.00 1997820
Julia Nayer                                       3200.00 1997716
Samuel McCain                                     3200.00 199871
Stephen Stiles                                    3200.00 19971026
Winston Taylor                                    3200.00 1998124
Alana Walsh                                       3100.00 1998424
Jean Fleaur                                       3100.00 1998223
Anthony Cabrio                                    3000.00 199927
Kevin Feeney                                      3000.00 1998523
Michael Rogers                                    2900.00 1998826
Shelli Baida                                      2900.00 19971224
Timothy Gates                                     2900.00 1998711
Girard Geoni                                      2800.00 200023
Mozhe Atkinson                                    2800.00 19971030
Vance Jones                                       2800.00 1999317
Irene Mikkilineni                                 2700.00 1998928
John Seo                                          2700.00 1998212
Donald OConnell                                   2600.00 1999621
Douglas Grant                                     2600.00 2000113
Randall Matos                                     2600.00 1998315
Martha Sullivan                                   2500.00 1999621
Randall Perkins                                   2500.00 19991219
Ki Gee                                            2400.00 19991212
Hazel Philtanker                                  2200.00 200026
Steven Markle                                     2200.00 200038

61 rows selected

 

转载请注明:RDIFramework.NET » [推荐]ORACLE SQL:经典查询练手第三篇(不懂装懂,永世饭桶!)

]]>
http://blog.rdiframework.net/552.html/feed 0
[推荐]ORACLE SQL:经典查询练手第五篇(不懂装懂,永世饭桶!) http://blog.rdiframework.net/251.html http://blog.rdiframework.net/251.html#comments Sun, 26 Jun 2011 17:40:00 +0000 http://blog.scbz.org/index.php/archives/251 [推荐]ORACLE SQL

经典查询练手第五篇(不懂装懂,永世饭桶!)

 

——通过知识共享树立个人品牌。

本文与大家共同讨论与分享ORACLE SQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来。在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出。交流与分享才能共同进步嘛,感谢!

 接上四篇:

[推荐]ORACLE SQL:经典查询练手第一篇

[推荐]ORACLE SQL:经典查询练手第二篇

[推荐]ORACLE SQL:经典查询练手第三篇

[推荐]ORACLE SQL:经典查询练手第四篇

 

本篇数据查询属于复杂业务,难度比较高,请继续努力,通过我为大家设立的这个系列,循序渐进,只要你对每一篇,每一个试题都实践测试,认真练习。我相信你对常用、经典的、复杂的SQL已能熟能生巧,信手拈来! 


本文使用ORACLE自带的人力资源(HR)实例数据,本文所用表结构如下:

表名:REGIONS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

REGION_ID

NUMBER

2

REGION_NAME

VARCHAR2

25

 表名:COUNTRIES

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

COUNTRY_ID

CHAR

2

2

COUNTRY_NAME

VARCHAR2

40

3

REGION_ID

NUMBER

表名:LOCATIONS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

LOCATION_ID

NUMBER

4

0

2

STREET_ADDRESS

VARCHAR2

40

3

POSTAL_CODE

VARCHAR2

12

4

CITY

VARCHAR2

30

5

STATE_PROVINCE

VARCHAR2

25

6

COUNTRY_ID

CHAR

2

表名:DEPARTMENTS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

DEPARTMENT_ID

NUMBER

4

0

2

DEPARTMENT_NAME

VARCHAR2

30

3

MANAGER_ID

NUMBER

6

0

4

LOCATION_ID

NUMBER

4

0

表名:JOBS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

JOB_ID

VARCHAR2

10

2

JOB_TITLE

VARCHAR2

35

3

MIN_SALARY

NUMBER

6

0

4

MAX_SALARY

NUMBER

6

0

表名:EMPLOYEES

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

EMPLOYEE_ID

NUMBER

6

0

2

FIRST_NAME

VARCHAR2

20

3

LAST_NAME

VARCHAR2

25

4

EMAIL

VARCHAR2

25

5

PHONE_NUMBER

VARCHAR2

20

6

HIRE_DATE

DATE

7

7

JOB_ID

VARCHAR2

10

8

SALARY

NUMBER

8

2

9

COMMISSION_PCT

NUMBER

2

2

10

MANAGER_ID

NUMBER

6

0

11

DEPARTMENT_ID

NUMBER

4

0

ER图:

 SQL完成以下问题列表:

1. 哪些部门的人数比90 号部门的人数多。
2. Den(FIRST_NAME)、Raphaely(LAST_NAME)的领导是谁(非关联子查询)。
3. Den(FIRST_NAME)、Raphaely(LAST_NAME) 领导谁(非关联子查询)。
4. Den(FIRST_NAME)、Raphaely(LAST_NAME) 的领导是谁(关联子查询)。
5. Den(FIRST_NAME)、Raphaely(LAST_NAME) 领导谁(关联子查询)。
6. 列出在同一部门共事,入职日期晚但工资高于其他同事的员工:名字、工资、入职日期
(关联子查询)。
7. 哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)不在同一个部门(非关联子查询)。
8. 哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)不在同一个部门(关联子查询)。
9.  Finance部门有哪些职位(非关联子查询)。
10. Finance部门有哪些职位(关联子查询)。

各试题解答如下(欢迎大家指出不同的方法或建议!):

/*——–1、哪些部门的人数比90号部门的人数多。———*/SQL

> SELECT DEPARTMENT_ID,COUNT(*FROM EMPLOYEES
2  GROUP BY DEPARTMENT_ID
3  HAVING COUNT(*>
4         (SELECT COUNT(*FROM EMPLOYEES
5          WHERE DEPARTMENT_ID = 90
6         );

DEPARTMENT_ID   COUNT(*)
———– ———-
           30          6
50         45
60          5
80         34
100          6

 

/*——-2、Den(FIRST_NAME)、Raphaely(LAST_NAME)的
领导是谁(非关联子查询)。———
*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME
2  FROM EMPLOYEES
3  WHERE EMPLOYEE_ID =
4        (SELECT MANAGER_ID FROM EMPLOYEES
5         WHERE FIRST_NAME = Den
6         AND   LAST_NAME  = Raphaely
7        );

FIRST_NAME||||LAST_NAME
——————————————–
Steven King

/*——-3、Den(FIRST_NAME)、Raphaely(LAST_NAME)领导谁(非关联子查询)。———*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME
2  FROM EMPLOYEES
3  WHERE MANAGER_ID IN
4        (SELECT EMPLOYEE_ID FROM EMPLOYEES
5         WHERE FIRST_NAME = Den
6         AND   LAST_NAME  = Raphaely
7        );

FIRST_NAME||||LAST_NAME
——————————————–
Alexander Khoo
Shelli Baida
Sigal Tobias
Guy Himuro
Karen Colmenares

或者

SQL
> SELECT FIRST_NAME ||   || LAST_NAME
2  FROM EMPLOYEES
3  WHERE MANAGER_ID =
4        (SELECT EMPLOYEE_ID FROM EMPLOYEES
5         WHERE FIRST_NAME = Den
6         AND   LAST_NAME  = Raphaely
7        );

FIRST_NAME||||LAST_NAME
——————————————–
Alexander Khoo
Shelli Baida
Sigal Tobias
Guy Himuro
Karen Colmenares

/*——-4、Den(FIRST_NAME)、Raphaely(LAST_NAME)的领导是谁(关联子查询)。———*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME
2  FROM EMPLOYEES EMP1
3  WHERE EXISTS (
4        SELECT 1 FROM EMPLOYEES EMP2
5        WHERE FIRST_NAME = Den
6        AND LAST_NAME  = Raphaely
7        AND EMP2.MANAGER_ID = EMP1.EMPLOYEE_ID);

FIRST_NAME||||LAST_NAME
——————————————–
Steven King

/*——-5、Den(FIRST_NAME)、Raphaely(LAST_NAME)领导谁(关联子查询)。———*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME
2  FROM EMPLOYEES EMP1
3  WHERE EXISTS (
4        SELECT 1 FROM EMPLOYEES EMP2
5        WHERE FIRST_NAME = Den
6        AND LAST_NAME  = Raphaely
7        AND EMP2.EMPLOYEE_ID = EMP1.MANAGER_ID); FIRST_NAME

||||LAST_NAME
——————————————–
Alexander Khoo
Shelli Baida
Sigal Tobias
Guy Himuro
Karen Colmenares

/*——-6、列出在同一部门共事,入职日期晚但工资高于其他同事的员工:
名字、工资、入职日期(关联子查询)。———
*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME AS 姓名,
2          SALARY AS 工资,HIRE_DATE AS 入职日期
3  FROM EMPLOYEES EMP1
4  WHERE EXISTS (
5        SELECT 1 FROM EMPLOYEES EMP2
6        WHERE EMP2.DEPARTMENT_ID = EMP1.DEPARTMENT_ID
7        AND   EMP1.HIRE_DATE > EMP2.HIRE_DATE
8        AND   EMP1.SALARY    > EMP2.SALARY
9        );姓名                                                   工资 入职日期

——————————————– ———- ———–
Nancy Greenberg                                  12000.00 1994817
Jose Manuel Urman                                 
7800.00 199837
Shelli Baida                                      
2900.00 19971224
Adam Fripp                                        
8200.00 1997410
Matthew Weiss                                     
8000.00 1996718
Jennifer Dilly                                    
3600.00 1997813
Julia Dellinger                                   
3400.00 1998624
Laura Bissot                                      
3300.00 1997820
Kevin Mourgos                                     
5800.00 19991116
Shanta Vollman                                    
6500.00 19971010
Vance Jones                                       
2800.00 1999317
Anthony Cabrio                                    
3000.00 199927
Girard Geoni                                      
2800.00 200023
Douglas 
Grant                                     2600.00 2000113
Donald OConnell                                   
2600.00 1999621
Randall Perkins                                   
2500.00 19991219
Martha Sullivan                                   
2500.00 1999621
Kevin Feeney                                      
3000.00 1998523
Alana Walsh                                       
3100.00 1998424
Samuel McCain                                     
3200.00 199871
Timothy Gates                                     
2900.00 1998711
Jean Fleaur                                       
3100.00 1998223
Winston Taylor                                    
3200.00 1998124
Michael Rogers                                    
2900.00 1998826
Britney Everett                                   
3900.00 199733
Kelly Chung                                       
3800.00 1997614
Alexis Bull                                       
4100.00 1997220
Randall Matos                                     
2600.00 1998315
John Seo                                          
2700.00 1998212
Stephen Stiles                                    
3200.00 19971026
Mozhe Atkinson                                    
2800.00 19971030
Irene Mikkilineni                                 
2700.00 1998928
Julia Nayer                                       
3200.00 1997716
Hazel Philtanker                                  
2200.00 200026
Ki Gee                                            
2400.00 19991212
Steven Markle                                     
2200.00 200038
Sarah Bell                                        
4000.00 199624
Nandita Sarchand                                  
4200.00 1996127
Lisa Ozer                                        
11500.00 1997311
Clara Vishney                                    
10500.00 19971111
Eleni Zlotkey                                    
10500.00 2000129
Gerald Cambrault                                 
11000.00 19991015
Alberto Errazuriz                                
12000.00 1997310
Tayler Fox                                        
9600.00 1998124
Harrison Bloom                                   
10000.00 1998323
Danielle Greene                                   
9500.00 1999319
Charles Johnson                                   
7211.00 200014
Mattea Marvins                                    
7200.00 2000124
Ellen Abel                                       
11000.00 1996511
Karen Partners                                   
13500.00 199715
John Russell                                     
14000.00 1996101
Peter Tucker                                     
10000.00 1997130
David Bernstein                                   
9500.00 1997324
Jonathon Taylor                                   
8600.00 1998324
Alyssa Hutton                                     
8800.00 1997319
Peter Hall                                        
9000.00 1997820
Jack Livingston                                   
8000.00 1998423
Christopher Olsen                                 
8000.00 1998330
Elizabeth Bates                                   
7300.00 1999324
William Smith                                     
7400.00 1999223
Nanette Cambrault                                 
7500.00 1998129

61 rows selected

/*——-7、哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)
不在同一个部门(非关联子查询)。———
*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME
2  FROM EMPLOYEES
3  WHERE DEPARTMENT_ID <>
4        (SELECT DEPARTMENT_ID FROM EMPLOYEES
5         WHERE FIRST_NAME = Den
6         AND LAST_NAME  = Raphaely
7        );

FIRST_NAME||||LAST_NAME
——————————————–
Steven King
Neena Kochhar
Lex De Haan
Alexander Hunold
Bruce Ernst
David Austin
Valli Pataballa
等等

或者

SQL
> SELECT FIRST_NAME ||   || LAST_NAME
2  FROM EMPLOYEES
3  WHERE DEPARTMENT_ID NOT IN
4        (SELECT DEPARTMENT_ID FROM EMPLOYEES
5         WHERE FIRST_NAME = Den
6         AND LAST_NAME  = Raphaely
7        );

/*——-8、哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)
不在同一个部门(关联子查询)。———
*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME
2  FROM EMPLOYEES EMP1
3  WHERE NOT EXISTS (
4        SELECT 1 FROM EMPLOYEES EMP2
5        WHERE EMP1.DEPARTMENT_ID = EMP2.DEPARTMENT_ID
6        AND EMP2.FIRST_NAME =  Den
7        AND EMP2.LAST_NAME  =  Raphaely);

FIRST_NAME||||LAST_NAME
——————————————–
Kimberely Grant
Lex De Haan
Neena Kochhar
Steven King
Pat Fay
Michael Hartstein
Diana Lorentz
Valli Pataballa
等等

/*——-9、Finance部门有哪些职位(非关联子查询)。———*/SQL

> SELECT DISTINCT JOB_ID FROM EMPLOYEES
2  WHERE DEPARTMENT_ID = (
3        SELECT DEPARTMENT_ID FROM DEPARTMENTS
4        WHERE DEPARTMENT_NAME = Finance);

JOB_ID
——–
FI_ACCOUNT
FI_MGR

或者

SQL
> SELECT DISTINCT JOB_ID FROM EMPLOYEES
2  WHERE DEPARTMENT_ID IN (
3        SELECT DEPARTMENT_ID FROM DEPARTMENTS
4        WHERE DEPARTMENT_NAME = Finance);

JOB_ID
——–
FI_ACCOUNT
FI_MGR

/*——-10、Finance部门有哪些职位(关联子查询)。———*/
SQL
> SELECT DISTINCT JOB_ID FROM EMPLOYEES
2  WHERE EXISTS(
3        SELECT 1 FROM DEPARTMENTS
4        WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
5        AND DEPARTMENTS.DEPARTMENT_NAME = Finance);

JOB_ID
——–
FI_ACCOUNT
FI_MGR

转载请注明:RDIFramework.NET » [推荐]ORACLE SQL:经典查询练手第五篇(不懂装懂,永世饭桶!)

]]>
http://blog.rdiframework.net/251.html/feed 0
[推荐]ORACLE SQL:经典查询练手第四篇(不懂装懂,永世饭桶!) http://blog.rdiframework.net/252.html http://blog.rdiframework.net/252.html#comments Tue, 21 Jun 2011 20:43:00 +0000 http://blog.scbz.org/index.php/archives/252  [推荐]ORACLE SQL

经典查询练手第四篇(不懂装懂,永世饭桶!)

 

——通过知识共享树立个人品牌。

本文与大家共同讨论与分享ORACLE SQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来。在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出。交流与分享才能共同进步嘛,感谢!

 接上三篇:

[推荐]ORACLE SQL:经典查询练手第一篇

[推荐]ORACLE SQL:经典查询练手第二篇

[推荐]ORACLE SQL:经典查询练手第三篇

本篇数据查询属于复杂业务,难度比较高,请继续努力,通过我为大家设立的这个系列,循序渐进,只要你对每一篇,每一个试题都实践测试,认真练习。我相信你对常用、经典的、复杂的SQL已能熟能生巧,信手拈来!

 

本文使用ORACLE自带的人力资源(HR)实例数据,本文所用表结构如下:

表名:REGIONS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

REGION_ID

NUMBER

 

 

 

 

 

2

REGION_NAME

VARCHAR2

25

 

 

 

 

 

 

表名:COUNTRIES

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

COUNTRY_ID

CHAR

2

 

 

 

 

2

COUNTRY_NAME

VARCHAR2

40

 

 

 

 

 

3

REGION_ID

NUMBER

 

 

 

 

 

 

表名:LOCATIONS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

LOCATION_ID

NUMBER

4

0

 

 

 

2

STREET_ADDRESS

VARCHAR2

40

 

 

 

 

 

3

POSTAL_CODE

VARCHAR2

12

 

 

 

 

 

4

CITY

VARCHAR2

30

 

 

 

 

 

5

STATE_PROVINCE

VARCHAR2

25

 

 

 

 

 

6

COUNTRY_ID

CHAR

2

 

 

 

 

 

表名:DEPARTMENTS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

DEPARTMENT_ID

NUMBER

4

0

 

 

 

2

DEPARTMENT_NAME

VARCHAR2

30

 

 

 

 

 

3

MANAGER_ID

NUMBER

6

0

 

 

 

 

4

LOCATION_ID

NUMBER

4

0

 

 

 

 

表名:JOBS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

JOB_ID

VARCHAR2

10

 

 

 

 

2

JOB_TITLE

VARCHAR2

35

 

 

 

 

 

3

MIN_SALARY

NUMBER

6

0

 

 

 

 

4

MAX_SALARY

NUMBER

6

0

 

 

 

 

表名:EMPLOYEES

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

EMPLOYEE_ID

NUMBER

6

0

 

 

 

2

FIRST_NAME

VARCHAR2

20

 

 

 

 

 

3

LAST_NAME

VARCHAR2

25

 

 

 

 

 

4

EMAIL

VARCHAR2

25

 

 

 

 

 

5

PHONE_NUMBER

VARCHAR2

20

 

 

 

 

 

6

HIRE_DATE

DATE

7

 

 

 

 

 

7

JOB_ID

VARCHAR2

10

 

 

 

 

 

8

SALARY

NUMBER

8

2

 

 

 

 

9

COMMISSION_PCT

NUMBER

2

2

 

 

 

 

10

MANAGER_ID

NUMBER

6

0

 

 

 

 

11

DEPARTMENT_ID

NUMBER

4

0

 

 

 

 

ER图:

 

SQL完成以下问题列表:

1. 各个部门平均、最大、最小工资、人数,按照部门号升序排列。

2. 各个部门中工资大于5000的员工人数。

3. 各个部门平均工资和人数,按照部门名字升序排列。

4. 列出每个部门中有同样工资的员工的统计信息,列出他们的部门号,工资,人数。

5. 列出同部门中工资高于1000 的员工数量超过2 人的部门,显示部门名字、地区名称。

6. 哪些员工的工资,高于整个公司的平均工资,列出员工的名字和工资(降序)。

7. 哪些员工的工资,介于5080部门平均工资之间。

8. 所在部门平均工资高于5000 的员工名字。

9. 列出各个部门中工资最高的员工的信息:名字、部门号、工资。

10. 最高的部门平均工资是多少。

 

 

各试题解答如下(欢迎大家指出不同的方法或建议!):

 

/*——–1、各个部门平均、最大、最小工资、人数,按照部门号升序排列。———*/

SQL> SELECT DEPARTMENT_ID AS 部门号,AVG(SALARY) AS 平均工资

  2         ,MAX(SALARY) AS 最高工资,MIN(SALARY)  AS 最低工资

  3         ,COUNT(*) AS 人数

  4  FROM EMPLOYEES

  5  GROUP BY DEPARTMENT_ID

  6  ORDER BY DEPARTMENT_ID ASC;

 

   部门号       平均工资       最高工资       最低工资         人数

——        ———-        ———-        ———-        ———-

   10         4400           4400           4400               1

    20         9500           13000          6000               2

    30         4150           11000          2500               6

    40         6500           6500           6500               1

    50         3475.55555     8200              2100               45

    60         5760           9000           4200               5

    70         10000          10000          10000              1

    80         8973.85294     14000          6100               34

    90         21333.3333     24000             20000              3

   100         8600           12000          6900               6

   110         10150          12000          8300               2

                7000           7000           7000               1

 

12 rows selected

 

/*——–2、各个部门中工资大于5000的员工人数。———*/

SQL> SELECT DEPARTMENT_ID,COUNT(*) FROM EMPLOYEES

   2  WHERE SALARY > 5000

   3  GROUP BY DEPARTMENT_ID;

 

DEPARTMENT_ID   COUNT(*)

————- ———-

           20          2

           30          1

           40          1

           50          5

           60          2

           70          1

           80         34

           90          3

          100          6

          110          2

                       1

 

11 rows selected

 

/*——–3、各个部门平均工资和人数,按照部门名字升序排列。———*/

 

SQL> SELECT DPTNAME,AVG(SALARY),COUNT(*) FROM

  2         (SELECT

  3             (SELECT DEPT.DEPARTMENT_NAME FROM DEPARTMENTS DEPT

  4             WHERE DEPT.DEPARTMENT_ID = EMP.DEPARTMENT_ID) DPTNAME,

  5             EMP.SALARY

  6  FROM EMPLOYEES EMP)

  7  GROUP BY DPTNAME

  8  ORDER BY DPTNAME;

 

DPTNAME                        AVG(SALARY)   COUNT(*)

—————————— ———– ———-

Accounting                           10150          2

Administration                        4400          1

Executive                      21333.33333          3

Finance                               8600          6

Human Resources                       6500          1

IT                                    5760          5

Marketing                             9500          2

Public Relations                     10000          1

Purchasing                            4150          6

Sales                          8973.852941         34

Shipping                       3475.555555         45

                                      7000          1

12 rows selected

 

或者

 

SQL> SELECT DEPT.DEPARTMENT_NAME,AVG(EMP.SALARY),COUNT(*)

   2  FROM EMPLOYEES EMP,DEPARTMENTS DEPT

   3  WHERE EMP.DEPARTMENT_ID = DEPT.DEPARTMENT_ID

   4  GROUP BY DEPT.DEPARTMENT_NAME

   5  ORDER BY DEPT.DEPARTMENT_NAME;

 

DEPARTMENT_NAME                AVG(EMP.SALARY)   COUNT(*)

—————————— ————— ———-

Accounting                               10150          2

Administration                            4400          1

Executive                      21333.333333333          3

Finance                                   8600          6

Human Resources                           6500          1

IT                                        5760          5

Marketing                                 9500          2

Public Relations                         10000          1

Purchasing                                4150          6

Sales                          8973.8529411764         34

Shipping                       3475.5555555555         45

 

11 rows selected

可以看到,这种方式,对于部门号为空的没有统计出来

 

/*——–4、列出每个部门中有同样工资的员工的统计信息,

  列出他们的部门号,工资,人数。———*/

 

SQL> SELECT EMP1.DEPARTMENT_ID,EMP1.SALARY,COUNT(*) CNT

   2  FROM   EMPLOYEES EMP1,EMPLOYEES EMP2

   3  WHERE  EMP1.DEPARTMENT_ID = EMP2.DEPARTMENT_ID AND

   4          EMP1.SALARY = EMP2.SALARY

   5          AND EMP1.EMPLOYEE_ID <> EMP2.EMPLOYEE_ID

   6  GROUP BY EMP1.DEPARTMENT_ID,EMP1.SALARY;

 

DEPARTMENT_ID     SALARY        CNT

————- ———- ———-

           50    2200.00          2

           50    2400.00          2

           50    2500.00         20

           50    2600.00          6

           50    2700.00          2

           50    2800.00          6

           50    2900.00          2

           50    3000.00          2

           50    3100.00          6

           50    3200.00         12

           50    3300.00          2

           50    3600.00          2

           60    4800.00          2

           80    7000.00          2

           80    7500.00          2

           80    8000.00          6

           80    9000.00          2

           80    9500.00          6

           80   10000.00          6

           80   10500.00          2

           80   11000.00          2

           90   20000.00          2

 

22 rows selected

 

/*——–5、列出同部门中工资高于1000 的员工数量超过2 人的部门,

显示部门名字、地区名称。———*/

 

SQL> SELECT D.DEPARTMENT_NAME,L.CITY,COUNT(*)

   2  FROM EMPLOYEES E,DEPARTMENTS D,LOCATIONS L

   3  WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID AND

   4         D.LOCATION_ID   = L.LOCATION_ID    AND

   5         E.SALARY > 1000

   6  GROUP BY D.DEPARTMENT_NAME,L.CITY

   7  HAVING COUNT(*) > 2;

 

DEPARTMENT_NAME                CITY                             COUNT(*)

—————————— —————————— ———-

IT                             Southlake                               5

Sales                          Oxford                                 34

Finance                        Seattle                                 6

Shipping                       South San Francisco                    45

Executive                      Seattle                                 3

Purchasing                     Seattle                                 6

 

6 rows selected

 

/*——–6、哪些员工的工资,高于整个公司的平均工资,

  列出员工的名字和工资(降序)。———*/

 

SQL> SELECT FIRST_NAME || ‘ ‘ || LAST_NAME,SALARY

   2  FROM EMPLOYEES

   3  WHERE SALARY > (

   4        SELECT AVG(SALARY)

   5        FROM EMPLOYEES

   6        )

   7  ORDER BY SALARY DESC;

FIRST_NAME||”||LAST_NAME                          SALARY

———————————————- ———-

Steven King                                      24000.00

Neena Kochhar                                    20000.00

Lex De Haan                                      20000.00

John Russell                                     14000.00

Karen Partners                                   13500.00

Michael Hartstein                                13000.00

Nancy Greenberg                                  12000.00

Alberto Errazuriz                                12000.00

Shelley Higgins                                  12000.00

Lisa Ozer                                        11500.00

Den Raphaely                                     11000.00

Gerald Cambrault                                 11000.00

Ellen Abel                                       11000.00

Eleni Zlotkey                                    10500.00

Clara Vishney                                    10500.00

Peter Tucker                                     10000.00

Janette King                                     10000.00

Harrison Bloom                                   10000.00

Hermann Baer                                     10000.00

Tayler Fox                                        9600.00

50条数据

 

/*——–7、哪些员工的工资,介于5080部门平均工资之间。———*/

 

SQL> SELECT FIRST_NAME || ‘ ‘ || LAST_NAME AS NAME,SALARY

  2  FROM EMPLOYEES

  3  WHERE SALARY

  4  BETWEEN

  5      (SELECT AVG(SALARY) FROM EMPLOYEES

  6       WHERE DEPARTMENT_ID = 50)

  7  AND (SELECT AVG(SALARY) FROM EMPLOYEES

  8       WHERE DEPARTMENT_ID = 80);

 

NAME                                               SALARY

———————————————- ———-

Bruce Ernst                                       6000.00

David Austin                                      4800.00

Valli Pataballa                                   4800.00

Diana Lorentz                                     4200.00

John Chen                                         8200.00

Ismael Sciarra                                    7700.00

Jose Manuel Urman                                 7800.00

Luis Popp                                         6900.00

Matthew Weiss                                     8000.00

Adam Fripp                                        8200.00

Payam Kaufling                                    7900.00

Shanta Vollman                                    6500.00

Kevin Mourgos                                     5800.00

Renske Ladwig                                     3600.00

Trenna Rajs                                       3500.00

Christopher Olsen                                 8000.00

Nanette Cambrault                                 7500.00

Oliver Tuvault                                    7000.00

Lindsey Smith                                     8000.00

Louise Doran                                      7500.00

Sarath Sewall                                     7000.00

Mattea Marvins                                    7200.00

David Lee                                         6800.00

Sundar Ande                                       6400.00

Amit Banda                                        6200.00

William Smith                                     7400.00

Elizabeth Bates                                   7300.00

Sundita Kumar                                     6100.00

Alyssa Hutton                                     8800.00

Jonathon Taylor                                   8600.00

Jack Livingston                                   8000.00

Kimberely Grant                                   7000.00

Charles Johnson                                   7211.00

Nandita Sarchand                                  4200.00

Alexis Bull                                       4100.00

Kelly Chung                                       3800.00

Jennifer Dilly                                    3600.00

Sarah Bell                                        4000.00

Britney Everett                                   3900.00

Jennifer Whalen                                   4400.00

Pat Fay                                           6000.00

Susan Mavris                                      6500.00

William Gietz                                     8300.00

 

43 rows selected

 

/*——–8、所在部门平均工资高于5000 的员工名字。———*/

 

SQL> SELECT FIRST_NAME || ‘ ‘ || LAST_NAME AS NAME,SALARY

   2  FROM EMPLOYEES

   3  WHERE DEPARTMENT_ID IN

   4        (SELECT DEPARTMENT_ID FROM EMPLOYEES

   5         GROUP BY DEPARTMENT_ID

   6         HAVING AVG(SALARY) > 5000);

 

NAME                                               SALARY

———————————————- ———-

Michael Hartstein                                13000.00

Pat Fay                                           6000.00

Susan Mavris                                      6500.00

Alexander Hunold                                  9000.00

Bruce Ernst                                       6000.00

David Austin                                      4800.00

Valli Pataballa                                   4800.00

Diana Lorentz                                     4200.00

Hermann Baer                                     10000.00

John Russell                                     14000.00

Karen Partners                                   13500.00

Alberto Errazuriz                                12000.00

Gerald Cambrault                                 11000.00

Eleni Zlotkey                                    10500.00

Peter Tucker                                     10000.00

David Bernstein                                   9500.00

Peter Hall                                        9000.00

Christopher Olsen                                 8000.00

Nanette Cambrault                                 7500.00

Oliver Tuvault                                    7000.00

54行数据

 

/*——–9、列出各个部门中工资最高的员工的信息:名字、部门号、工资。———*/

 

SQL> SELECT FIRST_NAME || ‘ ‘ || LAST_NAME AS NAME

   2         ,SALARY,DEPARTMENT_ID

   3  FROM EMPLOYEES

   4  WHERE (DEPARTMENT_ID,SALARY) IN

   5        (SELECT DEPARTMENT_ID,MAX(SALARY)

   6         FROM EMPLOYEES

   7         GROUP BY DEPARTMENT_ID);

 

NAME                                               SALARY DEPARTMENT_ID

———————————————- ———- ————-

Jennifer Whalen                                   4400.00            10

Michael Hartstein                                13000.00            20

Den Raphaely                                     11000.00            30

Susan Mavris                                      6500.00            40

Adam Fripp                                        8200.00            50

Alexander Hunold                                  9000.00            60

Hermann Baer                                     10000.00            70

John Russell                                     14000.00            80

Steven King                                      24000.00            90

Nancy Greenberg                                  12000.00           100

Shelley Higgins                                  12000.00           110

 

11 rows selected

 

/*——–10、最高的部门平均工资是多少。———*/

SQL> SELECT MAX(AVGSALARY)

  2  FROM(SELECT DEPARTMENT_ID,AVG(SALARY) AVGSALARY

  3    FROM EMPLOYEES

  4    GROUP BY DEPARTMENT_ID);

 

MAX(AVGSALARY)

————–

21333.33333333 

 

转载请注明:RDIFramework.NET » [推荐]ORACLE SQL:经典查询练手第四篇(不懂装懂,永世饭桶!)

]]>
http://blog.rdiframework.net/252.html/feed 0
[强烈推荐]ORACLE SQL:经典查询练手第四篇(不懂装懂,永世饭桶!) http://blog.rdiframework.net/253.html http://blog.rdiframework.net/253.html#comments Tue, 21 Jun 2011 20:31:00 +0000 http://blog.scbz.org/index.php/archives/253  [推荐]ORACLE SQL

经典查询练手第四篇(不懂装懂,永世饭桶!)

 

——通过知识共享树立个人品牌。

本文与大家共同讨论与分享ORACLE SQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来。在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出。交流与分享才能共同进步嘛,感谢!

 接上三篇:

[推荐]ORACLE SQL:经典查询练手第一篇

[推荐]ORACLE SQL:经典查询练手第二篇

[推荐]ORACLE SQL:经典查询练手第三篇

本篇数据查询属于复杂业务,难度比较高,请继续努力,通过我为大家设立的这个系列,循序渐进,只要你对每一篇,每一个试题都实践测试,认真练习。我相信你对常用、经典的、复杂的SQL已能熟能生巧,信手拈来!

 


 

本文使用ORACLE自带的人力资源(HR)实例数据,本文所用表结构如下:

表名:REGIONS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

REGION_ID

NUMBER

 

 

 

 

 

2

REGION_NAME

VARCHAR2

25

 

 

 

 

 

 

表名:COUNTRIES

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

COUNTRY_ID

CHAR

2

 

 

 

 

2

COUNTRY_NAME

VARCHAR2

40

 

 

 

 

 

3

REGION_ID

NUMBER

 

 

 

 

 

 

表名:LOCATIONS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

LOCATION_ID

NUMBER

4

0

 

 

 

2

STREET_ADDRESS

VARCHAR2

40

 

 

 

 

 

3

POSTAL_CODE

VARCHAR2

12

 

 

 

 

 

4

CITY

VARCHAR2

30

 

 

 

 

 

5

STATE_PROVINCE

VARCHAR2

25

 

 

 

 

 

6

COUNTRY_ID

CHAR

2

 

 

 

 

 

表名:DEPARTMENTS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

DEPARTMENT_ID

NUMBER

4

0

 

 

 

2

DEPARTMENT_NAME

VARCHAR2

30

 

 

 

 

 

3

MANAGER_ID

NUMBER

6

0

 

 

 

 

4

LOCATION_ID

NUMBER

4

0

 

 

 

 

表名:JOBS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

JOB_ID

VARCHAR2

10

 

 

 

 

2

JOB_TITLE

VARCHAR2

35

 

 

 

 

 

3

MIN_SALARY

NUMBER

6

0

 

 

 

 

4

MAX_SALARY

NUMBER

6

0

 

 

 

 

表名:EMPLOYEES

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

EMPLOYEE_ID

NUMBER

6

0

 

 

 

2

FIRST_NAME

VARCHAR2

20

 

 

 

 

 

3

LAST_NAME

VARCHAR2

25

 

 

 

 

 

4

EMAIL

VARCHAR2

25

 

 

 

 

 

5

PHONE_NUMBER

VARCHAR2

20

 

 

 

 

 

6

HIRE_DATE

DATE

7

 

 

 

 

 

7

JOB_ID

VARCHAR2

10

 

 

 

 

 

8

SALARY

NUMBER

8

2

 

 

 

 

9

COMMISSION_PCT

NUMBER

2

2

 

 

 

 

10

MANAGER_ID

NUMBER

6

0

 

 

 

 

11

DEPARTMENT_ID

NUMBER

4

0

 

 

 

 

ER图:


 

SQL完成以下问题列表:

 

/*———————————————
1. 各个部门平均、最大、最小工资、人数,按照部门号升序排列。
2. 各个部门中工资大于5000的员工人数。
3. 各个部门平均工资和人数,按照部门名字升序排列。
4. 列出每个部门中有同样工资的员工的统计信息,列出他们的部门号,工资,人数。
5. 列出同部门中工资高于1000 的员工数量超过2 人的部门,显示部门名字、地区名称。
6. 哪些员工的工资,高于整个公司的平均工资,列出员工的名字和工资(降序)。
7. 哪些员工的工资,介于50号 和80号部门平均工资之间。
8. 所在部门平均工资高于5000 的员工名字。
9. 列出各个部门中工资最高的员工的信息:名字、部门号、工资。
10. 最高的部门平均工资是多少。
———————————————
*/

各试题解答如下(欢迎大家指出不同的方法或建议!):

 

/*——–1、各个部门平均、最大、最小工资、人数,按照部门号升序排列。———*/
SQL
> SELECT DEPARTMENT_ID AS 部门号,AVG(SALARY) AS 平均工资
2         ,MAX(SALARY) AS 最高工资,MIN(SALARY)  AS 最低工资
3         ,COUNT(*AS 人数
4  FROM EMPLOYEES
5  GROUP BY DEPARTMENT_ID
6  ORDER BY DEPARTMENT_ID ASC;

部门号       平均工资       最高工资       最低工资         人数
—-         ———-         ———-         ———-         ———-
       10           4400               4400               4400                 1
20          9500              13000           6000                  2
30           4150              11000           2500                  6
40           6500               6500               6500                  1
50             3475.55555     8200               2100                 45
60           5760               9000               4200                  5
70          10000              10000              10000                  1
80             8973.85294     14000           6100                 34
90             21333.3333     24000              20000                  3
100           8600              12000           6900                  6
110          10150              12000           8300                  2
7000               7000               7000                  1

12 rows selected

/*——–2、各个部门中工资大于5000的员工人数。———*/
SQL
> SELECT DEPARTMENT_ID,COUNT(*FROM EMPLOYEES
2  WHERE SALARY > 5000
3  GROUP BY DEPARTMENT_ID;

DEPARTMENT_ID   COUNT(*)
———– ———-
           20          2
30          1
40          1
50          5
60          2
70          1
80         34
90          3
100          6
110          2
1

11 rows selected

/*——–3、各个部门平均工资和人数,按照部门名字升序排列。———*/SQL

> SELECT DPTNAME,AVG(SALARY),COUNT(*FROM
2         (SELECT
3             (SELECT DEPT.DEPARTMENT_NAME FROM DEPARTMENTS DEPT
4             WHERE DEPT.DEPARTMENT_ID = EMP.DEPARTMENT_ID) DPTNAME,
5             EMP.SALARY
6  FROM EMPLOYEES EMP)
7  GROUP BY DPTNAME
8  ORDER BY DPTNAME;

DPTNAME                        AVG(SALARY)   COUNT(*)
—————————- ———– ———-
Accounting                           10150          2
Administration                        
4400          1
Executive                      
21333.33333          3
Finance                               
8600          6
Human Resources                       
6500          1
IT                                    
5760          5
Marketing                             
9500          2
Public Relations                     10000          1
Purchasing                            
4150          6
Sales                          
8973.852941         34
Shipping                       
3475.555555         45
7000          1
12 rows selected

或者–

SQL
> SELECT DEPT.DEPARTMENT_NAME,AVG(EMP.SALARY),COUNT(*)
2  FROM EMPLOYEES EMP,DEPARTMENTS DEPT
3  WHERE EMP.DEPARTMENT_ID = DEPT.DEPARTMENT_ID
4  GROUP BY DEPT.DEPARTMENT_NAME
5  ORDER BY DEPT.DEPARTMENT_NAME;

DEPARTMENT_NAME                AVG(EMP.SALARY)   COUNT(*)
—————————- ————— ———-
Accounting                               10150          2
Administration                            
4400          1
Executive                      
21333.333333333          3
Finance                                   
8600          6
Human Resources                           
6500          1
IT                                        
5760          5
Marketing                                 
9500          2
Public Relations                         10000          1
Purchasing                                
4150          6
Sales                          
8973.8529411764         34
Shipping                       
3475.5555555555         45

11 rows selected
可以看到,这种方式,对于部门号为空的没有统计出来

/*——–4、列出每个部门中有同样工资的员工的统计信息,
列出他们的部门号,工资,人数。———
*/SQL

> SELECT EMP1.DEPARTMENT_ID,EMP1.SALARY,COUNT(*) CNT
2  FROM   EMPLOYEES EMP1,EMPLOYEES EMP2
3  WHERE  EMP1.DEPARTMENT_ID = EMP2.DEPARTMENT_ID AND
4          EMP1.SALARY = EMP2.SALARY
5          AND EMP1.EMPLOYEE_ID <> EMP2.EMPLOYEE_ID
6  GROUP BY EMP1.DEPARTMENT_ID,EMP1.SALARY;

DEPARTMENT_ID     SALARY        CNT
———– ———- ———-
           50    2200.00          2
50    2400.00          2
50    2500.00         20
50    2600.00          6
50    2700.00          2
50    2800.00          6
50    2900.00          2
50    3000.00          2
50    3100.00          6
50    3200.00         12
50    3300.00          2
50    3600.00          2
60    4800.00          2
80    7000.00          2
80    7500.00          2
80    8000.00          6
80    9000.00          2
80    9500.00          6
80   10000.00          6
80   10500.00          2
80   11000.00          2
90   20000.00          2

22 rows selected

/*——–5、列出同部门中工资高于1000 的员工数量超过2 人的部门,
显示部门名字、地区名称。———
*/SQL

> SELECT D.DEPARTMENT_NAME,L.CITY,COUNT(*)
2  FROM EMPLOYEES E,DEPARTMENTS D,LOCATIONS L
3  WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID AND
4         D.LOCATION_ID   = L.LOCATION_ID    AND
5         E.SALARY > 1000
6  GROUP BY D.DEPARTMENT_NAME,L.CITY
7  HAVING COUNT(*> 2;

DEPARTMENT_NAME                CITY                             COUNT(*)
—————————- —————————— ———-
IT                             Southlake                               5
Sales                          Oxford                                 
34
Finance                        Seattle                                 
6
Shipping                       South San Francisco                    
45
Executive                      Seattle                                 
3
Purchasing                     Seattle                                 
6

6 rows selected

 

 

/*——–6、哪些员工的工资,高于整个公司的平均工资,
列出员工的名字和工资(降序)。———
*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME,SALARY
2  FROM EMPLOYEES
3  WHERE SALARY > (
4        SELECT AVG(SALARY)
5        FROM EMPLOYEES
6        )
7  ORDER BY SALARY DESC;
FIRST_NAME
||||LAST_NAME                          SALARY
——————————————– ———-
Steven King                                      24000.00
Neena Kochhar                                    
20000.00
Lex De Haan                                      
20000.00
John Russell                                     
14000.00
Karen Partners                                   
13500.00
Michael Hartstein                                
13000.00
Nancy Greenberg                                  
12000.00
Alberto Errazuriz                                
12000.00
Shelley Higgins                                  
12000.00
Lisa Ozer                                        
11500.00
Den Raphaely                                     
11000.00
Gerald Cambrault                                 
11000.00
Ellen Abel                                       
11000.00
Eleni Zlotkey                                    
10500.00
Clara Vishney                                    
10500.00
Peter Tucker                                     
10000.00
Janette King                                     
10000.00
Harrison Bloom                                   
10000.00
Hermann Baer                                     
10000.00
Tayler Fox                                        
9600.00
共50条数据

/*——–7、哪些员工的工资,介于50号 和80号 部门平均工资之间。———*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME AS NAME,SALARY
2  FROM EMPLOYEES
3  WHERE SALARY
4  BETWEEN
5      (SELECT AVG(SALARY) FROM EMPLOYEES
6       WHERE DEPARTMENT_ID = 50)
7  AND (SELECT AVG(SALARY) FROM EMPLOYEES
8       WHERE DEPARTMENT_ID = 80);

NAME                                               SALARY
——————————————– ———-
Bruce Ernst                                       6000.00
David Austin                                      
4800.00
Valli Pataballa                                   
4800.00
Diana Lorentz                                     
4200.00
John Chen                                         
8200.00
Ismael Sciarra                                    
7700.00
Jose Manuel Urman                                 
7800.00
Luis Popp                                         
6900.00
Matthew Weiss                                     
8000.00
Adam Fripp                                        
8200.00
Payam Kaufling                                    
7900.00
Shanta Vollman                                    
6500.00
Kevin Mourgos                                     
5800.00
Renske Ladwig                                     
3600.00
Trenna Rajs                                       
3500.00
Christopher Olsen                                 
8000.00
Nanette Cambrault                                 
7500.00
Oliver Tuvault                                    
7000.00
Lindsey Smith                                     
8000.00
Louise Doran                                      
7500.00
Sarath Sewall                                     
7000.00
Mattea Marvins                                    
7200.00
David Lee                                         
6800.00
Sundar Ande                                       
6400.00
Amit Banda                                        
6200.00
William Smith                                     
7400.00
Elizabeth Bates                                   
7300.00
Sundita Kumar                                     
6100.00
Alyssa Hutton                                     
8800.00
Jonathon Taylor                                   
8600.00
Jack Livingston                                   
8000.00
Kimberely 
Grant                                   7000.00
Charles Johnson                                   
7211.00
Nandita Sarchand                                  
4200.00
Alexis Bull                                       
4100.00
Kelly Chung                                       
3800.00
Jennifer Dilly                                    
3600.00
Sarah Bell                                        
4000.00
Britney Everett                                   
3900.00
Jennifer Whalen                                   
4400.00
Pat Fay                                           
6000.00
Susan Mavris                                      
6500.00
William Gietz                                     
8300.00

43 rows selected

/*——–8、所在部门平均工资高于5000 的员工名字。———*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME AS NAME,SALARY
2  FROM EMPLOYEES
3  WHERE DEPARTMENT_ID IN
4        (SELECT DEPARTMENT_ID FROM EMPLOYEES
5         GROUP BY DEPARTMENT_ID
6         HAVING AVG(SALARY) > 5000);

NAME                                               SALARY
——————————————– ———-
Michael Hartstein                                13000.00
Pat Fay                                           
6000.00
Susan Mavris                                      
6500.00
Alexander Hunold                                  
9000.00
Bruce Ernst                                       
6000.00
David Austin                                      
4800.00
Valli Pataballa                                   
4800.00
Diana Lorentz                                     
4200.00
Hermann Baer                                     
10000.00
John Russell                                     
14000.00
Karen Partners                                   
13500.00
Alberto Errazuriz                                
12000.00
Gerald Cambrault                                 
11000.00
Eleni Zlotkey                                    
10500.00
Peter Tucker                                     
10000.00
David Bernstein                                   
9500.00
Peter Hall                                        
9000.00
Christopher Olsen                                 
8000.00
Nanette Cambrault                                 
7500.00
Oliver Tuvault                                    
7000.00
等54行数据…

/*——–9、列出各个部门中工资最高的员工的信息:名字、部门号、工资。———*/SQL

> SELECT FIRST_NAME ||   || LAST_NAME AS NAME
2         ,SALARY,DEPARTMENT_ID
3  FROM EMPLOYEES
4  WHERE (DEPARTMENT_ID,SALARY) IN
5        (SELECT