--第一部分: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 products ORDER BY product_type_id,product_id; --asc/desc SELECT * FROM customers ORDER BY last_name DESC, dob ASC; --nulls first/nulls last SELECT * FROM customers ORDER BY phone NULLS FIRST, dob NULLS LAST; 【ch2 查询基本概念】 --2.1select子句内容(select list) 1)列引用 (table_name.)column_name 2)文字值 字符串文字 ‘51testing‘ ‘This is a sample sql‘ ‘12345‘ ‘You‘‘d better study hard‘ 数值文字 911 -3.1415 .8888 3.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 数据库中的每一列都有分配一种数据类型。 这一列存储的数据就只能是这一类的。 数据类型也决定了用户能对这一列所做的操作。 INT CHAR VARCHAR2 NUMBER DATE --2.4表达式类型 1)连接表达式 把两个或多个项放到一个字符串中 CHARACTER STRING Literal || CHARACTER STRING Literal COLUMN REFERENCE COLUMN REFERENCE 51 || ‘testing‘ first_name || last_name ‘This is ‘ || first_name 2)数学表达式 进行加减乘除运算 NUMERIC Literal + NUMERIC Literal COLUMN REFERENCE - COLUMN REFERENCE * / 1 + 2 price * 2 price * price 3)日期表达式 日期计算 DATE Literal + Non-DECIMAL NUMERIC Literal(非小数数值文字) COLUMN REFERENCE - DATE Literal COLUMN REFERENCE DATE‘2000-1-1‘ + 1 dob - 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空值NULL 1)表示没有或未知 在一个表中,如果一行中的某列没有值,那么就称它为空值(NULL) NULL与 0、空字符串或空格不同。 2)空值带来的问题: (1)NULL 关系运算符(= <> > >= < <=) -> unknown SELECT * FROM customers WHERE customer_id <> NULL; (2)NULL 算术运算符(+ - * /) -> NULL SELECT 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)RANGE between谓词可以用来检验一个给定的值表达式的值是否落在一个确定的范围内。 这个值的范围可以用两个值表达式确定,其间可以用and关键字隔开。 value_expr BETWEEN A AND B <=> value_expr >=A AND value_expr <= B 3)membership in谓词用来判定一个值表达式的值是否和一个给定列表中值相匹配。 value_expr IN (v1,v2,v3,...) <=> value_expr = v1 OR value_expr = v2 OR value_expr = v3 ... 4)pattern match LIKE谓词用来判定字符串类型的值表达式是否和给定的字符串匹配。 5)NULL IS 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)NOT SELECT * 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 FALSE TRUE TRUE FALSE FALSE FALSE FALSE SELECT * FROM customers WHERE dob > DATE ‘1970-6-1‘ AND customer_id > 3; OR:结果集中的行只要满足连接条件中的任一个就可以被选择(满足任意一个关系表达式)。 可以这样理解: 先单独求满足第一个关系表达式的结果集,再单独求满足第二个关系表达式的结果集,再单独求第三个... 依次单独求出每个关系表达式的结果集,再对这些结果集进行合并,并剔除重复的记录后,最终得到 返回的结果集。 OR TRUE FALSE TRUE TRUE TRUE FALSE TRUE FALSE SELECT * 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 NULL NOT AND OR ()改变优先级 带括号的条件是在不带括号的条件之前处理的; 两个或多个带括号的条件,从左至右处理; 嵌套的带括号的条件,从内至外处理。 SELECT * FROM employees e WHERE (e.title = ‘CEO‘ OR e.title = ‘CFO‘) AND e.salary = 600000; 4)空值补充 任何处理空值的谓词其结果都是unknown。 一行要出现在结果集中,那么其谓词必须为真, 若结果为假或未知的行都会被排除在结果集之外。 AND TRUE FALSE unknown TRUE TRUE FALSE unknown FALSE FALSE FALSE FALSE unknown unknown FALSE unknown OR TRUE FALSE unknown TRUE TRUE TRUE TRUE FALSE TRUE FALSE unknown unknown TRUE unknown unknown (expression) NOT (expression) TRUE FALSE FALSE TRUE unknown unknown
Oracle学习(二)_多表操作,布布扣,bubuko.com
原文:http://www.cnblogs.com/qmfsun/p/3847505.html