- 浏览: 786829 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (573)
- Java基础 (76)
- C++基础 (5)
- hibernate (5)
- struts (4)
- spring (1)
- webservice (7)
- AjaX基础 (0)
- JS脚本 (53)
- 正则表达式 (5)
- html脚本 (30)
- 数据库基础 (54)
- 工作相关 (49)
- 其他 (30)
- Linux (9)
- web服务器 (17)
- JSP (13)
- eclipse (6)
- 面试题相关 (20)
- XML (3)
- Apache common (2)
- 生活 (35)
- VMware (1)
- log4j (9)
- BeanUtils (2)
- 设计模式 (3)
- UML (1)
- UNIX (1)
- ibats (5)
- GT-Grid (17)
- ABAP学习 (17)
- ABAP (35)
- ABAP--ALV (11)
- ABAP--WEBDIMPRO (0)
- abap-sample (1)
- BEMS (2)
- flex (33)
- GIS技术 (3)
最新评论
有两个表,分别为father表和son表。表结构如下:
father表
fid fname
1 a
2 b
3 c
son表
sid sname fid height money
100 s1 1 1.7 7000
101 s2 2 1.7 8000
102 s3 3 1.8 9000
建表代码:
create table father(
fid number primary key,
fname varchar(10)
);
create table son(
sid number primary key,
sname varchar(10),
fid number,
height number,
money number
);
select t.*, t.rowid from father t;
select t.*, t.rowid from son t;
问题用sqlserver或者Oracle查询:
1、查询sid、sname、fid
select sid,sname,fid from son;
2、查询各儿子涨价20%以后的新学费,注意,8000块以下的不涨价。
方法一:
select money*1.2 as new_money from son where money>=8000
union all
select money from son where money<8000;
方法二:
select '涨了' as 涨价情况,money*1.2 as new_money from son where money>=8000
union all
select '没涨',money from son where money<8000;
方法三:
select money,money*1.2 as new_money from son where money>=8000
union all
select money,null from son where money<8000;
select son.*,(case when money<8000 then money
when money>=8000 then money*1.2 end)as new_money
from son;
方法四(函数):
create or replace function f_get_new_money(p_money son.money%type)
return number
as
begin
if(p_money>=8000)then
return p_money*1.2;
else
return p_money;
end if;
end;
调用函数:select son.*,scott.f_get_new_money(money) as new_money from son;
3、查询sid、sname、fname。
--语法 from t1 join t2 on t1.id=t2.id
方法一:
SELECT s.sid,s.sname,f.fname
FROM father f JOIN son s ON f.fid=s.fid;
方法二(子查询):
SELECT s.sid,s.sname,s.fid,(SELECT fname FROM father WHERE father.fid=s.fid) AS fname
FROM son s;
4、fid、fname、儿子数(没有儿子的不显示)
方法一:
SELECT f.fid,f.fname,s.sname
FROM father f JOIN son s ON f.fid=s.fid;
方法二:
SELECT f.fid,f.fname,COUNT(*) x
FROM father f JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname
5、fid、fname、儿子数(没有儿子的个数显示为0)
方法3:以father表为准进行连接
SELECT f.fid,f.fname,s.sname
FROM father f LEFT JOIN son s ON f.fid=s.fid;
方法4:
SELECT f.fid,f.fname,COUNT(*) x
FROM father f LEFT JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname;
方法5:
SELECT f.fid,f.fname,COUNT(s.sid) x
FROM father f LEFT JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname;
方法6:
SELECT f.fid,f.fname,COUNT(s.sid) x
FROM son s RIGHT JOIN father f ON f.fid=s.fid
GROUP BY f.fid,f.fname;
方法7:
SELECT f.fid,f.fname,COUNT(s.sid) x
FROM father f , son s
WHERE f.fid=s.fid
GROUP BY f.fid,f.fname;
方法8:
--Oracle的特有方式
SELECT f.fid,f.fname,COUNT(s.sid) x
FROM father f , son s
WHERE f.fid=s.fid(+)
GROUP BY f.fid,f.fname;
--不是什么地方都 count(*)
6、找出不止有1个儿子的father信息:fid、fname、儿子数
方法一:sql思路:统计出所有父亲的儿子数,统计以后过滤,用having
SELECT f.fid,f.fname,COUNT(*) x
FROM father f JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname
HAVING COUNT(*)>1;
方法2:函数思路
CREATE OR REPLACE FUNCTION f_get_child_count(
p_fid father.fid%TYPE
)
RETURN NUMBER
AS
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM son WHERE son.fid=p_fid;
RETURN v_count;
END;
调用函数:
SELECT f.fid,f.fname,f_get_child_count(f.fid) AS x
FROM father f
WHERE f_get_child_count(f.fid)>1;
7、找出儿子最多的father信息:fid、fname、儿子数
--非相关子查询
SELECT f.fid,f.fname,COUNT(*) x
FROM father f JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname
HAVING COUNT(*)=(
SELECT max(COUNT(*))
FROM father f JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname
);
8、找出所有father中身高最高的儿子。
SELECT * FROM son
WHERE height = (SELECT MAX(height) FROM son);
9、找出各father中身高最高的儿子。
错误答案:
SELECT * FROM son
WHERE height IN(
SELECT MAX(height) FROM son GROUP BY fid
) ;
正确答案:
方法一:相关子查询
SELECT s1.*
FROM son s1
WHERE s1.height = (SELECT MAX(height) FROM son s2 WHERE s2.fid=s1.fid);
分析:
SELECT s1.* FROM son s1
SID SNAME FID HEIGHT MONEY
100 s1 1 1.7 7000 SELECT MAX(height) FROM son s2 WHERE s2.fid=1 -> 1.7=第一条记录的height
101 s2 2 1.7 8000 SELECT MAX(height) FROM son s2 WHERE s2.fid=2 -> 1.8!=第二条记录的height
102 s3 2 1.8 9000 SELECT MAX(height) FROM son s2 WHERE s2.fid=2 -> 1.8=第三条记录的height
方法2:函数
CREATE OR REPLACE FUNCTION f_get_max_height(
p_fid father.fid%TYPE
)
RETURN NUMBER
AS
v_height NUMBER;
BEGIN
SELECT MAX(height) INTO v_height FROM son WHERE son.fid=p_fid;
RETURN v_height;
END;
SELECT f.*,f_get_max_height(f.fid) ROM father f;
方法3:
SELECT s.sid,s.sname,s.height,f_get_max_height(s.fid)
FROM son s
WHERE s.height=f_get_max_height(s.fid);
10、找出身高在1.8到1.65之间的所有儿子及父亲信息。
SELECT f.fid,f.fname,s.sname,height
FROM father f LEFT JOIN son s ON f.fid=s.fid
WHERE height BETWEEN 1.65 AND 1.8;
father表
fid fname
1 a
2 b
3 c
son表
sid sname fid height money
100 s1 1 1.7 7000
101 s2 2 1.7 8000
102 s3 3 1.8 9000
建表代码:
create table father(
fid number primary key,
fname varchar(10)
);
create table son(
sid number primary key,
sname varchar(10),
fid number,
height number,
money number
);
select t.*, t.rowid from father t;
select t.*, t.rowid from son t;
问题用sqlserver或者Oracle查询:
1、查询sid、sname、fid
select sid,sname,fid from son;
2、查询各儿子涨价20%以后的新学费,注意,8000块以下的不涨价。
方法一:
select money*1.2 as new_money from son where money>=8000
union all
select money from son where money<8000;
方法二:
select '涨了' as 涨价情况,money*1.2 as new_money from son where money>=8000
union all
select '没涨',money from son where money<8000;
方法三:
select money,money*1.2 as new_money from son where money>=8000
union all
select money,null from son where money<8000;
select son.*,(case when money<8000 then money
when money>=8000 then money*1.2 end)as new_money
from son;
方法四(函数):
create or replace function f_get_new_money(p_money son.money%type)
return number
as
begin
if(p_money>=8000)then
return p_money*1.2;
else
return p_money;
end if;
end;
调用函数:select son.*,scott.f_get_new_money(money) as new_money from son;
3、查询sid、sname、fname。
--语法 from t1 join t2 on t1.id=t2.id
方法一:
SELECT s.sid,s.sname,f.fname
FROM father f JOIN son s ON f.fid=s.fid;
方法二(子查询):
SELECT s.sid,s.sname,s.fid,(SELECT fname FROM father WHERE father.fid=s.fid) AS fname
FROM son s;
4、fid、fname、儿子数(没有儿子的不显示)
方法一:
SELECT f.fid,f.fname,s.sname
FROM father f JOIN son s ON f.fid=s.fid;
方法二:
SELECT f.fid,f.fname,COUNT(*) x
FROM father f JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname
5、fid、fname、儿子数(没有儿子的个数显示为0)
方法3:以father表为准进行连接
SELECT f.fid,f.fname,s.sname
FROM father f LEFT JOIN son s ON f.fid=s.fid;
方法4:
SELECT f.fid,f.fname,COUNT(*) x
FROM father f LEFT JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname;
方法5:
SELECT f.fid,f.fname,COUNT(s.sid) x
FROM father f LEFT JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname;
方法6:
SELECT f.fid,f.fname,COUNT(s.sid) x
FROM son s RIGHT JOIN father f ON f.fid=s.fid
GROUP BY f.fid,f.fname;
方法7:
SELECT f.fid,f.fname,COUNT(s.sid) x
FROM father f , son s
WHERE f.fid=s.fid
GROUP BY f.fid,f.fname;
方法8:
--Oracle的特有方式
SELECT f.fid,f.fname,COUNT(s.sid) x
FROM father f , son s
WHERE f.fid=s.fid(+)
GROUP BY f.fid,f.fname;
--不是什么地方都 count(*)
6、找出不止有1个儿子的father信息:fid、fname、儿子数
方法一:sql思路:统计出所有父亲的儿子数,统计以后过滤,用having
SELECT f.fid,f.fname,COUNT(*) x
FROM father f JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname
HAVING COUNT(*)>1;
方法2:函数思路
CREATE OR REPLACE FUNCTION f_get_child_count(
p_fid father.fid%TYPE
)
RETURN NUMBER
AS
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM son WHERE son.fid=p_fid;
RETURN v_count;
END;
调用函数:
SELECT f.fid,f.fname,f_get_child_count(f.fid) AS x
FROM father f
WHERE f_get_child_count(f.fid)>1;
7、找出儿子最多的father信息:fid、fname、儿子数
--非相关子查询
SELECT f.fid,f.fname,COUNT(*) x
FROM father f JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname
HAVING COUNT(*)=(
SELECT max(COUNT(*))
FROM father f JOIN son s ON f.fid=s.fid
GROUP BY f.fid,f.fname
);
8、找出所有father中身高最高的儿子。
SELECT * FROM son
WHERE height = (SELECT MAX(height) FROM son);
9、找出各father中身高最高的儿子。
错误答案:
SELECT * FROM son
WHERE height IN(
SELECT MAX(height) FROM son GROUP BY fid
) ;
正确答案:
方法一:相关子查询
SELECT s1.*
FROM son s1
WHERE s1.height = (SELECT MAX(height) FROM son s2 WHERE s2.fid=s1.fid);
分析:
SELECT s1.* FROM son s1
SID SNAME FID HEIGHT MONEY
100 s1 1 1.7 7000 SELECT MAX(height) FROM son s2 WHERE s2.fid=1 -> 1.7=第一条记录的height
101 s2 2 1.7 8000 SELECT MAX(height) FROM son s2 WHERE s2.fid=2 -> 1.8!=第二条记录的height
102 s3 2 1.8 9000 SELECT MAX(height) FROM son s2 WHERE s2.fid=2 -> 1.8=第三条记录的height
方法2:函数
CREATE OR REPLACE FUNCTION f_get_max_height(
p_fid father.fid%TYPE
)
RETURN NUMBER
AS
v_height NUMBER;
BEGIN
SELECT MAX(height) INTO v_height FROM son WHERE son.fid=p_fid;
RETURN v_height;
END;
SELECT f.*,f_get_max_height(f.fid) ROM father f;
方法3:
SELECT s.sid,s.sname,s.height,f_get_max_height(s.fid)
FROM son s
WHERE s.height=f_get_max_height(s.fid);
10、找出身高在1.8到1.65之间的所有儿子及父亲信息。
SELECT f.fid,f.fname,s.sname,height
FROM father f LEFT JOIN son s ON f.fid=s.fid
WHERE height BETWEEN 1.65 AND 1.8;
发表评论
-
oracle获取指定的日期、时间
2012-07-17 14:32 1075--本周 select trunc(sysdate, 'd ... -
Oracle 常用日期提取脚本汇总
2012-07-17 14:30 815Oracle 常用日期提取脚本汇总 1、本周第一天和最后一 ... -
Windows下安装PostgreSQL8.2图解
2010-08-20 13:16 1183Windows下安装PostgreSQL8.2图解 -
关于用户角色权限管理一点想法
2010-06-09 10:46 1090关键字: 权限 --------------------- ... -
sql语句解析顺序
2010-05-20 14:47 1355标准的 SQL 的解析顺序 ... -
postgreSql 利用触发器创建动态表
2010-05-20 14:43 1729在postgresql 中如果在程序运行中需要根据插入数据条件 ... -
使用反射实现ORM
2010-01-14 22:09 936首先Bean在符合JavaBean的要求,即有一个无参的构造方 ... -
模板设计模式_构建公共通用的Dao
2010-01-14 22:04 953核心代码: Connection的工具类:详见:JDBC数据 ... -
使用构造函数创建JavaScript对象
2010-01-14 21:31 948<!DOCTYPE html PUBLIC " ... -
数据库行转列
2010-01-14 21:09 811create table score ( s_id int ... -
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
2010-01-14 20:56 911Insert是T-sql中常用语句,Insert INTO t ... -
mysql导入导出
2010-01-12 12:05 14641. 导出 view plaincopy to clip ... -
mysql导入与导出和删除多条数据数据
2010-01-12 11:57 2256数据导出: mysql> select * from ... -
MySQL索引分类和各自用途
2010-01-12 11:43 1488一、 MySQL: 索引以B树格 ... -
各种主流数据库的分页写法
2010-01-11 16:38 639------------------------------- ... -
MySQL中进行树状所有子节点的查询
2010-01-06 21:16 1229在Oracle 中我们知道有一个 Hierarchical Q ... -
MySQL中进行树状所有子节点的查询
2009-12-29 14:52 1003在Oracle 中我们知道有一个 Hierarchical Q ... -
超详细的SQL语句语法
2009-12-28 18:08 1020简单的Transact-SQL查询只包括选择列表、FROM子句 ... -
有关SQL模糊查询
2009-12-28 12:50 1197执行 数据库查询时,有 ... -
视图,存储过程,触发器的好处
2009-12-23 11:33 1066视图的优点: 提高数据安全性,可以不让用户看到表中的某个字 ...
相关推荐
Oracle 数据库语句大全 Oracle 数据库语句大全是 Oracle 数据库管理系统中的一系列语句,用于管理和操作数据库。这些语句可以分为五大类:数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)和事务...
Oracle数据库语句精选大全
数据库语句优化数据库语句优化
SQL_Sever数据库语句大全.zip 具体SQL语句实例如下 获取当前日期的星期 获取某个字段排序的行号 获取数据库所有表和视图的信息 获取月份的月初月末时间 禁用启用触发器 判断是否存在视图(创建视图) 启用服务器...
mysql数据库各种语句学习,自己学习的时候觉得很实用,分享给大家,做数据库方面的开发用得到
经典的数据库查询语句大全,包括增删改查及其他的更广泛的使用方法
数据库操作语句 数据库操作语句数据库操作语句
SQL Server一些常用的数据库语句,进行数据帅选,替换等功能
///////////////////////////////////////////////////////////模拟输入mysql数据库语句
本文将详细介绍SQL的各种语句及其功能,涵盖数据操作、数据定义、数据控制、事务控制、程序化SQL等多个方面,适合数据库初学者学习,并可作为经验丰富的数据库管理员查询工具。 首先,数据操作语句是SQL中最为常见...
基于java电脑彩票销售管理系统的设计与实现ssh(缺数据库语句)(源码+lun文+视频)基于java电脑彩票销售管理系统的设计与实现ssh(缺数据库语句)(源码+lun文+视频)基于java电脑彩票销售管理系统的设计与实现ssh(缺数据库...
Access数据库-SQL语句资料.mdb
SQL数据库语句大全集锦 --语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据定义 ...
Oracle数据库SQL语句大全
管理数据库常用SQL语句 管理数据库常用SQL语句是数据库管理员和开发者必备的技能,以下是常用的管理数据库SQL语句: 1. 查看数据库的版本: 使用 `select @@version` 语句可以查看数据库的版本信息。 2. 查看...
让你清晰的看懂弄懂各种数据库连接语句大全,让你对各种数据库的链接语句更加了解
全国地区的数据库,包括了邮编,地区拼音。是一张表的那种数据结构
oracle还原数据库基础语句 创建表空间,创建用户,还原语句
SQL数据库语句大全