当前位置: 首页 > 作文大全 > 好词好句 > 复杂的语句

复杂的语句

2016-02-17 10:37:28 成考报名 来源:http://www.chinazhaokao.com 浏览:

导读: 复杂的语句篇一《复杂sql语句》 题目1 ...

以下是中国招生考试网www.chinazhaokao.com为大家整理的《复杂的语句》,希望大家能够喜欢!更多资源请搜索成考报名频道与你分享!

复杂的语句篇一
《复杂sql语句》

题目1  问题描述:  为管理学员培训信息,建立3个表:  S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄  C (C#,CN ) C#,CN 分别代表课程编号、课程名称  SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩  1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名  --实现代码:  SELECT SN,SD FROM S  WHERE [S#] IN(  SELECT [S#] FROM C,SC  WHERE C.[C#]=SC.[C#]  AND CN=N'税收基础')  2. 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位  --实现代码:  SELECT S.SN,S.SD FROM S,SC  WHERE S.[S#]=SC.[S#]  AND SC.[C#]='C2'  3. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位  --实现代码:  SELECT SN,SD FROM S  WHERE [S#] NOT IN(  SELECT [S#] FROM SC  WHERE [C#]='C5')  4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位  --实现代码:  SELECT SN,SD FROM S  WHERE [S#] IN(  SELECT [S#] FROM SC  RIGHT JOIN  C ON SC.[C#]=C.[C#] GROUP BY [S#]  HAVING COUNT(*)=(SELECT COUNT(*) FROM C) );  5. 查询选修了课程的学员人数  --实现代码:  SELECT 学员人数=COUNT(DISTINCT [S#]) FROM SC  6. 查询选修课程超过5门的学员学号和所属单位  --实现代码:  SELECT SN,SD FROM S  WHERE [S#] IN(  SELECT [S#] FROM SC  GROUP BY [S#]  HAVING COUNT(DISTINCT [C#])>5)题目2  问题描述:  已知关系模式:  S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名  C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师  SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩  1. 找出没有选修过“李明”老师讲授课程的所有学生姓名  --实现代码:  SELECT SNAME FROM S  WHERE NOT EXISTS(  SELECT * FROM SC,C  WHERE SC.CNO=C.CNO  AND CNAME='李明'  AND SC.SNO=S.SNO)  2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩  --实现代码:  SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)  FROM S,SC,(  SELECT SNO  FROM SC  WHERE SCGRADE<60  GROUP BY SNO  HAVING COUNT(DISTINCT CNO)>=2  )A WHERE S.SNO=A.SNO AND SC.SNO=A.SNO  GROUP BY S.SNO,S.SNAME  3. 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名  --实现代码:  SELECT S.SNO,S.SNAME  FROM S,(  SELECT SC.SNO  FROM SC,C  WHERE SC.CNO=C.C

NO  AND C.CNAME IN('1','2')  GROUP BY SNO  HAVING COUNT(DISTINCT CNO)=2  )SC WHERE S.SNO=SC.SNO  4. 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号  --实现代码:  SELECT S.SNO,S.SNAME  FROM S,(  SELECT SC1.SNO  FROM SC SC1,C C1,SC SC2,C C2  WHERE SC1.CNO=C1.CNO AND C1.NAME='1'  AND SC2.CNO=C2.CNO AND C2.NAME='2'  AND SC1.SCGRADE>SC2.SCGRADE  )SC WHERE S.SNO=SC.SNO  5. 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩  --实现代码:  SELECT S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]  FROM S,(  SELECT SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE  FROM SC SC1,C C1,SC SC2,C C2  WHERE SC1.CNO=C1.CNO AND C1.NAME='1'  AND SC2.CNO=C2.CNO AND C2.NAME='2'  AND SC1.SCGRADE>SC2.SCGRADE  )SC WHERE S.SNO=SC.SNO题目3:INNER JOIN返回的结果集是两个表中所有相匹配的数据。inner Join 内连接,也就是一般的相等连接用途:当你要从两个或者以上的表中选取结果集时,你就会用到INNER JOIN。例:“Employees”表中的数据如下,OID Name01 Hansen, Ola02 Svendson, Tove03 Svendson, Stephen04 Pettersen, Kari“Orders”表中的数据如下:ID Product01 Printer03 Table03 Chair用Employees的ID和Orders的ID相关联选取数据:SELECT Employees.Name, Orders.ProductFROM Employees, OrdersWHERE Employees.ID = Orders.ID返回结果:Name ProductHansen, Ola PrinterSvendson, Stephen TableSvendson, Stephen Chair或者你也可以用JOIN关键字来完成上面的操作:SELECT Employees.Name, Orders.ProductFROM EmployeesINNER JOIN OrdersON Employees.ID = Orders.IDINNER JOIN的语法:SELECT field1, field2, field3FROM first_tableINNER JOIN second_tableON first_table.keyfield = second_table.foreign_keyfield题目4:外联接。外联接可以是左向外联接、右向外联接或完整外部联接。 在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:LEFT JOIN 或 LEFT OUTER JOIN。 左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。RIGHT JOIN 或 RIGHT OUTER JOIN。 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹

