语言问题

修改语言注册表\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432\ORACLE\KEY_DevSuitHome1中的NLS_LANG修改为AMERICAN_AMERICA.ZHS16GBK(这是英语)

查询当前语言select userenv('LANG') from DUAL;

易错select NEXT_DAY ('01-SEP-95',1) from dual;中的1代表周几而不是几天

查看当前数据库参数,plsql_dev中的report/dba/NLS Database Parameters

精确到小时的hire_date+8/24表示的是hire_date时间加上8小时,然后精确显示到小时

AVG函数自动忽略NULL值求平均

Cop一张表create table copy_emp as select *from employees;

当如下事件发生是,会隐式的执行Commit动作:

1、数据定义语句被执行的时候,比如新建一张表:Create Table …

2、数据控制语句被执行的时候,比如赋权GRANT …( 或者DENY)

3、正常退出iSQL*Plus 或者PLSQL DEVELOPER, 而没有显式的执行COMMIT 或者ROLLBACK语句。

NOT NI 易错点

SELECT department_id, department_name

FROM departments

WHERE department_id NOT IN (SELECT department_id

FROM employees)子查询表中有null这句话就查不出东西就是错的

当然也可以这样解决

SELECT *

FROM   departments

WHERE  department_id NOT IN(SELECT department_id

FROM employees

WHERE job_id = 'SA_REP'

AND department_id IS NOT NULL)

还可以这样

SELECT department_id, department_name

FROM departments d

WHERE NOT EXISTS (SELECT 'X'

FROM employees

WHERE department_id

= d.department_id)

当查询的内容有多项,其中包括有分组查询的例如sum等分组函数,但是有的内容不需要,也不能分组的时候,方法是把有分组函数的内容拿出来单独建个子查询,子查询中建立需要的分组,不能分组的就放在子查询的查询外,例如

SELECT e.employee_id,e.last_name,e.salary,e.department_id,m.avg_salary

FROM employees e, (SELECT department_id,AVG(salary) avg_salary

FROM employees

GROUP BY department_id) m

WHERE  m.department_id = e.department_id

ORDER BY m.avg_salary DESC;

带有数量限制的查询举例

--Practices_18:Show the department number, department name, and the number of employees working in each department that:

--a.  Includes fewer than 3 employees

SELECT d.department_id,d.department_name,COUNT(*)

FROM departments d,employees e

WHERE d.department_id = e.department_id

GROUP BY d.department_id,d.department_name

HAVING COUNT(*)<3;

--b.  Has the highest number of employees:

SELECT d.department_id,d.department_name,COUNT(*)

FROM departments d,employees e

WHERE d.department_id = e.department_id

GROUP BY d.department_id,d.department_name

HAVING COUNT(*)>=ALL (SELECT COUNT(*)

FROM departments d,employees e

WHERE d.department_id = e.department_id

GROUP BY d.department_id,d.department_name);

--c.  Has the lowest  number of employees:

SELECT d.department_id,d.department_name,COUNT(*)

FROM departments d,employees e

WHERE d.department_id = e.department_id

GROUP BY d.department_id,d.department_name

HAVING COUNT(*)<=ALL (SELECT COUNT(*)

FROM departments d,employees e

WHERE d.department_id = e.department_id

GROUP BY d.department_id,d.department_name);

Top-N查询

--Practices_29:Write a query to display the top three earners in the EMPLOYEES table. Display their last names and salaries

方法一:

select last_name,salary

from employees e1

where

(

select count(1)

from employees e2

where  e2.salary>=e1.salary

) <=3

order by salary desc;

方法二:先排序然后利用ROWNUM取需多少数据

SELECT [column_list], ROWNUM

FROM (SELECT [column_list]

FROM table

ORDER BY Top-N_column)

WHERE ROWNUM <= N;

两个时间间隔的计算处理

精确到年月

--Practices_4:Show the last names of all employees together with the number of years

--and the number fcompleted months that they have been employed.

SELECT last_name,

TRUNC(MONTHS_BETWEEN(SYSDATE,hire_date)/12,0) "YEARS",

ROUND(MOD(MONTHS_BETWEEN(SYSDATE,hire_date),12),0) "MONTHS"

FROM employees;

精确到天:两个日期相减的结果是精确到天的,例如

Select last_name,sysdate,hire_date,sysdate-hire_date,(sysdate-hire_date)/365 from employees;

1   King   2013/8/2 13:05:57 1987/6/17  9543.54579861111  26.1467008181126

根据时间处于前半月(年)还是后半来处理数据

--Practices_12:Show all employees who were hired in the first half of the month (before the 16th of the month).

SELECT last_name,hire_date

FROM employees

WHERE ROUND(hire_date,'MONTH') = TRUNC(hire_date,'MONTH');

易错点

oraclesql左右外连接是带(+)的那边是被驱动表,显示的信息少,不带的那边是驱动表,不满足条件的也显示,所以显示的多

SELECT d.department_id,d.department_name,d.location_id,COUNT(e.employee_id)

FROM departments d,employees e

WHERE e.department_id(+) = d.department_id

GROUP BY d.department_id,d.department_name,d.location_id;

d表中不满足的也显示

思路易错点

例如查找一个工作种类在1991年前半年招聘了而且在1990年前半年也招聘了,如果用AND条件就不行,应为“同一个表”中不可能同时满足两个条件。此时应该用交集处理

SELECT job_id

FROM   employees

WHERE  hire_date

BETWEEN '01-JAN-1990' AND '30-JUN-1990'

