设为首页 收藏本站
查看: 943|回复: 0

[经验分享] sql 语句使用

[复制链接]

尚未签到

发表于 2016-11-9 06:55:21 | 显示全部楼层 |阅读模式
1. 有一张表t_stu;其中三个字段:name,gender,grade;要求用一条sql语句查出男生前5名和女生前五名。
这里使用postgreSQL数据库

-- Create the table
CREATE TABLE
intense.t_stu
(
id NUMERIC(24),
name CHARACTER VARYING(20),
gender NUMERIC(1),
grade NUMERIC(4)
);
-- Truncate the table
truncate table intense.t_stu;
-- Insert data
insert into intense.t_stu values(1,'John',1,93);     
insert into intense.t_stu values(2,'Lisa',0,94);   
insert into intense.t_stu values(3,'John2',1,83);     
insert into intense.t_stu values(4,'Lisa2',0,84);   
insert into intense.t_stu values(5,'John3',1,73);     
insert into intense.t_stu values(6,'Lisa3',0,74);   
insert into intense.t_stu values(7,'John4',1,63);     
insert into intense.t_stu values(8,'Lisa4',0,64);   
insert into intense.t_stu values(9,'John5',1,53);     
insert into intense.t_stu values(10,'Lisa5',0,54);   
insert into intense.t_stu values(11,'John6',1,103);     
insert into intense.t_stu values(12,'Lisa6',0,104);
-- Get the data needed
SELECT
*
FROM
intense.t_stu a
WHERE
(
SELECT
COUNT(*)
FROM
intense.t_stu
WHERE
gender=a.gender
AND grade > a.grade) < 5
ORDER BY
a.grade DESC


a表按照grade由高到低排列,并和t_stu连接,条件是gender相等并且grade大于a表的grade(返回10条记录,count=4略去):
DSC0000.png
如果不考虑gender,只求前5名:

select * from intense.t_stu a where (select count(*) from intense.t_stu where grade > a.grade) < 5 order by a.grade desc


DSC0001.png
2. 有一张表t_game,记录了游戏玩家的id,游戏玩家名name,和每个玩家玩的游戏game,请找出玩游戏最多的那个玩家。

-- Create the table  
CREATE TABLE intense.t_game(   
id numeric(24),
name character varying(20),   
game character varying(20)
);
-- Truncate the table
truncate table intense.t_game;
-- Insert data
insert into intense.t_game values(1,'John','game');
insert into intense.t_game values(2,'Lisa','game2');
insert into intense.t_game values(3,'Jack','game3');
insert into intense.t_game values(4,'Jim','game4');
insert into intense.t_game values(3,'Jack','game5');
insert into intense.t_game values(5,'Eric','game6');
insert into intense.t_game values(1,'John','game7');
insert into intense.t_game values(3,'Jack','game8');
insert into intense.t_game values(6,'Nicolas','game9');
-- Get the data needed
-- MySQL, postgreSQL
SELECT
id,
name
FROM
intense.t_game
GROUP BY
id,
name
ORDER BY
COUNT(*) DESC LIMIT 1
-- SQL Server
SELECT
TOP 1 id,
name
FROM
intense.t_game
GROUP BY
id,
name
ORDER BY
COUNT(*) DESC
-- Oracle


3. CASE WHEN 示例:

-- CASE后面跟字段
SELECT
(
CASE account
WHEN 1
THEN 0.5
WHEN 0
THEN 0
ELSE FLOAT(account)
END) AS account_val
FROM
tb_account;
-- 如果判断表达式比较复杂,把字段放到每个判断表达式中
SELECT
(
CASE
WHEN account IS NULL
THEN 0
WHEN account > 0
THEN FLOAT(account)
ELSE -1
END) AS account_val
FROM
tb_account;


注:这里的float函数是DB2数据库支持的,其它数据库请改成相应的函数。
4. 同步两个表中的某些字段:
表连接关键字(LEFT JOIN, INNER JOIN, RIGHT JOIN等)常常用于查询语句,其实也可以用于更新和删除语句:
在DB2和Oracle上:

UPDATE
tableB b
SET
(
COL_1, COL_2, COL3
)
=
(
SELECT
COL_4, COL_5, COL_6
FROM
tableA a
WHERE
a.ID = b.ID)
WHERE -- WHERE能限定范围,提高性能;如果数据量较大,需要给两张表的连接字段加上索引
ID IN
(
SELECT
ID
FROM
tableA a
WHERE
a.ID = b.ID)

如果tableA中有重复的记录,会导致更新失败,因为数据库不知道该更新为哪个值:
解决思路:限定匹配值只有一个:

-- DB2
UPDATE
tableB b
SET
(
COL_1, COL_2, COL3
)
=
(
SELECT
COL_4, COL_5, COL_6
FROM
tableA a
WHERE
a.ID = b.ID ORDER BY CREATE_TIME DESC FETCH FIRST 1 ROWS ONLY)
ID IN
(
SELECT
ID
FROM
tableA a
WHERE
a.ID = b.ID)


SQL Server上:

UPDATE
b
SET
COL_1=a.COL_4,
COL_2=a.COL_5,
COL_3=a.COL_6
FROM
tableA a
LEFT JOIN
tableB b
ON
a.ID = b.ID
-- 也可以写成:
UPDATE
b
SET
COL_1=a.COL_4,
COL_2=a.COL_5,
COL_3=a.COL_6
FROM
tableA a,
tableB b
WHERE
a.ID = b.ID

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-297660-1-1.html 上篇帖子: SQL高级语法 下篇帖子: SQL经典实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表