配行,则将为左表返回空值。FULL JOIN 或 FULL OUTER JOIN。 完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回 FROM 子句中提到的至少一个表或视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外部联接中两个表的所有行都将返回。1. left outer join:左外关联select e.last_name, e.department_id, d.department_name from employees e left outer join departments d on (e.department_id = d.department_id);结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录。 2. right outer join:右外关联 select e.last_name, e.department_id, d.department_name from employees e right outer join departments d on (e.department_id = d.department_id);结果为:所有员工及对应部门的记录,包括没有任何员工的部门记录。 3. full outer join:全外关联 select e.last_name, e.department_id, d.department_name from employees e full outer join departments d on (e.department_id = d.department_id);结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录。

复杂的语句篇二
《数据库复杂语句》

1 课程名称: sql语句(二) 2 知识点概述

2.1、本次预备讲解的知识点

1、表之间的关联关系

2、多表的查询

3、分组统计

4、分页查询

3、具体内容

用Navicat 8 for Mysql 连接数据库基本操作如图:

1、建立连接

2、填写连接信息

3、双击以建立的连接名(connection_one)

4、双击要打开的数据库(db_temp)

5、单击右键,创建dept、emp表

6、填写dept、emp表结构详细信息 dept表

emp表

3.1、表之间的关联关系

复杂的语句篇三
《复杂查询语句的使用》

############################复杂查询语句的使用#####################################

1.查询语句的使用

使用 select语句和子查询(subquery)可以从一个或多个表,视图,实体试图中返回数据.

1.1相关子查询

可以将子查询(as subquery)或in或exists当成where的一个条件的一部分,这样的查询称为子查询

.where中可以包含一个select语句的子查询

.where中可以包含in,exists语句

.最多可以嵌套16层

.层次过多会影响性能

[例]简单子查询实例

查询是否有的专家既以研究所的名义来申请基金项目,又以大学系为单位申请项目 (按规定只能以一个单位来申请)

SQL> create table univ_subject

2 (

3 name varchar2(12) not null,

4 per_id number not null,

5 dept_name varchar2(20)

6 );

SQL> insert into univ_subject values('gaoqianjing',1001,'信息工程系');

SQL> insert into univ_subject values('wangbing',1002,'物理系');

SQL> insert into univ_subject values('liming',1003,'化学系');

===============

SQL> create table colle_subject

2 (

3 colle_name varchar2(20),

4 per_id number

5 );

SQL> insert into colle_subject values('电子研究所',1001);

SQL> insert into colle_subject values('物理研究所',1005);

================

SQL> select name,per_id,dept_name from univ_subject where per_id in

2 (select per_id from colle_subject);

NAME PER_ID DEPT_NAME

------------ --------- --------------------

gaoqianjing 1001 信息工程系

1.2外连接

[例]外连接实例

招生中所有学生的信息放在students表中,而部分有特长的学生在另一个表中stuent_skill中同样有该学生

的信息。现在要全部列出所有学生,如果某个学生在表student_skill中就有其特长信息,并显示特长信息,如果

某个学生没有特长就显示特长问空.

SQL> create table students

2 (

3 st_id varchar2(20),

4 name varchar2(10),

5 age number(2),

6 tol_score number(3)

7 ) ;

SQL> insert into students values('973231','wangbindu',22,501);

SQL> insert into students values('973232','zhuzhijing',21,538);

SQL> insert into students values('973233','gaojing',21,576);

===================

SQL> create table student_skill

2 (

3 st_id varchar2(20),

4 skill varchar2(20)

5 );

SQL> insert into student_skill values('973231','篮球');

SQL> insert into student_skill(st_id) values('973232');

SQL> insert into student_skill values('973233','足球');

===================

SQL> select a.* , b.skill from students a,student_skill b where a.st_id=b.st_id(+)

order by a.st_id;

ST_ID NAME AGE TOL_SCORE SKILL

-------------------- ---------- --------- --------- ------------------ --

973231 wangbindu 22 501 篮球

973232 zhuzhijing 21 538

973233 gaojing 21 576 足球

1.3自我连接