INTERSECT

SELECT job_id

FROM   employees

WHERE  hire_date BETWEEN '01-JAN-1991'AND '30-JUN-1991';

易错:

SELECT last_name,salary,DECODE(commission_pct,null,'NO','YES') COMM ,CASE

WHEN commission_pct IS NULL THEN 'YES'

ELSE 'NO'

END COMM1

FROM employees;对的

SELECT last_name,salary,DECODE(commission_pct,null,'NO','YES') COMM ,CASE commission_pct

WHEN IS NULL THEN 'YES'

ELSE 'NO'

END COMM1

FROM employees;错的

SQL语句常见问题的总结(持续更新)的更多相关文章

  1. SQL语句小tips(持续更新)

    统计非法数据 判断people_id是否是32为字母组成的,统计不满足要求的数据 SELECT COUNT(IF(BINARY people_id NOT REGEXP '^[0-9a-z]{32}' ...

  2. mybatis新手入门常见问题集(持续更新)

    一.参数为集合 Q:parameterType指的的类型是集合类型还是对象? A:都可以,甚至不用在xml中指定也可以.第一,mybatis会对传入的参数进行判断是不是list或者array,第二,m ...

  3. 【Oracle】PL/SQL Developer使用技巧(持续更新中)

    1.关键字自动大写 在sql命令窗口中输入SQL语句时,想要关键字自动大写,引人注目该怎么办呢? 一步设置就可以达成了.点击Tools->Preference->Editor,看到截图中这 ...

  4. Loadrunder常见问题汇总(持续更新)

    1.LR 脚本为空的解决方法: 1)如果安装了IE以外的浏览器,并且IE不是默认浏览器,则无法生成录制脚本 2)如果录制脚本时IE不能打开,则需要将浏览器的IE工具高级选项中,将“启用第三方浏览器扩展 ...

  5. [mysql]SQL语句-新增/修改 创建时间 更新时间

    SQL关键词 要注意大小写   已建表,之前没有创建时间列, 现新增1列创建时间,并设置默认值为当前时间 --添加CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER T ...

  6. SQL Server 使用问题解答(持续更新中)

    问题一:sql server 2014不允许保存更改,您所做的更改要求删除并重新创建以下表 解答:工具-选项-不勾选组织保存要求重新创建表的更改,如下图确定.

  7. iOS UI、Xcode、调试、代码等常见问题总汇(持续更新中)

    以前比较懒,遇到问题解决了就完事了,有些问题再次遇到时忘记了当初是怎么解决的,又要查各种资料来解决.好记忆不如烂笔头,不管简单还是复杂都记一下吧,所以决定写一篇常见问题总结,方便以后查阅.现在有点忙, ...

  8. Debug 常见问题总结(持续更新)

    2016-9-24 1.for循环变量做参数一定要小心,嵌套一个for变量不要用同一个. 2.字符串处理要打好下标的草稿,不然很容易搞混.(方法待讨论). 3.整形比较比较容易忽略=的问题 ,> ...

  9. angularjs开发常见问题-1(持续更新中...)

    angularJs中学习中- 1.刷新当前页面数据:$state.reload service.create(data).then(function (newItem) { flash.success ...

随机推荐

  1. [LeetCode] Non-negative Integers without Consecutive Ones 非负整数不包括连续的1

    Given a positive integer n, find the number of non-negative integers less than or equal to n, whose ...

  2. [LeetCode] Brick Wall 砖头墙壁

    There is a brick wall in front of you. The wall is rectangular and has several rows of bricks. The b ...

  3. 使用Remix编译和部署以太坊智能合约

      Remix 是一個开源的 Solidity 智能合约开发环境,提供基本的编译.部署至本地或测试网络.执行合约等功能.Solidity 是 以太坊Ethereum 官方设计和支持的开发语言,专门用于 ...

  4. JavaScript的作用;JS常见的三种对话框;==和===的区别;函数内部参数数组arguments在函数内部打印实参;JS的误区:没有块级作用域

    JS:客户端(浏览器)脚本语言 弱类型 基于原型 事件驱动 不需要编译(直接运行)   JS的作用:表单验证,减轻服务端的压力 添加页面动画效果  动态更改页面内容  Ajax网络请求 (一)常见的对 ...

  5. 机器学习技法:13 Deep Learning

    Roadmap Deep Neural Network Autoencoder Denoising Autoencoder Principal Component Analysis Summary

  6. [SDOI 2011]消耗战

    Description 题库链接 给你一棵 \(n\) 个节点根节点为 \(1\) 的有根树,有边权. \(m\) 次询问,每次给出 \(k_i\) 个关键点.询问切断一些边,使这些点到根节点不连通, ...

  7. 【tyvj】刷题记录(1001~1099)(64/99)

    1001:排序完按照题意做即可. #include<cstdio> #include<iostream> #include<cmath> #include<a ...

  8. 【Codeforces Round #435 (Div. 2) A B C D】

    CF比赛题目地址:http://codeforces.com/contest/862 A. Mahmoud and Ehab and the MEX ·英文题,述大意:      输入n,x(n,x& ...

  9. new File()

    首先 File 类是对文件系统的映射 并不是硬盘上真实的文件所以 new File("xxx.xxx") 只是在内存中创建File文件映射对象,而并不会在硬盘中创建文件 如果需要创 ...

  10. JAVA 访问WebRoot下的目录文件

    转自 http://blog.csdn.net/jian_csdn/article/details/46119313 ClassLoader classLoader = Thread.currentT ...