oracle查询结果的排序,ASC/DESC,升序,降序,多列排序,ORDERBY
oracle查询结果的排序,ASC/DESC,升序,降序,多列排序,ORDER BY,一些练习题
关键字:oracle查询结果排序asc desc升序降序多列order by一些练习题
查询结果的排序
显示EMP表中不同的部门编号。
如果要在查询的同时排序显示结果,可以使用如下的语句:
Sql代码
SELECT字段列表FROM表名WHERE条件
ORDER BY字段名1[ASC|DESC][,字段名2[ASC|DESC]...];
SELECT字段列表FROM表名WHERE条件
ORDER BY字段名1[ASC|DESC][,字段名2[ASC|DESC]...];
ORDER BY从句后跟要排序的列。ORDER BY从句出现在SELECT语句的最后。
排序有升序和降序之分,ASC表示升序排序,DESC表示降序排序。如果不指明排序顺序,默认的排序顺序为升序ASC。如果要降序,必须书写DESC关键字
1.升序排序
【训练1】查询雇员姓名和工资,并按工资从小到大排序。
输入并执行查询:
Sql代码
SELECT ename,sal FROM emp ORDER BY sal;
SELECT ename,sal FROM emp ORDER BY sal;
执行结果为:
Sql代码
ENAME SAL
---------------------------------
SMITH800
JAMES950
ENAME SAL
---------------------------------
SMITH800
JAMES950
注意:若省略ASC和DESC,则默认为ASC,即升序排序。2.降序排序
【训练2】查询雇员姓名和雇佣日期,并按雇佣日期排序,后雇佣的先显示。
输入并执行查询:
Sql代码
SELECT ename,hiredate FROM emp ORDER BY hiredate DESC;
SELECT ename,hiredate FROM emp ORDER BY hiredate DESC;
结果如下:
Sql代码
ENAME HIREDATE
------------------------------------
ADAMS23-5月-87
SCOTT19-4月-87
MILLER23-1月-82
JAMES03-12月-81
FORD03-12月-81
ENAME HIREDATE
------------------------------------
ADAMS23-5月-87
SCOTT19-4月-87
MILLER23-1月-82
JAMES03-12月-81
FORD03-12月-81
注意:DESC表示降序排序,不能省略。
3.多列排序
可以按多列进行排序,先按第一列,然后按第二列、第三列......。
【训练3】查询雇员信息,先按部门从小到大排序,再按雇佣时间的先后排序。
输入并执行查询:
Sql代码
SELECT ename,deptno,hiredate FROM emp ORDER BY deptno,hiredate;
SELECT ename,deptno,hiredate FROM emp ORDER BY deptno,hiredate;
结果如下:
Sql代码
ENAME DEPTNO HIREDATE
------------------------------------------------
CLARK1009-6月-81
KING1017-11月-81
MILLER1023-1月-82
SMITH2017-12月-80
JONES2002-4月-81
FORD2003-12月-81
SCOTT2019-4月-87
ENAME DEPTNO HIREDATE
------------------------------------------------
CLARK1009-6月-81
KING1017-11月-81
MILLER1023-1月-82
SMITH2017-12月-80
JONES2002-4月-81
FORD2003-12月-81
SCOTT2019-4月-87
说明:该排序是先按部门升序排序,部门相同的情况下,再按雇佣时间升序排序。
4.在排序中使用别名
如果要对计算列排序,可以为计算列指定别名,然后按别名排序。
【训练4】按工资和工作月份的乘积排序。
输入并执行查询:
Sql代码
SELECT empno,ename,sal*Months_between(sysdate,hiredate)AS total FROM emp
ORDER BY total;
SELECT empno,ename,sal*Months_between(sysdate,hiredate)AS total FROM emp
ORDER BY total;
执行结果为:
Sql代码
EMPNO ENAME TOTAL
-----------------------------------------------7876ADAMS221526.006
7369SMITH222864.661
7900JAMES253680.817
7654MARTIN336532.484
EMPNO ENAME TOTAL
-----------------------------------------------7876ADAMS221526.006
7369SMITH222864.661
7900JAMES253680.817
7654MARTIN336532.484
sysdate获取当前日期。
练习题:
1.SQL语言中用来创建、删除及修改数据库对象的部分被称为:
A.数据库控制语言(DCL)
B.数据库定义语言(DDL)
C.数据库操纵语言(DML)
D.数据库事务处理语言
2.执行以下查询,表头的显示为:
Sql代码
SELECT sal"Employee Salary"FROM emp
SELECT sal"Employee Salary"FROM emp
A.EMPLOYEE SALARY
B.employee salary
C.Employee Salary
D."Employee Salary“
3.执行如下两个查询,结果为:
Sql代码
SELECT ename name,sal salary FROM emp order by salary;
SELECT ename name,sal"SALARY"FROM emp order by sal ASC;
SELECT ename name,sal salary FROM emp order by salary;
SELECT ename name,sal"SALARY"FROM emp order by sal ASC;
A.两个查询结果完全相同
B.两个查询结果不相同
C.第一个查询正确,第二个查询错误
D.第二个查询正确,第一个查询错误
4.参考本章的emp表的内容执行下列查询语句,出现在第一行上的人是:
Sql代码
SELECT ename FROM emp WHERE deptno=10ORDER BY sal DESC;
SELECT ename FROM emp WHERE deptno=10ORDER BY sal DESC;
A.SMITH
B.KING
https://www.wendangku.net/doc/c82576189.html,LER
D.CLARK
5.哪个函数与||运算有相同的功能:
A.LTRIM
B.CONCAT
C.SUBSTR
D.INSTR
6.执行以下语句后,正确的结论是:
Sql代码
SELECT empno,ename FROM emp WHERE hiredate SELECT empno,ename FROM emp WHERE hiredate A.显示给定日期后100天以内雇佣的雇员信息 B.显示给定日期前100天以内雇佣的雇员信息 C.显示给定日期100天以后雇佣的雇员信息 D.显示给定日期100天以前雇佣的雇员信息 7.执行以下语句出错的行是: Sql代码 SELECT deptno,max(sal)FROM emp WHERE job IN('CLERK','SALEMAN','ANALYST') GROUP BY deptno HAVING sal>1500; SELECT deptno,max(sal)FROM emp WHERE job IN('CLERK','SALEMAN','ANALYST') GROUP BY deptno HAVING sal>1500; A.第一行 B.第二行 C.第三行 D.第四行 8.执行以下语句出错的行是: Sql代码 SELECT deptno,max(avg(sal)) FROM emp WHERE sal>1000 Group by deptno; SELECT deptno,max(avg(sal)) FROM emp WHERE sal>1000 Group by deptno; A.第一行B.第二行 C.第三行 D.第四行 9.执行以下语句出错的行是:Sql代码 SELECT deptno,dname,ename,sal FROM emp,dept WHERE emp.deptno=dept.deptno AND sal>1000; SELECT deptno,dname,ename,sal FROM emp,dept WHERE emp.deptno=dept.deptno AND sal>1000; A.第一行 B.第二行 C.第三行 D.第四行 10.以下语句出错,哪种改动能够正确执行:Sql代码 SELECT deptno,max(sal) FROM emp GROUP BY deptno WHERE max(sal)>2500; SELECT deptno,max(sal) FROM emp GROUP BY deptno WHERE max(sal)>2500; A.将WHERE和GROUP BY语句顺序调换一下 B.将WHERE max(sal)>2500语句改成HAVING max(sal)>2500 C.将WHERE max(sal)>2500语句改成WHERE sal>2500 D.将WHERE max(sal)>2500语句改成HAVING sal>2500 11.以下语句的作用是: Sql代码 SELECT ename,sal FROM emp WHERE sal<(SELECT min(sal)FROM emp)+1000; SELECT ename,sal FROM emp WHERE sal<(SELECT min(sal)FROM emp)+1000; A.显示工资低于1000元的雇员信息 B.将雇员工资小于1000元的工资增加1000后显示 C.显示超过最低工资1000元的雇员信息 D.显示不超过最低工资1000元的雇员信息 12.以下语句的作用是: Sql代码 SELECT job FROM emp WHERE deptno=10 MINUS SELECT job FROM emp WHERE deptno=20; SELECT job FROM emp WHERE deptno=10 MINUS SELECT job FROM emp WHERE deptno=20; 许多软件公司都理解开发不依赖于特定数据库类型(例如Oracle、SQL Server、DB2)的应用程序的重要性,它可以让客户们选择自己习惯的平台。一般来说,软件开发人员都能够识别出他们的负责数据库维护的客户,和必须使用现有平台和个性化的客户。 关于Oracle和SQL Server之间的区别,已经有很多篇文章从企业的角度和数据库管理员的角度出发描写了两者之间的一般差别。在这篇文章里面,我将会从应用程序的角度向你描述SQL erver 和oracle平台之间的区别,并且将会讨论开发不依赖于数据库环境的应用程序的几种可能的方法。与此同时,我不会再论讨对于应用程序来说,两个平台之间显而易见的区别,例如表的分割和索引。 定义通用接口和语言有很少的几种通用语言和接口可以让应用程序不依赖于数据库,想来也可以以同样的方式应用在关系型数据库上面: ANSI是美国国家标准局定义的,这是一家志愿者成员的组织(用私人基金运转),他们在有关设备和程序等广泛领域内开发了国家承认的标准。在数据库领域, ANSI定义了编写SQL命令的标准,假设命令可以运行在任何的数据库上,而不需要更改命令的语法。 ODBC是开放数据库连接(ODBC)接口,微软定义的,它可以让应用程序访问数据库管理系统(DBMS)中的数据,使用SQL作为访问数据的标准。 ODBC允许最大的互联性,这意味着一个单个的应用程序可以访问不同的数据库管理系统。然后,应用程序终端用户可以添加开放数据库连接(ODBC)数据库驱动来将应用程序与他们所选择的数据库管理系统链接上。 OLE DB 是ODBC的继承者,是一组允许例如基于VB、C++、Access等任何可以连接到类似SQL Server、Oracle、DB2、MySQL等后台的“前台”的软件组件。在许多种情况下,OLE DB组件都比原有的ODBC提供了好得多的性能。 JDBC(Java数据库连接)应用程序接口是Java编程语言和广泛范围的数据库,SQL数据库和其他表列数据源(例如电子表格或者普通文本文件)之间,进行不依赖于数据库的连接的行业标准。JDBD应用程序接口为基于SQL的数据库访问提供了调用级别的应用程序接口。真实世界中的通用接口不幸的是,并不是所有数据库级别的命令都是ANSI,每个数据库平台都有自己的扩展功能。对于ANSI或者通用接口,一般来说都代表着几本功能,因此也可能意味着丧失了性能方面的竞争力。对于小型数据库和小型应用程序来说,要维护对数据库的通用访问是简单的,但是当数据库和/或应用程序变得越来越大,越来越复杂,你就不得不向代码中添加功能。 SQL Server和Oracle的常用函数对比 ---------数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from dual 根据下面三个关系模式完成下面习题:答案已设为白色需要就全选设为黑色学生表student 第一章课件:编写基本的sql语句。 1.查询所有学生情况。 3.查询所有学生的姓名,性别以及年龄。 5.查询所有学生10年后的年龄。 7.查询所有课程(列名用中文显示)。 9.查看竟有那些学生选课(重复学号显示一次)。 11.显示课程表的边结构。第二章课件:约束和排序数据。 01.查询计算机系的所有学生的姓名和年龄。 02.查询体育课的学分。 03.查询年龄小于18的学生。 04.查询年龄大于20的学生。 05.查询年龄介于18和20之间的学生(包括18和20)。 06.查询年龄不在18和20之间的学生。 07.查询年龄为18,20,22的学生。 08.查询年龄不是18,20,22的学生。 09.查询所有姓张的学生。 10.查询所有没有先行课的课程。 11.查询有先行课的课程。 12.在计算机系中找,姓张的男生。 13.在计算机系中找,姓张的或者姓李的男生并且按照年龄从大到小排序。 14.查询所有学生信息,显示结果先按系从大到小排序,再按年龄排序。 第三章课件:多表查询 1.查询每个学生(学号)选了哪门课(课程)得了多少分 2.查询每个学生(姓名)选了哪门课(课程号)得了多少分 3.查询每个学生(姓名)选了哪门课(课程名)得了多少分 4.查询一下王林选可哪门课得了多少分。 5.查询每个学生的成绩类别(优、良还是及格)。 6.查询哪个学生没有选课(用外查询)。 7.查询哪门课没有人选(用外查询)。 第四章课件:组函数 1.查询一下所有课程的平均分,最高分,最低分和总分数。 2.查询一下有多少个学生参加选课。 3.查询一下计算机系有多少人过20岁。 4.统计一下计算机系的男生多少人。 5.查询一下每个学生考试的最高分和最低分。 6.查询每门课(课程号)的最高分和最底分。 7.查询每门课(课程名)的最高分和最底分。 8.查询计算机系中男生多少人,女生多少人。 9,查询人数在三百人以上的系。 10.查询选修人数在三人(包括三人)的课程(课程名)。 11.查询各科考试成绩最低的同学。 12.查询考试成绩小于所选课程平均分的人。(有能力的同学选做) 第五章课件:子查询 1.查询所有比王林大的同学信息。 2.查询和王林同在一个系的所有学生信息。 3.查询一下谁的成绩(所有成绩)最低。 4.查询一下每门课成绩最底的同学(要姓名,和成绩)。 5.查询一下哪个学生没有选课(用子查询)。 6.查询一下哪门课没有人选(用子查询)。 7.查询一下和王林一个系,但是比他年龄大的同学。 第六章课件:ddl语句 1.创建以上四个表,要求每个表必须有主键,表和表之间必须有外间关联。 3.写出insert语句,给表添加以上数据。 5.提交所有操作。 7.将王林的年龄设置为空。 9.将张大民调到计算机系。 11.将体育课的学分设置成和管理学学分一样(update 中带有子查询)。 13.回滚所有操作。 9.某公司印了一批充值卡,卡的密码是随机生成的,现在出现这个问题:卡里面的“o和0”(哦和零)“i和1”(哎和一),用户反映说看不清楚,公司决定,把存储在数据 稳定排序和不稳定排序 这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。 其次,说一下稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,对基于比较的排序算法而言,元素交换的次数可能会少一些(个人感觉,没有证实)。 回到主题,现在分析一下常见的排序算法的稳定性,每个都给出简单的理由。 (1)冒泡排序 冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。 (2)选择排序 选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。 (3)插入排序 插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。 (4)快速排序 快速排序有两个方向,左边的i下标一直往右走,当a[i] <= a[center_index],其中center_index是中枢元素的数组下标,一般取为数组第0个元素。而右边的j下标一直往左走,当a[j] > a[center_index]。如果i和j都走不动了,i <= j, 交换a[i]和a[j],重复上面的过程,直到i>j。交换a[j]和a[center_index],完成一趟快速排序。在中枢元素和a[j]交换的时 推荐一、简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和Where子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。Select nickname,email FROM testtable Where n ame=’张三’ (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。 1、选择所有列例如,下面语句显示testtable表中所有列的数据:Select * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 例如:Select nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名列名列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题: Select 昵称=nickname,电子邮件=email FROM testtable 4、删除重复行 Select语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINC T选项时,对于所有重复的数据行在Select返回的结果集合中只保留一行。 5、限制返回的行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如: Select TOP 2 *FROM testtable Select TOP 20 PERCENT * FROM testtable (二) FROM子句 FROM子句指定Select语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。 在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和cityta ble表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定: Select username,citytable.cityid FROM usertable,citytable Where usertable.cityid=citytable.cityid 在FROM子句中可用以下两种格式为表或视图指定别名: 表名 as 别名表名别名 Oracle常见数值函数 ----***特别说明***: x 可以是纯的数值,也可以是数值型表达式/* ABS(x)返回x绝对值 eg. */ selectabs(100),abs(-100) from dual; /* sign(x)判断x的正负,正数返回1,负数返回-1,0返回0; eg. */ selectsign(100),sign(-100),sign(0) from dual; /* round(x[,n])对x进行四舍五入,保留n位小数,其中n采用其整数部分; 没有n时默认四舍五入到整数位,n为负数时,四舍五入保留小数点左边n位(补零), eg. */ selectround(5555.6666, 2.1), round(5555.6666, -2.6), round(5555.6666) from dual; /* trunc(x)对x进行直接截取,保留n位小数,其中n采用其整数部分; 没有n时默认截取到整数位,n为负数时,截取保留小数点左边n位(补零), eg. */ selecttrunc(5555.66666,2.1), trunc(5555.66666,-2.6), trunc(5555.033333) from dual; /* ceil(x)对x进行向上取整,返回不小于x的最小整数(可以是整数x本身)。 eg. */ selectceil(3.1), ceil(2.8+1.3), ceil(0) from dual; /* floor(x)对x进行向下取整,返回不大于x的最大整数(可以是整数x本身)。eg. */ selectfloor(3.1), floor(2.8+1.3), floor(0) from dual; /* mod(x,y)求x除以y的余数,x,y为数字型表达式。 eg. */ selectmod(23,8),mod(24,8) from dual; Sql Server排序规则的简介、选择、应用 一、排序规则简介: 什么叫排序规则呢?MS是这样描述的:"在Microsoft SQL Server 中, 字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存 储和比较字符所使用的规则。" 在查询分析器内执行下面语句,可以得到SQL SERVER支持的所有排序规则。 select * from ::fn_helpcollations() 排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。 如: Chinese_PRC_CS_AI_WS 前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则,按拼音排序。 Chinese_PRC_Stroke 表示按汉字笔画排序; 排序规则的后半部份即后缀含义: _BIN 二进制排序 _CI(CS) 是否区分大小写,CI不区分,CS区分(case-insensitive/case-sensitive) _AI(AS) 是否区分重音,AI不区分,AS区分(accent-insensitive/accent-sensitive) _KI(KS) 是否区分假名类型,KI不区分,KS区分(kanatype-insensitive/kanatype-sensitive) _WI(WS) 是否区分宽度WI不区分,WS区分(width-insensitive/width-sensitive) 区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。 区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项, 比较还将重音不同的字母视为不等。 区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。 区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项。 二、排序规则选择: 如果SQL Server 实例的所有用户都使用同一种语言,则应选取支持该语言的排序规则。例如,如果所有用户都讲法语,则选择法语排序规则。如果您的SQL Server 实例的用户讲多种语言,则应选择能最好地满足各种语言需要的排序规则。例如,如果用户一般都讲西欧语言,则选择Latin1_General 排序规则。 如果要支持讲多种语言的用户,则对于所有字符数据使用Unicode 数据类型nchar、nvarchar 和nvarchar(max) 是非常重要的。Unicode 可避免非Unicode 的char、varchar 和text 数据类型带来的代码页转换难题。因为排序规则定义用于比较操作的排序次序和Unicode 字符的排序,所以当用Unicode 数据类型实现所有列时,排序规则仍会产生不同。即使使用Unicode 数据类型存储字符数据时,也应选择支持大多数用户的排序规则,以防使用非Unicode 数据类型实现列或变量。 SQL Server 只支持由基础操作系统支持的代码页。在执行取决于排序规则的操作时,引用的对象所使用的SQL Server 排序规则必须使用计算机上运行的操作系统所支持的代码页。 如果指定的排序规则(或引用的对象所使用的排序规则)使用Windows 操作系统不支持的代码页,则SQL Server 将发出错误。对此错误的响应取决于计算机上安装的Windows 操作系统的版本。Windows 2000 及更新版本支持由SQL Server 排序规则使用的所有代码页。因此,不会出现该错误消息。 Oracle常用函数/过程说明主要介绍Oracle的系统函数、过程和包。 SQL常用函数: 数值函数: ABS Purpose 返回绝对值 Returns the absolute value of n. Example SELECT ABS(-15) "Absolute" FROM DUAL; Absolute ---------- 15 CEIL Purpose 取最小整数 Returns smallest integer greater than or equal to n. Example SELECT CEIL(15.7) "Ceiling" FROM DUAL; Ceiling ---------- 16 * MOD Syntax MOD(m,n) Purpose 取余 Returns remainder of m divided by n. Returns m if n is 0. Example SELECT MOD(11,4) "Modulus" FROM DUAL; Modulus ---------- 3 * ROUND Syntax ROUND(n[,m]) Purpose 取四舍五入信息 Returns n rounded to m places right of the decimal point; if m is omitted, to 0 places. m can be negative to round off digits left of the decimal point. m must be an integer. 实验五 查找及排序 实验课程名: 数据结构与算法 一、实验目的及要求 1、掌握查找的不同方法,并能用高级语言实现查找算法。 2、熟练掌握顺序表的查找方法和有序顺序表的折半查找算法。 3、掌握常用的排序方法,并能用高级语言实现排序算法。 4、深刻理解排序的定义和各种排序方法的特点,并能加以灵活运用。 5、了解各种方法的排序过程及依据的原则,并掌握各种排序方法的时间复杂度的分析方法。 二、实验内容 任务一:顺序表的顺序查找。 有序表的折半查找。 完成下列程序,该程序实现高考成绩表(如下表所示)的顺序查找,在输出结果中显示查找成功与查找不成功信息。 解答: (1)源代码:#include 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实作出来,且在大部分真实世界的资料,可以决定设计的选择,减少所需时间的二次方项之可能 递回关系式为: T(n) = O(n) + T(1) + T(n - 1) = O(n) + T(n - 1) 这与插入排序和选择排序有相同的关系式,以及它被解为T(n) = O(n2)。 [编辑] 乱数快速排序的期望复杂度 乱数快速排序有一个值得注意的特性,在任意输入资料的状况下,它只需要O(n log n)的期望时间。是什么让随机的基准变成一个好的选择?假设我们排序一个数列,然后把它分为四个部份。在中央的两个部份将会包含最好的基准值;他们的每一个至少都会比25%的元素大,且至少比25%的元素小。如果我们可以一致地从这两个中央的部份选出一个元素,在到达大小为1的数列前,我们可能最多仅需要把数列分割2log2 n 次,产生一个 O(nlogn)算法。 不幸地,乱数选择只有一半的时间会从中间的部份选择。出人意外的事实是这样就已经足够好了。想像你正在翻转一枚硬币,一直翻转一直到有 k 次人头那面出现。尽管这需要很长的时间,平均来说只需要 2k 次翻动。且在 100k 次翻动中得不到 k 次人头那面的机会,是像天文数字一样的非常小。借由同样的论证,快速排序的递回平均只要 2(2log2 n)的呼叫深度就会终止。但是如果它的平均呼叫深度是O(log n)且每一阶的呼叫树状过程最多有 n 个元素,则全部完成的工作量平均上是乘积,也就是 O(n log n)。 [编辑] 平均复杂度 即使如果我们无法随机地选择基准数值,对于它的输入之所有可能排列,快速排序仍然只需要O(n log n)时间。因为这个平均是简单地将输入之所有可能排列的时间加总起来,除以n这个因子,相当于从输入之中选择一个随机的排列。当我们这样作,基准值本质上就是随机的,导致这个算法与乱数快速排序有一样的执行时间。 更精确地说,对于输入顺序之所有排列情形的平均比较次数,可以借由解出这个递回关系式可以精确地算出来。 在这里,n-1 是分割所使用的比较次数。因为基准值是相当均匀地落在排列好的数列次序之任何地方,总和就是所有可能分割的平均。 这个意思是,平均上快速排序比理想的比较次数,也就是最好情况下,只大约比较糟39%。这意味着,它比最坏情况较接近最好情况。这个快 实验二:简单查询和连接查询 一、实验目的:熟练掌握用SQL语句实现的简单查询和多个数据表连接查询。 二、实验内容: (一)完成下面的简单查询: ①查询所有“天津”的供应商明细; ②查询所有“红色”的14公斤以上的零件。 ③查询工程名称中含有“厂”字的工程明细。 (二)完成下面的连接查询: ①等值连接:求s表和j表的相同城市的等值连接。 ②自然连接:查询所有的供应明细,要求显示供应商、零件和工程的名称,并按照供应、工程、零件排序。 ③笛卡尔积:求s和p表的笛卡尔积 ④左连接:求j表和spj表的左连接。 ⑤右连接:求spj表和j表的右连接。 三、完成情况: 成功完成各项查询任务查询的sql语句如下: SELECT* FROM S WHERE CITY='天津'; SELECT* FROM P WHERE COLOR='红'AND WEIGHT>=14; SELECT* FROM J WHERE JNAME like'%厂'; SELECT* FROM S,J WHERE S.CITY=J.CITY; select SPJ.SNO,S.SNAME,SPJ.PNO,P.PNAME,SPJ.JNO,J.JNAME,SPJ.QTY from S,P,J,SPJ where S.SNO=SPJ.SNO AND P.PNO=SPJ.PNO AND J.JNO=SPJ.JNO ORDER BY QTY; select* from S,P SELECT J.JNO,J.JNAME,J.CITY,SPJ.SNO,SPJ.PNO,QTY FROM J LEFT JOIN SPJ on(J.JNO=SPJ.JNO); SELECT J.JNO,J.JNAME,J.CITY,SPJ.SNO,SPJ.PNO,QTY FROM J right JOIN SPJ on(J.JNO=SPJ.JNO); SELECT J.JNO,J.JNAME,J.CITY,SPJ.SNO,SPJ.PNO,QTY FROM SPJ right JOIN J on(J.JNO=SPJ.JNO); 四、实验结果: ①查询所有“天津”的供应商明细; SNO SNAME STATUS CITY S1 精益 20 天津 S4 丰盛泰 20 天津 ②查询所有“红色”的14公斤以上的零件。 PNO PNAME COLOR WEIGHT P1 螺母红17 P4 螺丝刀红19 P6 齿轮红35 (会出现这样的情况,是因为在实验一中,执行过将所有红色零件的weight加5,所以会如此) ③查询工程名称中含有“厂”字的工程明细。 JNO JNAME CITY J3 弹簧厂天津 J4 造船厂天津 J5 机车厂唐山 J6 无线电厂常州 J7 半导体厂南京 (第一次查询结果居然为空,,,经检查,原来是模糊查询那块儿,谓词应该用like自己却忘了,还是用的=) ①等值连接:求s表和j表的相同城市的等值连接。 SNO SNAME STATUS CITY JNO JNAME CITY Oracle笔记 实现中英文转换 Alter session set nls_language=‘ADMIN’ 从已知表中复制数据和结构 Create table test as select * from dept; 从已知表中复制数据和结构,但是不包括数据 Create table test as select * from dept where 1=2 插入数据 Insert into test select * from dept 二、运算符 +——*/可以在select 语句中使用 ||连接两个字段,select deptno ||dname from dept 比较运算付:> >= = !=< <= 逻辑运算符:not ,or 集合运算符:intersect,union,union all,minus, 使用ord er by 的时候必须使用位置序号,不能使用列名 Select *from emp intersect select * from emp where deptno=10; Select *from emp minus select * from emp where deptno=10; ---不包括重复行 Select *from emp where deptno=10 union select * from emp where deptno in(10,20);----包括重复行 Select *from emp where deptno=10 union all select * from emp where deptno in(10,20); 三、常用ORACLE函数 各种排序算法稳定性的探讨 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。为了简便下面讨论的都是不降序排列的情形,对于不升序排列的情形讨论方法和结果完全相同。 其次,说一下稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,对基于比较的排序算法而言,元素交换的次数可能会少一些(个人感觉,没有证实)。 回到主题,现在分析一下常见的排序算法的稳定性,每个都给出简单的理由。 (1)冒泡排序 冒泡排序是通过相邻比较、实时交换、缩小范围实现排序的。第1次操作n个元素,通过相邻比较将0~n-1中的最大元素交换到位置n-1上,第2次操作n-1个元素,通过相邻比较将0~n-2中的最大元素交换到位置n-2上……第n-1次操作2个元素,通过相邻比较将0~1上的最大元素交换到位置1上完成排序。在相邻比较时如果两个元素相等,一般不执行交换操作,因此冒泡排序是一种稳定排序算法。 (2)选择排序 选择排序是通过不断缩小排序序列长度来实现的。第1次操作n个元素,选择0~n-1中的最小者交换到位置0上,第2次操作n-1个元素,选择1~n-1中的最小者交换到位置1上……第n-1次操作2个元素,选择n-2~n-1上的最小者交换到位置n-2上完成排序。在每次选择最小元素进行交换时,可能破坏稳定性。这种情况可以描述为:约定要发生交换的位置称为当前位置,被交换的位置称为被交换位置,被交换位置上的元素为选中的最小元素。如果当前位置之后和被交换位置之前存在与当前位置相等的元素,执行交换后就破坏了稳定性。如序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。 (3)插入排序 插入排序是通过不断扩大排序序列的长度来实现的。第1次操作1个元素,直接放到位置0上即可;第2次操作2个元素,在0~1上为当前元素找到合适位置并插入;第3次操作3个元素,用在0~2上为当前元素找到合适位置并插入它……第n次操作n个元素,在0~n-1上为当前元素找到合适位置并插入完成排序。讨论元素的插入过程,假设当前是第n次操作,要在0~n-1上为当前元素寻找合适位置,设置一个工作指针初始化为n-1,向前移动工作指针直到遇到一个不大于当前元素的元素,就在这个元素的后面插入当前元素,仔细体会这个插入过程,不难理解插入排序是稳定的。 (4)快速排序 快速排序有两个方向,左边的i下标当a[i] <= a[center]时一直往右走,其中center是中枢元素的数组下标,一般取为当前排序段的第一个元素。而右边的j下标当a[j] > a[center]时一直往左走。如果i和j都走不动了,这时必有结论a[i] > a[center] >= a[j],我们的目的是将a 分成不大于a[center]和大于a[center]的两个部分,其中前者位于左半部分后者位于右半部分。所以如果i>j(i不能等于j,为什么?)表明已经分好,否则需要交换两者。当左右分好时,j 指向了左侧的最后一个元素,这时需要将a[center]与a[j],交换,这个时侯可能会破坏稳定性。 sqlserver:整理一下SQLSERVER的排序规则疯狂代码 https://www.wendangku.net/doc/c82576189.html,/ ?:http:/https://www.wendangku.net/doc/c82576189.html,/DataBase/Article68892.html SQL SERVER排序规则平时使用不是很多也许不少初学者还比较陌生但有 个大家应是经常碰到: SQL SERVER数据库在跨库多表连接查询时若两数据 库默认集区别系统就会返回这样: “无法解决 equal to 操作排序规则冲突” .分析: 这个是排序规则不致造成我们做个测试比如: create table #t1( name varchar(20) collate Albanian_CI_AI_WS, value ) create table #t2( name varchar(20) collate Chinese_PRC_CI_AI_WS, value ) 表建好后执行连接查询: select * from #t1 A inner join #t2 B _disibledevent=>这样就出现了: 服务器: 消息 446级别 16状态 9行 1 无法解决 equal to 操作排序规则冲突 要排除这个最简单思路方法是表连接时指定它排序规则这样就 不再出现了语句这样写: select * from #t1 A inner join #t2 B on https://www.wendangku.net/doc/c82576189.html,=https://www.wendangku.net/doc/c82576189.html, collate Chinese_PRC_CI_AI_WS 2.排序规则介绍: 什么叫排序规则呢?MS是这样描述:"在 Microsoft SQL Server 2000 中 串物理存储由排序规则控制排序规则指定表示每个位模式以及存 储和比较所使用规则" 在查询分析器内执行下面语句可以得到SQL SERVER支持所有排序规则 select * from ::fn_helpcollations 排序规则名称由两部份构成前半部份是指本排序规则所支持集 如: Chinese_PRC_CS_AI_WS 前半部份:指UNICODE集Chinese_PRC_指针对大陆简体字UNICODE排序规则 排序规则后半部份即后缀 含义: _BIN 2进制排序 _CI(CS) 是否区分大小写CI不区分CS区分 _AI(AS) 是否区分重音AI不区分AS区分 oracle中常用函数大全 1、数值型常用函数 函数返回值样例显示 ceil(n) 大于或等于数值n的最小整数select ceil(10.6) from dual; 11 floor(n) 小于等于数值n的最大整数select ceil(10.6) from dual; 10 mod(m,n) m除以n的余数,若n=0,则返回m select mod(7,5) from dual; 2 power(m,n) m的n次方select power(3,2) from dual; 9 round(n,m) 将n四舍五入,保留小数点后m位select round(1234.5678,2) from dual; 1234.57 sign(n) 若n=0,则返回0,否则,n>0,则返回1,n<0,则返回-1 select sign(12) from dual; 1 sqrt(n) n的平方根select sqrt(25) from dual ; 5 2、常用字符函数 initcap(char) 把每个字符串的第一个字符换成大写select initicap('mr.ecop') from dual; Mr.Ecop lower(char) 整个字符串换成小写select lower('MR.ecop') from dual; mr.ecop replace(char,str1,str2) 字符串中所有str1换成str2 select replace('Scott','s','Boy') from dual; Boycott substr(char,m,n) 取出从m字符开始的n个字符的子串select substr('ABCDEF',2,2) from dual; CD length(char) 求字符串的长度select length('ACD') from dual; 3 || 并置运算符select 'ABCD'||'EFGH' from dual; ABCDEFGH 3、日期型函数 sysdate当前日期和时间select sysdate from dual; SQL 将查询结果插入到现有表中 Oracle常用函数及使用案例(珍藏版) 一:sql函数: lower(char):将字符串转化为小写的格式。 upper(char):将字符串转化为大写的格式。 length(char):返回字符串的长度。 substr(char,m,n):取字符串的字串。 案例1.将所有员工的名字按小写的方式显示 select lower(ename),sal from emp; 案例2.将所有员工的名字按大写的方式显示。 select upper(ename),sal from emp; 案例3.显示正好为五个字符的的员工的姓名。 select * from emp where length(ename)=5; 案例4.显示所有员工姓名的前三个字符。 select substr(ename,1,3) from emp;//从名字的第一个字符开始取,向后取三个字符。 案例5.以首字母为大写的方式显示所有员工的姓名。 (1)首字母大写:select upper(substr(ename,1,1)) from emp; (2)完成后面字母小写。select lower(substr(ename,2,length(ename)-1)) from emp; (3)合并select upper(substr(ename,1,1))||lower(substr(ename,2,length(ename)-1)) from emp; 案例6.以首字母为小写的方式显示所有员工的姓名。(需要有较高的灵活度,细心分析和清晰思路) (1)首字母小写:select upper(substr(ename,1,1)) from emp; (2)完成后面字母大写。select lower(substr(ename,2,length(ename)-1)) from emp; (3)合并select lower(substr(ename,1,1))||upper(substr(ename,2,length(ename)-1)) from emp; 案例7.函数(替换):replace(char1,search_string,replace_string); 显示所有员工的姓名,用“我要替换A”替代所有“A”。 select replace(ename,'A','我是老鼠')from emp; 案例8.以首字母为小写的方式显示所有员工的姓名。 select replace(ename,substr(ename,1,1),lower(substr(ename,1,1)))from emp; 案例9.以首字母为大写的方式显示所有员工的姓名。 Select replace(ename,substr(ename,2,length(ename)-1),lower(substr(ename,2,length(ename) -1)))from emp; 二:数学函数:(在财务中用的比较多) ronud(sal)用于四舍五默认取整; ronud(sal,1)用于四舍五留一位小数。 trunc(sal)取整,忽略小数。截去小数部分。 trunc(sal,1)截取;小数点留一位,之后的右边的省去。 trunc(sal,-1)截取;只留整数,个位数取零。 floor(sal)向下最接近取整;比如1.1值为1.oracle函数
SQL语句从大到小排序
稳定排序和不稳定排序
SQL数据库查询语句范例
Oracle 常见函数(一)——数值函数
SqlServer排序规则简介.选择.应用
Oracle函数详解(经典)
实验五查找及排序讲解
快速排序
sql 语句实现数据库数据的更新查询
ORACLE常用函数和一些项目中常用的SQL语句
排序算法稳定性
数据库汉字排序规则__按笔画排序
oracle中常用函数大全
sql将查询结果插入表中
在数据库日常维护工作中,我们可能经常需要把某个查询结果插入到现有的表中。如需要把两张表进行合 并、需要把另外一张表能够符合条件的的记录插入到现有的表中、需要把另外一张表中的某些字段重新整 理后插入到现有的表中等等。但是,我们都知道在数据库中对此进行操作,不想 Excel 表格那么方便,通 过选择、 复制、 粘贴即可以完成工作表之间的合并。 在数据库中, 不能够对列直接进行复制与粘贴的操作。 那么在数据库中能否有简单而有效的解决措施呢?其实在 SQLServer 数据库中,灵活使用 insert into Select(插入结果查询)语句就可以实现这个需求。 如现在由于公司人事部门合并后需要把数据库中的 USER_A 中的数据复制到表 USE_B 中。那么就可 以利用如下的语句来实现:
Insert into USER_B (ad_user_id,Value,name,manager_id) Select ad_user_id,Value,name,manager_id from USER_A Where( manager_id =100001) 通过如上这条简单的 insert into select 语句就可以把某一张表中符合条件的记录插入到目标表中。不 过这条语句虽然比较简单,但是其中的条条框框仍然有很多。具体的来说,在使用这条语句的时候,需要 遵守如下的这些条条框框。 一、需要指定源表中需要复制的列。 需要指定源表中需要复制的列。 有时候可能复制与被复制的表表结构不同。如需要把表 A 中的 name(英文名字)字段复制到表 B 中的 name2(中文名字)中。此时原有复制表与被复制表中字段的名称不同,为此需要在上面的语句中,把所需 要复制列名称一一列举出来。另外可能只需要把被复制表中的部分列复制到目的表总,此时也有显示的指 名所需要复制的列。注意复制对象与目标对象都需要列出,以免发生张冠李戴的现象。笔者在使用这条语 句的时候,不管任何情况,及时两者表格中的内容完全一致,笔者也习惯在语句中把字段的名称一一的列 出。虽然这会增加一定的工作量,但是却可以提高这条语句执行的准确性。简而言之,就是需要在语句中 指定源表 zhon 纲要复制其内容的列;指定目标表总要向其中复制数据的目标列。即使两这个表中的这些列 名称相同,也最好能够显示的指定。此时数据库管理员不能够偷懒,否则的话很容易导致数据插入错误, 而一切要重头再来。 二、存储数据时的顺序。 存储数据时的顺序。 如果现在在源表中有一万条符合条件的记录要保存到目的表中,那么这些记录在数据库中存储的顺序 应该是什么呢?默认情况下, 其存储的数据顺序就是查询结果所得到的顺序。 在没有采用排序语句的情况下, 其实就是源表中实际存储的顺序(一般按记录创建的先后顺序来保存)。不过有时候可能这个排序顺序不怎 么合理。笔者在认为,最好对需要插入的结果进行恰当的排序,这有利于提高插入记录的查询效率。如在 牧地中,可能对员工编号设置了索引;或者在目的表中查询员工的信息是按员工编号来排序的。那么在目的 表中插入数据的时候,最好能够按员工的编号来进行排列。是顺序还是逆序排列要跟目的表中保持一致。 如此的话, 插入数据后进行查询的话, 如需要查询所有后来插入的结果, 那么就不需要对其进行重新排序。 因为存储的时候就是按照员工编号来插入,那么查询出来的数据也是按照员工编号来的。可见,为需要插 入的数据设置合理的排序顺序,这有利于提高以后查询的性能。故笔者建议,为了提高数据库的性能,最 好在插入数据的时候利用 Order BY 语句指定插入数据时的顺序。虽然这不是强制性的,但是笔者建议各 位数据库管理员还是要这么做。 三、指定复制行的条件。 指定复制行的条件。Oracle常用函数及使用案例(珍藏版)