自我连接是在同一个表或视图内进行条件连接.

[例]自我连接实例

查询每个雇员的名字和该雇员的经理的名字:

SQL> select e1.ename||' work for '||e2.ename "Employees and their Managers"

2 from scott.emp e1,scott.emp e2 where e1.mgr=e2.empno;

Employees and their Managers

-------------------------------------------------

SMITH work for FORD

ALLEN work for BLAKE

WARD work for BLAKE

JONES work for KING

MARTIN work for BLAKE

BLAKE work for KING

CLARK work for KING

SCOTT work for JONES

TURNER work for BLAKE

ADAMS work for SCOTT

JAMES work for BLAKE

FORD work for JONES

MILLER work for CLARK

1.4UNION , INTERSECT及 MINUS

UNION: 可以将两个以上的表的相类似的查询结果放在一起 (union all则表示返回所有的行)

具体语法:

select ...

union[all]

select...

==========

INTERSECT: 返回两个表中相同的信息

具体语法:

select ...

intersect

select...

==========

MINUS : 返回一个表中出现的信息

具体语法:

select ...

minus

select...

[例1]UNION操作实例

SQL> select st_id from students

2 union

3 select st_id from student_skill;

ST_ID

--------------------

973231

973232

973233

[例2]INTERSECT操作实例

列出有特长的学生的学号

SQL> select st_id from students

2 intersect

3 select st_id from student_skill;

ST_ID

--------------------

973231

973233

[例3]MINUS操作实例

列出没有特长学生的学号

select st_id from students

minus

select st_id from student_skill;

ST_ID

--------------------

973232

2.创建复杂的视图

许多应用系统有统计等功能,建议最好把这些复杂语句写成视图.下面是几个常用的视图.

2.1分组视图

[例1]简单的分组视图

SQL> create or replace view dept_tot as

2 select a.dname dept,sum(b.sal) total_sal from scott.dept a,scott.emp b

3 where a.deptno=b.deptno group by a.dname;

查看已建立。

SQL> select * from dept_tot;

DEPT TOTAL_SAL

-------------- ---------

ACCOUNTING 8750

RESEARCH 10875

SALES 9400

[例2]带复杂函数视图

SQL> create or replace view itemtot as

2 select persion,sum(amount) itemtot from ledger

3 where actiondate between

4 to_date('01-MAR-1901','dd-mon-yyyy') and

5 to_date('31-MAR-1901','dd-mon-yyyy')

6 and action in('bought','raid') group by persion;

2.2合计视图

[例]合计函数视图实例

SQL> create or replace view emp_no1 as

2 select deptno,sum(sal) 工资和,sum(comm) 总和

3 from scott.emp group by deptno;

SQL> select * from emp_no1;

DEPTNO 工资和 总和

--------- --------- ---------

10 8750

20 10875

30 9400 2200

2.3组合视图

[例]带组合函数的视图

SQL> create or replace view byitem as

2 select l.persion persion.item, amount, 100*amount/item bypersion,100*amount/total bytotal 3 from ledgent l,itemtotal i,total where l.persion=i.persion where l.persion=i.persion 4 and actiondate between

5 to_date('01-MAR-1901','dd-mon-yyyy') and

6 to_date('31-MAR-1901','dd-mon-yyyy')

7 and action in('bought','raid') ;

3.家族树

语法:

select column from table_name start with column=value

connect by prior 父主键=子主键

3.1排除单一性和分枝

以ORACLE中的EMP表为例

[例]从顶到底列出各雇员的信息

SQL> select lpad(' ',4*(level-1))||ename name,empno,mgr from emp start with mgr is null 2 connect by prior empno=mgr;

NAME EMPNO MGR

--------- --------- ---------

KING 7839

JONES 7566 7839

SCOTT 7788 7566

ADAMS 7876 7788

3.2遍历至根

[例1]现在要从某个雇员开始向他的上级列出该雇员的层次结构

复杂的语句篇四
《oracle 复杂查询语句的使用》

1. 复杂查询语句的使用

在关系数据库中,select 语句是使用最频繁的语句。它的处理复杂程度可依据业务的要求的不同而不同。它是程序员和管理员必需的语句。前面已经进行过介绍,但下面从较为复杂的程度来介绍它的使用情况。

7.1 复杂查询语句的使用

使用SELECT语句和子查询(SUBQUERY)可以从一个或多个表、视图、实体视图中返回数据。

7.1.1 相关子查询

可以将子查询(前面提到的 as subquery )或In 或 exists当成 where 的一个条件的一部分,这样的查询称作子查询。

 where中可以包含一个select语句子查询;

 where中可以包含IN, EXISTS 语句;

 最多可嵌套16层;

 层数过多会影响性能。

