﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;b&gt;成都心情&lt;/b&gt;-文章分类-我的收藏</title><link>http://www.blogjava.net/rosen/category/3474.html</link><description>骄傲、贪婪、迷色、忿怒、嫉妒、贪饕、懒惰——七宗罪&lt;br&gt;
本 Blog 是从：http://blog.csdn.net/rosen 搬来。</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 18:37:13 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 18:37:13 GMT</pubDate><ttl>60</ttl><item><title>Oracle 9i 中的 SQL（转贴）</title><link>http://www.blogjava.net/rosen/articles/13558.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Tue, 20 Sep 2005 12:05:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/articles/13558.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/13558.html</wfw:comment><comments>http://www.blogjava.net/rosen/articles/13558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/13558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/13558.html</trackback:ping><description><![CDATA[<P><STRONG><FONT size=4>第一章&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本SELECT 语句</FONT></STRONG><BR><BR>ORACLE数据库的体系结构。<BR>SYS和SYSTEM用户。</P>
<P>SQL语句不区分大小写。<BR>‘’和””的区别。<BR>字符串区分大小写。</P>
<P>NULL值。<BR>联接运算符：&nbsp;&nbsp; ||<BR>时间的默认格式为DD-MON-YY。</P>
<P>SELECT * FROM TAB;</P>
<P>字段别名<BR>SELECT job_title AS Title, min_salary AS “Minimum Salary” FROM jobs;</P>
<P>保证唯一性<BR>SELECT DISTINCT department_id,job_id FROM employees;</P>
<P>DUAL表<BR>SELECT SYSDATE, USER FROM DUAL;</P>
<P>不等于(!=、&lt;&gt;或^=)<BR>SELECT first_name || ‘ ‘ || last_name “Name”,commission_pct FROM employees <BR>WHERE commission_pct != 0.35 ;</P>
<P>&lt;=(小于等于)<BR>SELECT first_name || ‘ ‘ || last_name “Name”,commission_pct FROM employees <BR>WHERE commission_pct &lt;= 0.35 ;</P>
<P>&gt;=(大于等于)<BR>SELECT first_name || ‘ ‘ || last_name “Name”,commission_pct FROM employees <BR>WHERE commission_pct &gt;= 0.35 ;</P>
<P>ANY(相当于OR)<BR>SELECT first_name || ‘ ‘ || last_name “Name”,department_id FROM employees <BR>WHERE department_id &lt;= ANY (10,15,20,25);</P>
<P>ALL(相当于AND)<BR>SELECT first_name || ‘ ‘ || last_name “Name”,department_id FROM employees <BR>WHERE department_id &gt;= ALL (80,90,100);</P>
<P><BR>IN 和 NOT IN<BR>SELECT first_name,last_name,department_id FROM employees <BR>WHERE department_id IN (10,20,90);</P>
<P>IN 相当于 =ANY。</P>
<P>SELECT first_name,last_name,department_id FROM employees <BR>WHERE department_id NOT IN <BR>(10,30,40,50,60,80,90,110,100);</P>
<P>NOT IN 相当于 !=ALL。</P>
<P>注意：last_name NOT IN(‘Smith’,’Thomas’,NULL)<BR>不返回任何记录。<BR>任何与NULL值的比较都是NULL值。</P>
<P>BETWEEN<BR>SELECT first_name,last_name,salary FROM employees WHERE salary BETWEEN 5000 AND 6000;</P>
<P>EXISTS<BR>SELECT last_name,first_name,department_id FROM employees e<BR>WHERE EXISTS (SELECT 1 FROM departments d<BR>WHERE d.department_id = e.department_id<BR>&nbsp;&nbsp; AND d.department_name=’Administration’);</P>
<P>IS NULL和IS NOT NULL<BR>SELECT last_name,department_id FROM employees WHERE department_id IS NULL;</P>
<P>LIKE<BR>SELECT first_name,last_name FROM employees WHERE first_name LIKE ‘Su%’ <BR>AND last_name NOT LIKE ‘S%’;<BR>%、_的含义。</P>
<P>SELECT job_id,job_title FROM jobs WHERE job_id LIKE ‘AC\_%’ ESCAPE ‘\’;</P>
<P>结果集的排序<BR>SELECT first_name || ‘ ‘ || last_name “Employee Name” FROM employees WHERE department_id =90 ORDER BY last_name;<BR>ASC、DESC。<BR>SELECT first_name,hire_date,salary,manager_id mid FROM employees WHERE department_id IN (110,100) ORDER BY mid ASC,salary DESC, hire_date;</P>
<P>错误：SELECT DISTINCT ‘Region ‘ || region_id FROM countries ORDER BY region_id;<BR>正确：SELECT DISTINCT ‘Region ‘ || region_id FROM countries <BR>ORDER BY ‘Region ‘ ||region_id;</P>
<P>SELECT first_name,hire_date,salary,manager_id mid FROM employees WHERE department_id IN (110,100) ORDER BY 4,2,3;</P>
<P>NULL的排序<BR>默认情况下,升序排列中NULL值排在最后。<BR>SELECT last_name,commission_pct FROM employees WHERE last_name LIKE ‘R%’<BR>ORDER BY commission_pct ASC, last_name DESC;</P>
<P>SELECT last_name,commission_pct FROM employees WHERE last_name LIKE ‘R%’<BR>ORDER BY commission_pct ASC NULLS FIRST, last_name DESC;</P>
<P>CASE 表达式(9i新增)<BR>SELECT country_name,region_id,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE region_id WHEN 1 THEN ‘Europe’<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN 2 THEN&nbsp; ‘America’<BR>WHEN 3 THEN ‘Asia’<BR>ELSE ‘Other’ END Continent<BR>FROM countries WHERE country_name LIKE ‘I%’;</P>
<P>SELECT first_name,department_id,salary,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE WHEN salary &lt; 6000 THEN ‘Low’<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN salary &lt; 10000 THEN ‘Medium’<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN salary &gt;= 10000 THEN&nbsp; ‘High’ END Category<BR>FROM employees WHERE department_id &lt;=30 ORDER BY first_name;</P>
<P><STRONG><FONT size=4>第二章&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL * Plus的使用</FONT></STRONG><BR>SQL * Plus的常用命令。<BR></P>
<P><STRONG><FONT size=4>第三章&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle 9i 中的函数</FONT></STRONG><BR><BR>NVL<BR>SELECT first_name,last_name,salary,bonus,salary + bonus total_comp FROM employees;</P>
<P>SELECT first_name,last_name,salary,bonus,salary + NVL(bonus,0)<BR>total_comp FROM employees;</P>
<P>NVL2(9i新增)<BR>SELECT first_name,last_name,salary,bonus, NVL2(bonus,salary + bonus,salary)<BR>total_comp FROM employees;</P>
<P>字符串函数<BR>SELECT ASCII(‘A’) Big_A,ASCII(‘z’) Little_z FROM dual;<BR>SELECT CHR(65),CHR(223) FROM dual;<BR>SELECT CONCAT(‘Peter’,’Mackovicky’) FROM dual;<BR>SELECT INITCAP(‘the three musketeers’) book_title FROM dual;<BR>SELECT INSTR(‘Mississippi’,’i’,3,3) test1, INSTR(‘Mississippi’,’i’,1,3) test2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSTR(‘Mississippi’,’i’,-2,3) test3 FROM dual;</P>
<P>解析数据<BR>text_string =’Sunday|Monday|Tuesday’<BR>SELECT text_string,SUBSTR(text_string,INSTR(text_string,’|’,1,1) + 1, <BR>INSTR(text_string,’|’,1,2) - INSTR(text_string,’|’,1,1) – 1 ) FROM dual;</P>
<P>INSTRB<BR>SELECT LENGTH(‘the three musketeers’) title_length FROM dual;<BR>LENGTHB<BR>LOWER<BR>SELECT LPAD(‘Yes’,7,’.’) FROM dual;<BR>SELECT LTRIM(‘Mississippi’,’Mis’) test1, LTRIM(‘RPadded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ’) test2,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LTRIM(‘&nbsp;&nbsp;&nbsp;&nbsp; RPadded’) test3, LTRIM(‘&nbsp;&nbsp;&nbsp;&nbsp; RPadded’,’Z’) test4 FROM dual;</P>
<P>数学函数<BR>ABS、ACOS、ASIN、ATAN、ATAN2、BITAND、CEIL、COS、COSH、EXP、FLOOR、LN、LOG、MOD、POWER、SIGN、SIN、SINH、SQRT、TAN、TANH。<BR>ROUND=TRUNC<BR>SELECT TRUNC(123.456,2) pos, TRUNC(123.456,-1) neg FROM dual;</P>
<P>日期函数<BR>ADD_MONTHS、LAST_DAY、MONTH_BETWEEN、NEXT_TIME、NEXT_DAY、ROUND、SYSDATE。</P>
<P>转换函数<BR>CHARTOROWID、CONVERT、HEXTORAW、NLS_CHARSET_ID、NLS_CHARSET_NAME、<BR>RAWTOHEX、ROWIDTOCHAR、TO_CHAR、 TO_DATE、 TO_ LABEL、 TO_MULTI_BYTE、<BR>TO_NUMBER、TO_SINGLE_BYTE。</P>
<P>SELECT TO_CHAR(SYSDATE,’yyyy-mm-dd hh24:mi:ss’) FROM dual;<BR>SELECT TO_CHAR(SYSDATE,’month’) FROM dual;<BR>SELECT TO_CHAR(SYSDATE,’SSSSS’) FROM dual;</P>
<P>INSERT INTO demo(demo_key,date_col)<BR>&nbsp;&nbsp; VALUES (1,TO_DATE(‘2004-7-1’,’yyyy-mm-dd’));</P>
<P>其它函数<BR>SELECT COALESCE(NULL,’Oracle’,’24’) string_type,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COALESCE(3,14,COS(0)) bnr_type FROM dual;<BR>返回第一个非NULL值。</P>
<P>SELECT DECODE(rating,null,1000,’C’,2000,’B’,3000.’D’,4000,5000) FROM accts;</P>
<P>SELECT USER,UID FROM dual;</P>
<P>GREATEST、LEAST。</P>
<P>SELECT ename,mgr,comm,NULLIF(comm,0) test1 FROM scott.emp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE empno IN(7844,7839,7654,7369); (9i新增)<BR>如果x1=x2,返回NULL。否则x1。</P>
<P>SELECT SYS_CONTEXT(‘USERENV’,’IP_ADDRESS’) FROM dual; (9i新增)</P>
<P><BR>USERENV函数在9i中停用，建议用SYS_CONTEXT函数。</P>
<P>SELECT VSIZE(user),user FROM dual;<BR></P>
<P><FONT size=4><STRONG>第四章&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分组汇总语句</STRONG></FONT><BR><BR>GROUP BY 语句<BR>SELECT cust_state_province, count(*) customer_count<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM sh.customers GROUP BY cust_state_province;<BR>重点：GROUP BY 语句中SELECT后字段的限制：只能是分组字段和集合函数。<BR>GROUP BY的结果集排序。</P>
<P>SELECT deptno,MIN(sal),MAX(sal)&nbsp; FROM emp&nbsp; WHERE job=’CLERK’<BR>GROUP&nbsp; BY deptno; (注意此处与SQL Server不同!)</P>
<P>SELECT cust_state_province, count(*) customer_count<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM sh.customers GROUP BY cust_state_province ORDER BY COUNT(*) DESC;<BR>或：SELECT cust_state_province, count(*) customer_count<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM sh.customers GROUP BY cust_state_province ORDER BY 2 DESC;</P>
<P>缺定表的一个数据块中平均有多少行数据：<BR>SELECT AVG(row_count ),MAX(row_count),MIN(row_count)<BR>FROM (SELECT count(*) row_count FROM employees GROUP BY SUBSTR(rowid,1,15));</P>
<P>HAVING<BR>SELECT t.fiscal_month_desc,s.channel_id,SUM(s.quantity_sold),SUM(s.amount_sold)<BR>FROM sh.times t,sh.sales s WHERE t.time_id = s.time_id AND s.promo_id &lt;&gt; 9999<BR>GROUP BY t.fiscal_month_desc,s.channel_id HAVING SUM(s.amount_sold) &gt; 2000000;<BR>HAVING=WHERE。</P>
<P>错误：<BR>SELECT t.fiscal_month_desc,s.channel_id,SUM(s.quantity_sold),SUM(s.amount_sold)<BR>FROM sh.times t,sh.sales s WHERE t.time_id = s.time_id AND s.promo_id &lt;&gt; 9999 AND SUM(s.amount_sold) &gt; 2000000&nbsp; GROUP BY t.fiscal_month_desc,s.channel_id;</P>
<P><BR>CUBE和ROLLUP<BR>SELECT cust_gender gender,NVL(cust_marital_status,’unknown’) marital_status,COUNT(*) <BR>FROM sh.customers GROUP BY cust_gender, NVL(cust_marital_status,’unknown’);</P>
<P>SELECT cust_gender gender,NVL(cust_marital_status,’unknown’) marital_status,COUNT(*) <BR>FROM sh.customers GROUP BY cust_gender, ROLLUP(NVL(cust_marital_status,’unknown’ ));</P>
<P>SELECT cust_gender gender,NVL(cust_marital_status,’unknown’) marital_status,COUNT(*) <BR>FROM sh.customers GROUP BY ROLLUP(cust_gender, NVL(cust_marital_status,’unknown’ ));</P>
<P>SELECT cust_gender gender,NVL(cust_marital_status,’unknown’) marital_status,COUNT(*) <BR>FROM sh.customers GROUP BY CUBE(cust_gender, NVL(cust_marital_status,’unknown’ ));</P>
<P>嵌套函数<BR>SELECT deptno,GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr)) cnt,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COUNT(DISTINCT job ) jobs,&nbsp;&nbsp; COUNT(DISTINCT mgr) mgrs<BR>FROM emp GROUP BY deptno;</P>
<P>SELECT MAX(COUNT(DISTINCT job)) FROM emp GROUP BY deptno;</P>
<P>集合函数<BR>SELECT empno,sal FROM scott.emp WHERE deptno=20 ORDER BY sal;</P>
<P>DISTINCT和ALL的区别<BR>SELECT AVG(sal) avg, AVG(ALL sal) avg_all,AVG(DISTINCT sal) avg_dist,<BR>COUNT(sal) cnt, COUNT(DISTINCT sal) cnt_dist,SUM(sal) sum_all,SUM(DISTINCT sal ) sum_dist FROM scott.emp WHERE deptno=20;</P>
<P>默认是ALL。</P>
<P>SELECT job_id,AVG(salary) FROM hr.employees WHERE job_id LIKE ‘AC%’ GROUP BY job_id;</P>
<P>SELECT COUNT(*) emp_count,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COUNT(DISTINCT department_id) dept_count,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COUNT(ALL department_id) not_null_dept_count FROM hr.employees;</P>
<P>SELECT cust_gender gender, NVL(cust_marital_status,’unknown’) marital_status,<BR>COUNT(*) emp_count, GROUPING(cust_gender) gender_superagg,<BR>GROUPING(NVL(cust_marital_status,’unknown’)) martial_superagg<BR>FROM sh.customers GROUP BY CUBE(cust_gender, NVL(cust_marital_status,’unknown’));</P>
<P>Create table tmp as <BR>SELECT cust_gender gender, NVL(cust_marital_status,’unknown’) marital_status,<BR>COUNT(*) emp_count, GROUPING(cust_gender) gender_superagg,<BR>GROUPING(NVL(cust_marital_status,’unknown’)) martial_superagg<BR>FROM sh.customers GROUP BY CUBE(cust_gender, NVL(cust_marital_status,’unknown’));<BR></P>
<P><STRONG><FONT size=4>第五章&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 联接语句</FONT></STRONG><BR><BR>Oracle 9i中新增加了JOIN子句，以符合 ANSI SQL 1999标准。</P>
<P>对等联接(内联接)<BR>Oracle语法：<BR>SELECT locations.location_id,city,department_name FROM locations,departments<BR>WHERE locations.location_id = departments.location_id;</P>
<P>SELECT locations.location_id,city,department_name FROM locations,departments<BR>WHERE locations.location_id = departments.location_id AND country_id != ‘US’;</P>
<P>使用表的别名<BR>SELECT l.location_id,city,department_name FROM <BR>locations l,departments d WHERE l.location_id = d.location_id AND country_id != ‘US’;</P>
<P>当使用表的别名时，只能用别名来限定表名。<BR>错误：SELECT locations.location_id,city,department_name FROM <BR>locations l,departments d WHERE locations.location_id = d.location_id;</P>
<P>ANSI语法：<BR>NATURAL JOIN<BR>SELECT location_id,city,department_name FROM locations NATURAL JOIN departments;<BR>自动使用两个表的同名字段进行联接。<BR>不要用表名或表的别名来限定列名。</P>
<P>SELECT * FROM regions NATURAL JOIN countries;</P>
<P>SELECT region_name,country_name,city FROM regions NATURAL JOIN countries <BR>NATURAL JOIN locations;<BR>等价于：SELECT region_name,country_name,city FROM regions,countries,locations<BR>WHERE regions.region_id = countries.region_id AND <BR>countries.country_id= locations.country_id;</P>
<P>JOIN … USING<BR>当两个表的共同字段数据类型不同时。<BR>SELECT location_id,city,department_name FROM locations&nbsp; JOIN departments USING(location_id);</P>
<P>SELECT region_name,country_name,city FROM regions <BR>JOIN countries USING(region_id)<BR>JOIN locations USING(country_id);</P>
<P>SELECT region_name,country_name,city FROM regions <BR>JOIN countries USING(region_id)<BR>JOIN locations USING(country_id)<BR>WHERE country_id = ‘US’ <BR>ORDER BY 1;</P>
<P>JOIN ON<BR>SELECT region_name,country_name,city FROM regions r<BR>JOIN countries c ON r.region_id = c.region_id&nbsp; <BR>JOIN locations l ON c.country_id= l.country_id<BR>WHERE country_id = ‘US’;</P>
<P>SELECT first_name,department_name,city<BR>FROM employees e JOIN departments d ON (e.department_id = d.department_id)<BR>JOIN locations l ON (d.location_id = l.location_id);</P>
<P>笛卡尔乘积(交叉联接)<BR>Oracle语法：<BR>SELECT region_name,country_name FROM regions,countries WHERE countries.country_id LIKE ‘I%’;<BR>ANSI 语法：<BR>SELECT region_name,country_name FROM regions CROSS JOIN countries <BR>WHERE countries.country_id LIKE ‘I%’;</P>
<P>外联接(非对等联接)<BR>Oracle语法：<BR>SELECT c.country_name,l.city FROM countries c ,locations l WHERE c.country_id = l.country_id(+);</P>
<P>select ename,emp.deptno,dname from emp,dept where emp.deptno(+)=dept.deptno(+);</P>
<P>外联接符(+)要用于所有的条件。<BR>SELECT c.country_name,l.city FROM countries c ,locations l WHERE c.country_id = l.country_id(+) AND l.city LIKE ‘B%’;</P>
<P>SELECT c.country_name,l.city FROM countries c ,locations l WHERE c.country_id = l.country_id(+) AND l.city(+) LIKE ‘B%’;</P>
<P>外联接符(+)不能用于OR和IN。<BR>错误：SELECT c.country_name,l.city FROM countries c ,locations l WHERE c.country_id = l.country_id(+) OR l.city(+) LIKE ‘B%’;</P>
<P>正确：SELECT c.country_name,l.city FROM countries c ,locations l WHERE c.country_id = l.country_id(+) AND c.country_name IN (‘India’,’Israel’);</P>
<P>ANSI语法：<BR>左外联接<BR>SELECT c.country_name,l.city FROM countries c LEFT OUTER JOIN locations l ON <BR>c.country_id = l.country_id;</P>
<P>select ename,emp.deptno,dname from emp LEFT OUTER JOIN dept ON emp.deptno=dept.deptno;<BR>OUTER是可选的。<BR>SELECT country_name,city FROM countries&nbsp; LEFT JOIN locations USING(country_id);<BR>SELECT country_name,city FROM countries&nbsp; NATURAL LEFT JOIN locations;</P>
<P>右外联接<BR>SELECT country_name,city FROM locations&nbsp; NATURAL RIGHT OUTER JOIN countries;</P>
<P>SELECT c.country_name,l.city FROM locations l RIGHT JOIN countries c ON <BR>c.country_id = l.country_id;</P>
<P>完全外联接(9i新增)<BR>SELECT e.employee_id,e.last_name,d.department_id,d.department_name<BR>FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id)</P>
<P>错误：select ename,emp.deptno,dname from emp,dept where emp.deptno(+)=dept.deptno(+);</P>
<P>自联接<BR>用于层次型数据库。<BR>SELECT e.last_name Employee, m.last_name Manager FROM employees e ,employees m<BR>WHERE m.employee_id = e.manager_id;</P>
<P>SELECT e.last_name Employee, m.last_name Manager FROM employees e INNER JOIN <BR>employees m ON m.employee_id = e.manager_id;</P>
<P><BR><STRONG><FONT size=4>第六章&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 集合语句和子查询</FONT></STRONG></P>
<P>集合语句：把多个SELECT语句的结果集合并成一个结果集。<BR>UNION ALL 合并多个结果集，不消除重复值。<BR>UNION&nbsp;&nbsp;&nbsp;&nbsp; 合并多个结果集，消除重复值。<BR>INTERSECT<BR>MINUS</P>
<P>SELECT last_name, hire_date FROM employees WHERE department_id = 90;<BR>SELECT last_name, hire_date FROM employees WHERE last_name LIKE ‘K%’;</P>
<P>SELECT last_name, hire_date FROM employees WHERE department_id = 90<BR>UNION ALL<BR>SELECT last_name, hire_date FROM employees WHERE last_name LIKE ‘K%’;</P>
<P>SELECT last_name, hire_date FROM employees WHERE department_id = 90<BR>UNION<BR>SELECT last_name, hire_date FROM employees WHERE last_name LIKE ‘K%’;</P>
<P>SELECT last_name, hire_date FROM employees WHERE department_id = 90<BR>INTERSECT<BR>SELECT last_name, hire_date FROM employees WHERE last_name LIKE ‘K%’;</P>
<P>SELECT last_name, hire_date FROM employees WHERE department_id = 90<BR>MINUS<BR>SELECT last_name, hire_date FROM employees WHERE last_name LIKE ‘K%’;</P>
<P>错误：<BR>SELECT last_name, hire_date FROM employees WHERE department_id = 90 ORDER BY last_name<BR>MINUS<BR>SELECT first_name, hire_date FROM employees WHERE last_name LIKE ‘K%’ ORDER BY first_name;</P>
<P>SELECT last_name, hire_date “Join Date” FROM employees WHERE department_id = 90 MINUS<BR>SELECT first_name, hire_date FROM employees WHERE last_name LIKE ‘K%’ ORDER BY last_name,&nbsp; “Join Date”;</P>
<P>SELECT last_name, hire_date “Join Date” FROM employees WHERE department_id = 90 MINUS<BR>SELECT first_name, hire_date FROM employees WHERE last_name LIKE ‘K%’ ORDER BY 1,2;</P>
<P>子查询<BR>子查询的特征：&nbsp;&nbsp; 子查询要加括号。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分为嵌套子查询和相关子查询。(区别：子查询里是否包含联接。)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分为单值和多值。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相关子查询可用联接语句代替。</P>
<P>单值嵌套子查询的例子：<BR>SELECT lastname,firstname,salary FROM employees<BR>WHERE salary = (SELECT MAX(salary) FROM employees);</P>
<P>SELECT lastname,firstname,salary FROM employees<BR>WHERE department_id = (SELECT department_id FROM departments WHERE department_name=’Accounting’);</P>
<P>多值嵌套子查询的例子：<BR>SELECT lastname,firstname,salary FROM employees<BR>WHERE department_id = (SELECT department_id FROM departments WHERE first_name=’John’);</P>
<P>相关子查询的例子：<BR>SELECT department_id,last_name,salary FROM employees e1 WHERE salary = <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT MAX(salary) FROM employees e2 WHERE e1.department_id = e2.department_id);</P>
<P>比较：SELECT department_id,last_name,salary FROM employees WHERE salary = <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT MAX(salary) FROM employees );</P>
<P>SELECT last_name,first_name, department_id FROM employees e1 WHERE EXISTS <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT ‘x’ FROM employees e2 WHERE first_name= ‘John’ AND e1.department_id = e2.department_id);</P>
<P>子查询用在case表达式中：<BR>SELECT city,country_id,(CASE <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN country_id IN <BR>(SELECT country_id FROM countries WHERE country_name = ‘India’) THEN ‘Indian’<BR>ELSE ‘Non_Indian’<BR>END) “INDIA?”<BR>FROM locations WHERE city LIKE ‘’B%;</P>
<P>子查询用在SELECT子句中：<BR>SELECT last_name,department_id,<BR>&nbsp;&nbsp;&nbsp;&nbsp; (SELECT MAX(salary) FROM employees sq WHERE sq.ddepartment_id = e.department_id) HSAL FROM employees e WHERE last_name LIKE ‘R%’;</P>
<P>UPDATE employees e1<BR>SET salary = (SELECT MAX(salary) FROM employees e2 WHERE e1.department_id= e2.department_id);</P>
<P>DELETE FROM employees e WHERE salary &lt;(SELECT AVG(salary) FROM employees WHERE department_id= e.department_id);</P>
<P>INSERT INTO employee_archive SELECT * FROM employees;</P>
<P>INSERT INTO departments(department_id,department_name) VALUES<BR>((SELECT MAX(department_id) + 10 FROM departments),’EDP’);</P>
<P>可以在INSERT、UPDATE、DELETE语句中使用一个子查询来代替表名。<BR>DELETE FROM (SELECT * FROM departments WHERE department_id &lt; 20) WHERE department_id =10;</P>
<P>DELETE FROM (SELECT * FROM department WHERE department_id &lt; 20) WHERE department_id =10;</P>
<P>INSERT INTO (SELECT department_id,department_name FROM department WHERE department_id &lt; 20) VALUES (35, ‘MARKETING’);</P>
<P>WITH READ ONLY、 WITH CHECK OPTION。</P>
<P>INSERT INTO (SELECT department_id,department_name FROM departments WHERE department_id &lt; 20 WITH CHECK OPTION) VALUES (45, ‘MARKETING’);<BR></P>
<P><STRONG><FONT size=4>第七章&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改数据(INSERT、UPDATE、DELETE语句)</FONT></STRONG><BR><BR>INSERT语句<BR>INSERT INTO checking(account_id,create_date,balance)<BR>VALUES(‘Kiesha’,SYSDATE,5000);</P>
<P>INSERT INTO brokerage(account_id,create_date,balance) <BR>SELECT account_id, SYSDATE,0 FROM checking WHERE account_type =’C’;</P>
<P>INSERT INTO e_checking <BR>SELECT * FROM checking WHERE account_type =’C’;</P>
<P>UPDATE语句<BR>UPDATE order_rollup SET (qty,price) = (SELECT SUM(qty),SUM(price) FROM order_lines<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE customer_id=’KHOL’) WHERE customer_id =’KHOL’ AND order_period= TO_DATE(’01-Oct-2001’);</P>
<P>UPDATE order_rollup SET phone = ‘123456’,fax=’234567’ WHERE customer_id=’KHOL’</P>
<P>DELETE语句<BR>DELETE FROM customers WHERE customer_id = ‘GOMEZ’;<BR>DELETE FROM order_staging;<BR>DML<BR>TRUNCATE语句<BR>TRUNCATE TABLE order_staging;<BR>TRUNCATE语句是一个DDL语句。</P>
<P>SELECT … FOR UPDATE 语句</P>
<P>事务语句<BR>COMMIT、COMMIT WORK。<BR>ROLLBACK。<BR>SAVEPOINT。</P>
<P>DDL与语句不需要提交。</P>
<P>RENAME语句<BR>rename T1 to T2;</P>
<P>CREATE TABLE … AS SELECT …语句<BR>CREATE TABLE emp_tmp AS SELECT*FROM emp WHERE deptno=10;<BR>复制表：create table t2 as select * from t1; <BR>复制表的结构：create table t2 as select*from t1 where 1=2;</P>
<P>Top n 语句<BR>SELECT last_name,salary FROM employees WHERE rownum &lt;=5 ORDER BY salary DESC;<BR><BR>.........................................................................................................................<BR>useraccount表，主键为userid，有一个字段为手机号码mobilephone<BR><BR>如果重复的记录的比例不是很大<BR><BR>delete useraccount where rowid in (<BR>select rid from<BR>(select rowid rid,row_number() over(partition by mobilephone order by userid desc) rn from useraccount )<BR>where rn &gt; 1) ;</P><img src ="http://www.blogjava.net/rosen/aggbug/13558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-09-20 20:05 <a href="http://www.blogjava.net/rosen/articles/13558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP 中的日期问题及其它（转贴）</title><link>http://www.blogjava.net/rosen/articles/13557.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Tue, 20 Sep 2005 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/articles/13557.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/13557.html</wfw:comment><comments>http://www.blogjava.net/rosen/articles/13557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/13557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/13557.html</trackback:ping><description><![CDATA[/**<BR>* <STRONG>@author imagebear</STRONG><BR>*/<BR><BR>日期问题<BR>1、获取服务器端当前日期：<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.util.Date"%&gt;<BR>&lt;%<BR>	Date myDate = new Date();<BR>%&gt;<BR></PRE><BR>2、获取当前年、月、日：<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.util.Date"%&gt;<BR><BR>&lt;%<BR>	Date myDate = new Date();<BR>	int thisYear = myDate.getYear() + 1900;//thisYear = 2003<BR>	int thisMonth = myDate.getMonth() + 1;//thisMonth = 5<BR>	int thisDate = myDate.getDate();//thisDate = 30<BR>%&gt;<BR></PRE><BR>3、按本地时区输出当前日期<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.util.Date"%&gt;<BR>&lt;%<BR>	Date myDate = new Date();<BR>	out.println(myDate.toLocaleString());<BR>%&gt;<BR></PRE><BR>输出结果为：<BR>2003-5-30 <BR>4、获取数据库中字段名为”publish_time“、类型为Datetime的值<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.util.Date"%&gt;<BR>&lt;%<BR>	...连接数据库...<BR>	ResultSet rs = ...<BR>	Date sDate = rs.getDate("publish_time");<BR>%&gt;<BR>[code]<BR>5、按照指定格式打印日期<BR>[code]<BR>&lt;%@ page import="java.util.Date"%&gt;<BR>&lt;%@ page import="java.text.DateFormat"%&gt;<BR>&lt;%<BR>	Date dNow = new Date();<BR><BR>	SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");<BR>	out.println("It is " + formatter.format(dNow));<BR>%&gt;<BR></PRE><BR>输出的结果为：<BR>It is 星期五 2003.05.30 at 11:30:46 上午 CST <BR>(更为详尽的格式符号请参看SimpleDateFormat类)<BR>6、将字符串转换为日期<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.util.Date"%&gt;<BR>&lt;%@ page import="java.text.DateFormat"%&gt;<BR>&lt;%<BR>	String input = "1222-11-11";<BR>	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");<BR>	Date t = null;<BR>	try{<BR>		t = formatter.parse(input);<BR>		out.println(t);<BR>	}catch(ParseException e){<BR>		out.println("unparseable using " + formatter);<BR>	}<BR>%&gt;<BR></PRE><BR>输出结果为：<BR>Fri Nov 11 00:00:00 CST 1222 <BR>7、计算日期之间的间隔<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.util.Date"%&gt;<BR>&lt;%@ page import="java.text.DateFormat"%&gt;<BR>&lt;%<BR>	String input = "2003-05-01";<BR>	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");<BR>	Date d1 = null;<BR>	try{<BR>		d1 = formatter.parse(input);<BR>	}catch(ParseException e){<BR>		out.println("unparseable using " + formatter);<BR>	}<BR>	<BR>	Date d2 = new Date();<BR>	<BR>	long diff = d2.getTime() - d1.getTime();<BR>	out.println("Difference is " + (diff/(1000*60*60*24)) + " days.");<BR>%&gt;<BR></PRE><BR>输出结果为：<BR>Difference is 29 days. <BR>8、日期的加减运算<BR>方法：用Calendar类的add()方法<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.util.*"%&gt;<BR>&lt;%@ page import="java.text.*"%&gt;<BR>&lt;%<BR>	Calendar now = Calendar.getInstance();<BR>	SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");<BR>	out.println("It is now " + formatter.format(now.getTime()));<BR>	now.add(Calendar.DAY_OF_YEAR,-(365*2));<BR>	out.println("&lt;br&gt;");<BR>	out.println("Two years ago was " + formatter.format(now.getTime()));<BR>%&gt;<BR></PRE><BR>输出结果为：<BR>It is now 星期五 2003.05.30 at 01:45:32 下午 CST <BR>Two years ago was 星期三 2001.05.30 at 01:45:32 下午 CST <BR>9、比较日期<BR>方法：用equals()、before()、after()方法<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.util.*"%&gt;<BR>&lt;%@ page import="java.text.*"%&gt;<BR>&lt;%<BR>	DateFormat df = new SimpleDateFormat("yyy-MM-dd");<BR>	Date d1 = df.parse("2000-01-01");<BR>	Date d2 = df.parse("1999-12-31");<BR>	<BR>	String relation = null;<BR>	if(d1.equals(d2))<BR>		relation = "the same date as";<BR>	else if(d1.before(d2))<BR>		relation = "before";<BR>	else<BR>		relation = "after";<BR>	out.println(d1 +" is " + relation + ' ' + d2);<BR>%&gt;<BR></PRE><BR>输出结果为：<BR>Sat Jan 01 00:00:00 CST 2000 is after Fri Dec 31 00:00:00 CST 1999 <BR>10、记录一件事所花费的时间<BR>方法：调用两次System.getTimeMillis()方法，求差值<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.text.*"%&gt;<BR>&lt;%<BR>	long t0,t1;<BR>	t0 = System.currentTimeMillis();<BR>	out.println("Cyc starts at " + t0);<BR>	int k = 0;<BR>	for(int i =0;i&lt;100000;i++){<BR>		k += i;<BR>	}<BR>	t1 = System.currentTimeMillis();<BR>	out.println("&lt;br&gt;");<BR>	out.println("Cyc ends at " + t1);<BR>	out.println("&lt;br&gt;");<BR>	out.println("This run took " + (t1-t0) + "ms.");<BR>%&gt;<BR></PRE><BR>输出结果为：<BR>Cyc starts at 1054275312432 <BR>Cyc ends at 1054275312442 <BR>This run took 10ms. <BR><BR>其它：如何格式化小数<BR><PRE class=CodeSamp><BR>&lt;%@ page import="java.text.*"%&gt;<BR>&lt;%<BR>	DecimalFormat df = new DecimalFormat(",###.00");<BR>	double aNumber = 33665448856.6568975;<BR>	String result = df.format(aNumber);<BR>	out.println(result);<BR>%&gt;<BR></PRE><BR>输出结果为：<BR>33,665,448,856.66<img src ="http://www.blogjava.net/rosen/aggbug/13557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-09-20 20:04 <a href="http://www.blogjava.net/rosen/articles/13557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>