首页 > 代码库 > Oracle学习(二)_多表操作

Oracle学习(二)_多表操作

--第一部分:SQL基础  --ch1 简单查询  --ch2 查询基本概念  --ch3 数据过滤  --第二部分:多表操作  --ch4 集合理论  --ch5 内连接  --ch6 外连接  --ch7 子查询  --第三部分:数据分组  --ch8 简单统计  --ch9 数据分组  --ch10 分组数据过滤  --第四部分:SQL函数  --ch11 内置函数  --ch12 case表达式--第五部分:DML语句  --ch13  插入数据  --ch14  修改数据  --ch15  删除数据------------------------------------------------------------------------  --第一部分:SQL基础【ch1 简单的查询】--1.1 select简介SELECT 是SQL的核心部分。用于从数据库中提取信息。SELECT操作可以细分为:SELECT 语句SELECT 表达式SELECT 查询 三部分--1.2 select语句一个select语句由几个独立的关键字组成,这些关键字被称作子句。由如下五个子句构成:(1)SELECT 子句指定查询结果集中想要的列。                     <必要>(2)FROM 子句指定select子句中的列是从哪个表或视图中取出的。 <必要>(3)WHERE 子句用来过滤from子句返回的行。                     [可选]where子句后跟一个表达式,称为谓词。其值可能为true、false或unknown。可以使用比较运算符、逻辑运算符、特殊运算符来检验这些表达式。(4)GROUP BY 子句若select子句中使用了统计函数来得到汇总信息,那么可以用GROUP by子句把这些信息分成不同的组。           [可选](5)HAVING 子句一般和group by组合使用,用来过滤分组后的信息。 [可选]having子句后也跟着一个其值可能为true、false或unknown的表达式,也可以使用比较运算符、逻辑运算符、特殊运算符来检验这些表达式。--1.3基本select查询1)查询单列SELECT column_name FROM table_name;SELECT customer_id FROM customers;2)查询多列逗号分隔;列可以不按照顺序SELECT column_name,column_name,... FROM table_name;SELECT customer_id, first_name, last_name FROM customers;3)查询所有列SELECT * FROM table_name;SELECT * FROM customers;--1.4消除重复的行SELECT product_type_id FROM products;SELECT DISTINCT product_type_id FROM products;SELECT DISTINCT product_id, product_type_id FROM products;SELECT UNIQUE product_type_id FROM products;--1.5排序序列select语句返回的结果集一般是无序的;结果集中的记录之间的顺序主要取决于它们在表中的物理位置。ORDER BY 子句--asc 默认升序 desc 降序--nulls first nulls last--按列名排序,列名可以不出现在select子句中SELECT * FROM customers ORDER BY customer_id;SELECT first_name, last_name FROM customers ORDER BY customer_id;--按别名排序SELECT first_name, last_name, salary AS sl  FROM employees ORDER BY sl DESC;--按列序号排序SELECT first_name, last_name, salary  FROM employees ORDER BY 3 DESC;--多列排序SELECT * FROM productsORDER BY product_type_id,product_id;--asc/descSELECT * FROM customers ORDER BY last_name DESC, dob ASC;--nulls first/nulls lastSELECT * FROM customers ORDER BY phone NULLS FIRST, dob NULLS LAST;【ch2 查询基本概念】--2.1select子句内容(select list)1)列引用(table_name.)column_name2)文字值字符串文字‘51testing‘‘This is a sample sql‘‘12345‘‘You‘‘d better study hard‘数值文字911-3.1415.88883.4e5日期文字DATE‘2012-12-21‘to_date(‘2012-10-10 20:20:20‘,‘yyyy-mm-dd hh24:mi:ss‘)--2.2表达式比如要表达:我爱你!嘴巴           +         语言            ->     表达的意思双手           +         手势		 ->	表达的意思操作符(运算符) +         操作数(数据)    ->     值将操作数(数据)用操作符(运算符)按一定的规则连接起来的、有意义的式子称为表达式。操作数(数据)本身就是一个表达式,因为它本身就是一个值。表达式的两个属性:1)表达式都有一个类型;2)表达式都返回一个值。表达式定义的操作完成,则会返回一个值给SQL语句,参与进一步的处理。--2.3SQL数据类型表列的属性:name、type、value数据库中的每一列都有分配一种数据类型。这一列存储的数据就只能是这一类的。数据类型也决定了用户能对这一列所做的操作。INTCHARVARCHAR2NUMBERDATE--2.4表达式类型1)连接表达式把两个或多个项放到一个字符串中CHARACTER STRING Literal || CHARACTER STRING LiteralCOLUMN REFERENCE            COLUMN REFERENCE51 || ‘testing‘first_name || last_name‘This is ‘ || first_name2)数学表达式进行加减乘除运算NUMERIC Literal     +     NUMERIC LiteralCOLUMN REFERENCE    -     COLUMN REFERENCE                    *                    /1 + 2price * 2price * price                    3)日期表达式日期计算DATE Literal        +     Non-DECIMAL NUMERIC Literal(非小数数值文字)COLUMN REFERENCE    -     DATE Literal                          COLUMN REFERENCEDATE‘2000-1-1‘ + 1dob - 1--2.5在select中使用表达式在一个查询中创建一个计算列查找某指定的列值对结果集中的行进行过滤选择用join操作连接两个表1)连接表达式SELECT first_name || last_name FROM customers; 2)数学表达式SELECT price, price*2 FROM products;3)日期表达式SELECT dob, dob-1 FROM customers;归纳:值表达式(返回特定类型值的表达式)Literal VALUE       +   COLUMN REFERENCE    -FUNCTION            *(VALUE expression)  /                   ||CHARACTER  ||NUMERIC    + - * /DATE       + ---2.6空值NULL1)表示没有或未知在一个表中,如果一行中的某列没有值,那么就称它为空值(NULL) NULL与 0、空字符串或空格不同。     2)空值带来的问题:(1)NULL 关系运算符(= <> > >= < <=) -> unknownSELECT * FROM customersWHERE  customer_id <> NULL;(2)NULL 算术运算符(+ - * /)        -> NULLSELECT NULL+3 FROM dual;【ch3 数据过滤】--3.1使用where提炼信息1)where子句用来过滤select语句从一个表中取出的信息。包含一个查询条件,对信息的过滤就是由这个查询条件完成的。查询条件提供了一种选择机制,仅选择想要的行或把不想要的行从结果中删除。from子句定义的逻辑表中的所有行,都要经过查询条件的过滤。查询条件包含一个或多个谓词,每一个谓词都是一个表达式(关系表达式),检验一个或多个值表达式并返回true、false或unknown。还可以用and或or这两个逻辑运算符把多个谓词连接在一起组成一个查询条件(逻辑表达式)。对某一特定的行而言,若整个查询条件的结果为true,则这一行就会出现在最终的结果集中。SELECT * FROM customers WHERE customer_id = 2;SELECT * FROM customers WHERE customer_id > 2 AND dob > DATE‘2000-1-1‘;2)关系和逻辑表达式关系表达式:用关系运算符(= <> > >= < <= BETWEEN AND IN LIKE IS NULL)将两个值表达式连接起来的式子,称为关系表达式。逻辑表达式:用逻辑运算符(AND OR NOT)将关系表达式连接起来的有意义的式子称为逻辑表达式。五个基本谓词:1)comparision包括六种比较操作符: = <> < <= > >=来比较两个值表达式的大小关系2)RANGEbetween谓词可以用来检验一个给定的值表达式的值是否落在一个确定的范围内。这个值的范围可以用两个值表达式确定,其间可以用and关键字隔开。value_expr BETWEEN A AND B <=>  value_expr >=A AND value_expr <= B3)membershipin谓词用来判定一个值表达式的值是否和一个给定列表中值相匹配。value_expr IN (v1,v2,v3,...) <=>value_expr = v1 OR value_expr = v2 OR value_expr = v3 ...4)pattern matchLIKE谓词用来判定字符串类型的值表达式是否和给定的字符串匹配。5)NULLIS NULL谓词用来判断一个值表达式的值是否为空。--3.2查询条件定义1)比较SELECT * FROM customers WHERE customer_id <> 2;SELECT customer_id, first_name, last_name  FROM customers WHERE customer_id > 8;2)范围SELECT *  FROM customers WHERE dob BETWEEN DATE ‘1968-02-05‘ AND DATE ‘1970-05-20‘;3)集合成员SELECT * FROM customers WHERE customer_id IN (1, 2, 3);4)模式匹配--通配符--下划线 _ 匹配指定位置上的任意一个字符--百分号 % 匹配从指定位置开始的任意字符--escape选项可以对通配符进行文本匹配SELECT * FROM customers WHERE first_name LIKE ‘_o%‘;INSERT INTO customers VALUES(88,‘cai_zhiguo‘,‘czg‘,SYSDATE,13812345678);INSERT INTO customers VALUES(88,‘cai|zhiguo‘,‘czg‘,SYSDATE,13812345678);COMMIT;SELECT * FROM customers WHERE first_name LIKE ‘%i\_zhi%‘ ESCAPE ‘\‘;SELECT * FROM customers WHERE first_name LIKE ‘%iH_zhi%‘ ESCAPE ‘H‘;5)空值SELECT * FROM customers WHERE dob IS NULL;6)NOTSELECT * FROM customers WHERE first_name NOT LIKE ‘_o%‘;SELECT * FROM customers WHERE dob IS NOT NULL;          --3.3多个条件的使用1)AND OR两个或多个条件可以使用and或or操作符来连接。and:结果集中出现的每一行必须满足要连接的所有条件(满足所有的关系表达式)。可以这样理解:在第一个关系表达式满足的基础上,对第二个关系表达式进行筛选,再在此基础上对第三个关系表达式进行筛选...依次执行筛选,直到最后一个表达式,最终得到返回的结果集。AND   TRUE    FALSETRUE  TRUE    FALSEFALSE FALSE   FALSESELECT *  FROM customers WHERE dob > DATE ‘1970-6-1‘   AND customer_id > 3;OR:结果集中的行只要满足连接条件中的任一个就可以被选择(满足任意一个关系表达式)。可以这样理解:先单独求满足第一个关系表达式的结果集,再单独求满足第二个关系表达式的结果集,再单独求第三个...依次单独求出每个关系表达式的结果集,再对这些结果集进行合并,并剔除重复的记录后,最终得到返回的结果集。OR    TRUE    FALSETRUE  TRUE    TRUEFALSE TRUE    FALSESELECT *  FROM customers WHERE dob > DATE ‘1970-6-1‘   OR customer_id > 3;   2)AND OR 一起使用SELECT *  FROM employees e WHERE e.title = ‘CEO‘    OR e.title = ‘CFO‘   AND e.salary = 600000;3)优先级操作符处理优先级:+(正)-(负)* /+ -= <> < <= > >= BETWEEN IN LIKE IS NULLNOTANDOR()改变优先级带括号的条件是在不带括号的条件之前处理的;两个或多个带括号的条件,从左至右处理;嵌套的带括号的条件,从内至外处理。SELECT *  FROM employees e WHERE (e.title = ‘CEO‘    OR e.title = ‘CFO‘)   AND e.salary = 600000;4)空值补充任何处理空值的谓词其结果都是unknown。一行要出现在结果集中,那么其谓词必须为真,若结果为假或未知的行都会被排除在结果集之外。AND     TRUE    FALSE     unknownTRUE    TRUE    FALSE     unknownFALSE   FALSE   FALSE     FALSEunknown unknown FALSE     unknownOR      TRUE    FALSE     unknownTRUE    TRUE    TRUE      TRUEFALSE   TRUE    FALSE     unknownunknown TRUE    unknown   unknown(expression)   NOT (expression)TRUE           FALSEFALSE          TRUEunknown        unknown