例:比如一个查询是否有专家既以研究所的名义申请基金项目又以大学系为单位申请项目(按规定只能以一个单位来申请):

SQL>select name,per_id,dept_name from univ_subjects

Where per_id in ( select per_id from colle_subjects );

7.1.2 外连接

招生中,如果所有学生的信息放在 students 表中,而部分有特长的学生在另一个表student_skill 中同样有该学生信息。现在要全部列出所有学生,如果某个学生在表student_skill 中有其特长信息,就显示特长内容,如果某个学生没有特长(在表student_skill 中无其特长信息)就显示特长为空:

SQL>select a.st_id, name, age,skill from students a, student_skill b Where a.st_id=b.st_id(+)

Order by a.name;

Students 结构为:

St_id varchar(20),

Name varchar2(10),

Age number(2),

Tot_score number(3),

... ...

Student_skill 结构为:

St_id varchar(20),

Skill varchar2(20), ... ...

Students 的记录,Student_skill的记录少。上面的“+”跟在记录少的表后面,它表示当没有与a.st_id 匹配时就为 b.st_id增加一空行。

St_id name tot_score skill

---------- ---------- ------------- ------------------

1111 aaaa 600 足球

2222 bbbb 590 篮球

3333 cccc 620

4444 dddd 610 跳高

... ...

7.1.3 自我连接

自我连接是在同一个表或视图内进行条件连接。下面语句返回的是每个雇员的名字及该雇员的经理的名字:

SELECT e1.ename||’ works for ’||e2.ename

"Employees and their Managers"

FROM emp e1, emp e2 WHERE e1.mgr = e2.empno;

Employees and their Managers

-------------------------------

BLAKE works for KING

CLARK works for KING

JONES works for KING

FORD works for JONES

SMITH works for FORD

ALLEN works for BLAKE

WARD works for BLAKE

MARTIN works for BLAKE

SCOTT works for JONES

TURNER works for BLAKE

ADAMS works for SCOTT

JAMES works for BLAKE

MILLER works for CLARK

连接条件是 e1.mgr = e2.empno

7.1.4 UNION,INTERSECT及MINUS

有时需要从多个表中组合具有一种相似类型的信息。Union 可以完成将两个以上的表的相类似的查询结果合并在一起,并且相同的只取其一;如果union all 则表示返回所有行(不管是否重复)。Intersect返回在两个表中都有相同内容的信息。Minus 则返回只在一个表中出现的信息。

1. 语法:

select ...

union[all]

select ...

select ...

intersect

select ...

select ...

minus

select ...

例:

sql>

select sum(balance) into lf_return from

(

select sum(nvl(tran_val,0)*decode(db_cr_flag,'1',1,'0',-1,0) ) balance from per_fix_det

where acc_no=as_acc_no

union all

select sum(nvl(tran_val,0)*decode(db_cr_flag,'1',1,'0',-1,0) ) balance from per_detail

where acc_no=as_acc_no

);

列出有特长的考生(在表students,student_skill 同时出现):

sql>select name from sutdents

intersect

select name from student_skill;

列出没有特长的考生(仅在表students出现):

sql>select name from sutdents

minus

select name from student_skill;

7.2 创建复杂的视图

许多应用系统都可能有统计等功能,没有经验的开发者可能在开发工具端来写这些语句。比如在POWER BUILDER 中加上复杂的统计与排序等处理。其实,这样很不好。建议把这些复杂语句写成视图更好。下面就介绍几个常用的视图。

7.2.1 分组视图

例1:

CREATE OR REPLACE VIEW dept_tot as

select a.dname dept,sum(b.sal) total_sal from dept a,emp b

where a.deptno=b.deptno group by a.dname

例2:

CRATE OR REPLACE ITEMTOT AS

SELECT PERSION,SUM(AMOUNT) ITEMTOT

FROM LEDGER

WHERE ACTIONDATE BETWEEN

TO_DATE(‘01-MAR-1901’,’DD-MON-YYYY’) and

TO_DATE(‘31-MAR-1901’,’DD-MON-YYYY’)

And ACTION IN ( ‘BOUGHT’,’RAID’)

GROUP BY PERSION;

7.2.2 合计视图

例:

CREATE VIEW empvi AS

SELECT DEPTNO,SUM(SAL),SUM(COMM)

FROM EMP GROUP BY DEPTNO;

7.2.3 组合视图

例:

CREATE OR REPLACE VIEW BYITEM AS

SELECT L.persion persion.item,

Amount,

