sql学习笔记4:多表查询
来源:互联网 发布:唱歌挣钱的软件 编辑:程序博客网 时间:2024/05/24 02:15
笛卡尔积join
将两张表jion成一个表进行查询
select e.fname, e.lname, d.namefrom employee as e join department as d
内连接
select e.fname, e.lname, d.namefrom employee e inner join department don e.dept_id = d.dept_id
如果, 两个表的列明相同,可以用using
select e.fname, e.lname, d.namefrom employee e inner join department dusing(dept_id)
ANSI连接语法
ANSI标准的优点是:
- 连接条件和过滤条件被分隔到两个字句中(on字句和where字句), 使查询语句更易于理解;
- 每两个表之间的连接条件都在他们自己的on自剧中列出, 这样不容易错误滴忽略了某些连接条件
- 使用SQL92连接语法的查询语句可以在各种数据库服务器中通用.
不标准的语句:
select a.account_id, a.cust_id, a.open_date, a.product_cd FROM account as a, baranch as b, employee e where a.open_emp_id = e.emp_id #链接条件and e.start_date < '2007-01-01'and e.assigned_branch_id = b.branch_id #链接条件and (e.title = 'Teller' or e.title = 'Head Teller')and b.name = 'Woburn Branch';
使用这种查询不容易识别连接条件
select a.account_id, a.cust_id, a.open_date, a.product_cd FROM account as a inner join employee as eon a.open_emp_id = e.emp_idinner join branch as bON e.assigned_branch_id = b.branch_idwhere e.start_date < '2007-01-01'and (e.title = 'Teller' or e.title = 'Head Teller')and b.name = 'Woburn Branch';
连续两次使用同一个表
branch表里有account(账户的开户支行)和employee(雇员所在支行)的表的外键, 若要提取这两个信息需要对branch表进行两次链接.
select a.account_id, e.emp_id,b_a.name as open_branch, b_e.name emp_branchfrom account as a inner join branch as b_aon b_a.branch_id = a.open_branch_idinner join employee as eon a.open_emp_id = e.emp_idinner join branch as b_e on e.assigned_branch_id = b_e.branch_idwhere a.product_cd = 'CHK'
自连接
employee表包含了一个指向自身的外键, 即指向本表自身的的列(superiir_emp_id) . 该列指向了雇员的主管. 使用自连接, 可已在列出每个雇员姓名的同时列出主管的姓名
select e.fname, e.lname, e_mgr.fname, e_mgr.lnamefrom employee as e inner join employee e_mgron e.superior_emp_id = e_mgr.emp_id
相等链接和不等链接
可以通过限定值的范围实现对表的链接,即不等链接
select e.emp_id, e.fname, e.lname, e.start_datefrom employee as e inner join product as pon e.start_date >= p.date_offeredAND e.start_date <= p.date_retiredwhere p.name = 'no-fee checking'
该查询链接没有外键关联, 为了找出连个日期之间的数据.
还可以对自身使用不等链接. 例如, 找出employee表中的不同的两个人为一行输出
select e1.fname, e1.lname, 'vs' as vs , e2.fname, e2.lnamefrom employee as e1 inner join employee as e2 ON e1.emp_id != e2.emp_idwhere e1.title='Teller' and e2.title='Teller'
但是返现表中有重复, 每对名字都有一对名字相反的与之对应
select e1.fname, e1.lname, 'vs' as vs , e2.fname, e2.lnamefrom employee as e1 inner join employee as e2 ON e1.emp_id < e2.emp_idwhere e1.title='Teller' and e2.title='Teller'
问题解决.
0 0
- sql学习笔记4:多表查询
- SQL学习笔记--多表查询
- SQL查询的艺术学习笔记--多表查询
- SQL查询学习笔记
- SQL 查询学习笔记
- 经典SQL学习笔记 (三)-多表查询
- SQL多表查询——学习笔记
- Sql语句学习笔记(4)-查询1
- SQL查询语句 学习笔记
- SQL查询艺术学习笔记--SQL触发器
- 【SQL Server学习笔记】联接提示、查询提示、表提示
- SQL学习笔记10——表连接查询
- 数据库学习笔记 --- SQL查询数据库中所有的表
- 《SQL查询凡人入门》学习笔记之一
- Hibernate学习笔记:使用native sql查询
- Oracle学习笔记之一SQL查询总结
- Oracle学习笔记之一SQL查询总结
- 常见sql语句查询--学习笔记
- ps视频 李涛
- How to Get iWork for Free on Older Macs
- UVA11174vector实现树的搜索和使用逆元求a/b%n
- WIFI DIRECT开发(三)P2P传输技术-WIFI Direct
- hdu 5098 Smart Software Installer 拓扑排序or记忆化搜索
- sql学习笔记4:多表查询
- 线性表-链表(一)
- 《c++编程》第3章第38题
- csuoj 2015.3.15
- 使用JDBC处理MySQL大数据(三)
- windows安装TortoiseGit详细使用教程【基础篇】
- M5-mips交叉编译环境搭建
- php 之 cookie 和 session 简单解读
- 第8周项目3(2)分数类的运算符重载(拓展)