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 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学习(二)_多表操作的更多相关文章
- 学习MySQL之单表操作(二)
##单表操作 ##创建表 CREATE TABLE t_employee( empno ), ename ), job ), MGR ), Hiredate DATE DEFAULT '0000-00 ...
- day 46 Django 学习3 数据库单表操作以及反向解析
前情提要: Django 已经学了不少了, 今天学习链接数据库的操作.以及相关的反向解析等 一:反向解析 1:反向解析模板层 跳转时设定url会随着前面的路由改变而改变 2:反向解析之 ...
- Django 学习 之ORM多表操作
一.创建模型 1.模型关系整理 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建 ...
- JAVAEE学习——hibernate03:多表操作详解、级联、关系维护和练习:添加联系人
一.一对多|多对一 1.关系表达 表中的表达 实体中的表达 orm元数据中表达 一对多 <!-- 集合,一对多关系,在配置文件中配置 --> <!-- name属性:集合属性名 co ...
- Oracle学习(五):多表查询
1.知识点:能够对比以下的录屏进行阅读 SQL> --等值连接 SQL> --查询员工信息: 员工号 姓名 月薪 部门名称 SQL> select empno,ename,sal,d ...
- oracle学习篇七:更新操作、事务处理
----------------1.数据库更新操作----------------------------- select * from tab;--查询表 drop table siebel_use ...
- Oracle小技巧_不同表空间不同用户导入导出数据dmp
[博主注:数据库方面 ITPUB网站及博客内容非常丰富] 转载来源ITPUB 博客 经常有人会问:原来的数据在USERS表空间里面,我想把它IMP进APP表空间,我已经修改了目的用户的默认表空间, ...
- 学习笔记:oracle学习二:oracle11g数据库sql*plus命令之常用sqlplus命令、格式化查询结果
目录 1.常用sqlplus命令 1.1 HELP命令 1.2 describe命令 1.3 SPOOL命令 1.4 其他常用命令 1.4.1 define命令 1.4.2 show命令 1.4.3 ...
- 学习笔记:oracle学习二:oracle11g数据库sql*plus命令之数据库交互、设置运行环境
目录 1.SQL*PLUS与数据库的交互 2.设置sql*plus运行环境 2.1 set命令简介 2.2 使用set命令设置运行环境 2.2.1 pagesize变量 2.2.2 NEWPAGE变量 ...
随机推荐
- linux基础知识(1)
1.date man date :查看帮助 1. date [OPTION]... [+FORMAT]:显示时间 ,format表示格式符号 例如: date :Sun Dec 23 21:45:34 ...
- vue.js手机号验证是否正确
{literal} var mobile_mode=/^1[34578]\d{9}$/; {/literal} if(!mobile_mode.test(te ...
- HTML页面加载完毕后运行的js
Js方法:<script type=”text/javascript”> window.onload=function (){ var userName=”xiaoming”; alert ...
- 【洛谷p1012】拼数
(今天yuezhuren大课间放我们出来了……) (另外今天回了两趟初中部) 拼数[传送门] 洛谷算法标签: (然鹅这两个学的都不好,能过真的how strange) 开始的时候没读题啊,直接暴力so ...
- Git创建新项目
1. git init 2. git remote add origin 3. git pull origin --allow-unrelated-histories 4. git push orig ...
- 牛客寒假算法基础集训营6 I-wzoi
题目链接 分析:这个题本质上可以看成是一个括号匹配题,因为当出现00和11的时候,毫无疑问是前一天看题,后一天写题,这样可以得到最大的得分10 将全部00和11删掉后,就是交替出现的01串了 代码如下 ...
- Spring boot(六)优雅使用mybatis
orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活调试动态sql的mybatis,两者各有特点,在企业级系统开 ...
- 模拟数据库丢失undo表空间
数据库无事务情况下丢失undo表空间数据文件 1. 查看当前undo表空间,并删除物理undo文件 SYS@userdata>show parameter undo_tablespace; NA ...
- Segments
Segments Given n segments in the two dimensional space, write a program, which determines if there e ...
- InnoDB支持的最大事务数量
Innodb存储引擎有rollback segment,每个rollback segment中记录了1024个undo log segment,在每个undo log segment中进行undo页的 ...