100*amount/itemtotal bypersion, 100*amount/total bytotal

from ledgerl L ,iteamtotal I, total

where L.persion=I.persion

and actiondate between

to_date(‘01-MAR-1901’,’DD-MON-YYYY’) and

TO_date(‘31-MAR-1901’,’DD-MON-YYYY’)

And ACTION IN(‘BOUGHT’,’PAID’);

7.3 家族树

ORACLE 提供了一个有趣的功能 connect by 子句,它可以对具有家族树结构的分枝进行排序。它的用途有 机构或公司的各层结构,财务的科目代码等。

要使用查询遍历,需要在将数据在基表中按照层次结构进行存储。比如一个组织机构就是这样的典型例子。

实现语句:

SELECT column

FROM table_name

START WITH column=value

CONNECT BY PRIOR 父主键=子外键

7.3.1 排除单一体和分枝

例1:在ORACLE的EMP 表中,每一条记录都有一个唯一标识当前雇员的empno和标识这个雇员的经理的mgr列。如果mgr 为空,则该雇员是该机构的最顶级。现在要列出每个雇员的层次结构(从顶到底):

select lpad(' ',4*(level-1))||ename name ,empno,mgr from emp

start with mgr is null

connect by prior empno=mgr;

NAME EMPNO MGR

-------------------- --------- ---------

复杂的语句篇五
《第二讲复杂SQL语句》

复杂的语句篇六
《复杂查询语句的使用》

复杂的语句篇七
《SQL操作之复杂的SELECT语句》

1.集合操作:

Union 用第二个查询结果合并第一个查询结果,同时不显示重复的行。 Union all 检索出所有的行,包括重复的行。

intersect 返回两个查询所检索出的共有行。

minus 返回将第二个查询检索出的行从第一个查询检索出的行中减去之后剩余的行。

select ename,dname,job

from dept t,emp p

where t.deptno=p.deptno and t.dname='SALES'

union/intersect/minus

select ename,dname,job

from dept t,emp p

where t.deptno=p.deptno and p.job='MANAGER';

2.子查询:

可以在一个select语句中嵌入另一个完整的select语句,但此句的子查询的返回结果只能有一个,如想返回多个可用 in 。

select ename,dname,job

from dept t,emp p

where t.deptno=p.deptno and t.dname=

(

select dname

from dept t,emp p

where t.deptno=p.deptno and p.sal=1600.00

);

select ename,dname,job

from dept t,emp p

where t.deptno=p.deptno and t.dname in

(

select dname

from dept t,emp p

where t.deptno=p.deptno and p.sal>3000.00

);

3.表的连接:

select t.dname

from emp p,dept t

where p.deptno=t.deptno and p.ename='SMITH';

由于实施了关系连接的两表是任何连接的,所有需要在where子句中设置主关键字等于外部关键字的条件,否则查询结果不对。

4.case语句:

*简单case语句,使用表达式确定返回值,但case后的变量只有一个; select t.dname,t.loc,t.deptno,

case t.deptno

when 10 then 'ACCOUNTING'

when 20 then 'RESEARCH'

when 30 then 'SALES'

else 'T'

end

from dept t;

*搜索case语句,使用条件确定返回值,但when后面可以跟多个条件。 select t.dname,t.loc,t.deptno,

case

when t.deptno=10 and t.loc='CHICAGO' then 'ACCOUNTING' when t.deptno=20 then 'RESEARCH'

when t.deptno=30 then 'SALES'

else 'T'

end

from dept t;

5.decode函数:

decode(value,search_value,result,default_value)

如果value和search_value相等,则返回result,否则返回default_value。 select t.dname,t.loc,t.deptno,

decode(t.deptno,

10,'ACCOUNTING',

20,'RESEARCH',

30,'SALES',

'T'

)

from dept t;

以上就是中国招生考试网http://www.chinazhaokao.com/带给大家的精彩成考报名资源。想要了解更多《复杂的语句》的朋友可以持续关注中国招生考试网,我们将会为你奉上最全最新鲜的成考报名内容哦! 中国招生考试网,因你而精彩。

相关热词搜索:复杂的sql语句 复杂的sql查询语句 复杂sql语句的优化

最新推荐成考报名

更多
1、“复杂的语句”由中国招生考试网网友提供,版权所有,转载请注明出处。
2、欢迎参与中国招生考试网投稿,获积分奖励,兑换精美礼品。
3、"复杂的语句" 地址:http://www.chinazhaokao.com/zuowen/haocihaoju/241576.html,复制分享给你身边的朋友!
4、文章来源互联网,如有侵权,请及时联系我们,我们将在24小时内处理!