一些特殊的有用的SQL写法

本文详细介绍了使用Oracle数据库查询前3名记录、第3名记录、某人的名次、最大记录、表中重复记录及删除多余重复记录的方法。通过具体实例展示了查询语句的应用,适合数据库管理和查询学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以ORACLE为例:
1. 查询前3名记录写法:
准备table:
CREATE TABLE "HR"."GRADE"
  (
    "NAME"  VARCHAR2(20 BYTE) NOT NULL ENABLE,
    "SCORE" NUMBER,
    CONSTRAINT "GRADE_PK" PRIMARY KEY ("NAME")
  )
     INSERT INTO GRADE(NAME, SCORE) VALUES('Ming', 99);
     INSERT INTO GRADE(NAME, SCORE) VALUES('Sam', 90);
     INSERT INTO GRADE(NAME, SCORE) VALUES('Will', 87);
     INSERT INTO GRADE(NAME, SCORE) VALUES('Di', 70);
     INSERT INTO GRADE(NAME, SCORE) VALUES('Jason', 52);
     INSERT INTO GRADE(NAME, SCORE) VALUES('Hank', 95);
     INSERT INTO GRADE(NAME, SCORE) VALUES('Joe', 90);
select * from (select * from GRADE order by SCORE desc) where rownum<=3
(说明:如果查询第几名不能用:select * from (select * from GRADE order by SCORE desc) where rownum=2, 实验证明返回0条记录!)
或者:
select * from GRADE g
  where(select count(distinct SCORE) from GRADE where SCORE >= g.SCORE)<=3 order by SCORE desc
2. 查询第3名记录写法:
select * from GRADE g
  where (select count(distinct SCORE) from GRADE where SCORE >= g.SCORE)=3
3. 查询某人的名次:(成绩不能重复)

select count(*) from GRADE where SCORE>=(select SCORE from GRADE where NAME='Will')

4. 查询以某字段为分组中的每组中的最大的记录:

select * from  DOCS k
  where not exists(select * from  DOCS where k.ID=ID and k.VERSION<VERSION)
order by ID;

5. 统计各个分组数量, 如:

a 部门表,  b 员工表
a表字段(
id --部门编号
departmentName-部门名称
)
b表字段(
id--部门编号
employee- 员工名称
)

select count(b.id)as employeecount,a.departmentName from a left join b on a.id=b.id group by b.id,a.departmentName

5. 查询表中重复记录(重复记录是根据单个字段(name)来判断), 如:

select * from test s where s.name in (select name from test group by name having count(*) > 1);

6. 查询表中重复记录(重复记录是根据多个个字段(name, course)来判断), 如:

select * from test s where (s.name, s.course) in (select name, course from test group by name, course having count(*) > 1);

7. 删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from test a
where (a.name,a.course) in  (select name,course from test group by name,course having count(*) > 1)
and rowid not in (select min(rowid) from test group by name,course having count(*)>1)


### ClickHouse SQL语法概述 ClickHouse支持标准SQL语句的同时也引入了一些特有的扩展功能来优化性能和简化复杂操作。对于大多数常见的SQL查询,ClickHouse遵循ANSI SQL规范[^1]。 #### 基本SELECT查询 最简单的`SELECT`语句用于从单个表中检索数据: ```sql SELECT column_name_1, column_name_2 FROM table_name; ``` 此命令返回指定列的数据行集合。如果想要获取所有列,则可以使用星号(*)代替具体的列名列表。 #### 使用WHERE条件过滤 为了只提取满足一定条件的数据记录,在`SELECT`之后可加入`WHERE`子句来进行筛选: ```sql SELECT * FROM users WHERE age >= 18 AND city = 'Beijing'; ``` 这段代码会选择年龄大于等于18岁且居住在北京的所有用户的全部字段信息。 #### 排序与分组 通过`ORDER BY`关键字能够按照某一列或多列对结果集进行升序(ASC)或降序排列(Desc),而`GROUP BY`则允许按某些属性聚合相同类型的条目并执行汇总计算: ```sql -- 对成绩由高到低排序取前两名的成绩 SELECT * FROM ( SELECT * FROM scores ORDER BY grade DESC LIMIT 2 BY student_id -- 每位学生最多保留两个最高分项 ) ORDER BY name ASC; -- 外层再对学生姓名做一次正向排序 ``` 上述例子展示了如何嵌套子查询以实现更复杂的逻辑处理,这里特别注意到了`LIMIT ... BY`这种特殊的用法,它可以在每组内部限制输出数量[^3]。 #### 数据插入 当需要向现有表格添加新纪录时,通常采用如下形式的INSERT语句: ```sql INSERT INTO my_table (column1, column2,...) VALUES(value1,value2,...),(valueA,valueB,...); ``` 值得注意的是,在执行`INSERT`操作期间,系统不仅依赖于完整的SQL解析器还额外启用了专门针对输入格式优化过的快速流式解析机制,从而提高了大批量写入场景下的效率[^2]。 #### 用户权限管理 利用DCL(Data Control Language)中的GRANT/REVOKE命令可以有效地管理和分配不同用户之间的资源访问权限: ```sql CREATE USER IF NOT EXISTS analyst IDENTIFIED WITH no_password; GRANT SELECT ON database.table TO analyst; ``` 这些指令帮助管理员设置精细粒度的安全策略,确保只有授权人员才能接触敏感资料[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值