`

sql 语句使用

阅读更多
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略去):



如果不考虑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




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
  • 大小: 49.5 KB
  • 大小: 34 KB
分享到:
评论

相关推荐

    SQLServer动态SQL语句的用法

    例如,使用 exec 语句可以执行动态生成的 SQL 语句,例如: exec('select * from tableName') 使用 exec 语句执行动态 SQL 语句 使用 exec 语句可以执行动态生成的 SQL 语句,例如: declare @s varchar(1000) ...

    sql语句万能生成器,sql语句,sql语句生成

    使用SQL语句生成器,你可以: 1. **快速创建查询**:只需选择所需表和字段,工具就能生成相应的SELECT语句,节省了编写时间。 2. **智能提示和补全**:许多生成器提供了自动补全功能,有助于快速输入SQL关键字和...

    SQL语句在审计

    4、灵活运用SQL语句使用计算列。在进行审计数据分析和查询时经常需要对查询的数据进行再计算,这里审计人员可充分运用SELECT语句的功能来直接使用计算列对审计数据进行运算,而计算列并不存在于表格所存储的数据中,...

    Mysql高级sql语句使用.md

    Mysql高级sql语句使用.md

    泛型封装的sql语句

    在`SqlExecutor&lt;T&gt;`类中,我们可以使用反射来动态构建SQL语句,根据实体类`T`的属性生成对应的INSERT、UPDATE、DELETE等SQL语句。例如,对于INSERT操作,我们可以遍历`T`的所有公开属性,生成`SET`子句,然后结合...

    Oracle Sql语句转换成Mysql Sql语句

    在使用这个工具时,开发者需要确保源代码中的SQL语句是标准的Oracle SQL格式,避免使用特定Oracle数据库的特性,以提高转换的成功率。同时,转换后还需要对生成的MySQL SQL进行测试,确保在目标数据库环境中能正常...

    2实验二通过SQL语句创建与管理数据表[收集].pdf

    删除表的 SQL 语句使用 DROP TABLE 语句,例如删除 Student 表的 SQL 语句为:DROP TABLE Student。同样,我们可以使用 DROP TABLE 语句删除 Course 表和 SC 表。 二、创建表 在实验中,我们使用 SQL 语句创建实验...

    sql语句说明sql语句说明sql语句说明.zip

    sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明...

    Java打印漂亮的SQL语句(被格式化的SQL语句)

    总的来说,Java打印漂亮的SQL语句是一个提高开发效率和代码质量的有效方法,通过使用如"PrettySQLFormatter"这样的工具,可以使得复杂的SQL查询变得更容易理解和维护,这对于大型项目或者涉及大量SQL操作的开发工作...

    力控5.0SQL语句使用样例

    在这个"力控5.0SQL语句使用样例"中,我们将会探讨如何在力控环境中有效地运用SQL语句。 TEST.mdb 是一个Microsoft Access数据库文件,很可能包含了与力控5.0相关的示例数据。在力控5.0中,可以使用SQL语句来与这种...

    PB脚本中SQL语句写法与SQL中语句写法对照

    PB脚本中SQL语句写法与SQL中语句写法对照 PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 ...

    hibernate执行原生sql语句

    "hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...

    自动生成SQL语句_C#_sql_

    1. 动态SQL:在C#中,你可以使用字符串操作生成动态SQL语句,这在需要根据条件生成不同结构的SQL时非常有用。例如,你可以根据用户的选择决定是否在WHERE子句中包含某个条件。 2. 存储过程:另一种方法是使用SQL ...

    unix下的INFORMIX SQL语句的使用

    ### Unix下的INFORMIX SQL语句使用详解 #### 嵌入式SQL语句的特点与应用 在Unix环境下,INFORMIX数据库系统提供了强大的SQL功能,支持开发者将SQL语句直接嵌入到宿主语言(如C语言)中。这种嵌入式SQL编程方式能够...

    巧用with as 对sql语句多次利用

    对于需重复查询的sql语句,可巧用with as 对sql语句进行精简,提高查询效率

    如何使用navicat或PHPMySQLAdmin导入SQL语句.pdf

    使用 Navicat 或 PHPMyAdmin 导入 SQL 语句 Navicat 和 PHPMyAdmin 是两个非常常用的数据库管理工具,它们可以帮助我们轻松地管理数据库,特别是在导入 SQL 语句方面。下面我们将详细介绍如何使用 Navicat 和 ...

    2022年SQL语句简单面试题.doc

    这个SQL语句使用了Group By语句将表中的数据分组,并使用Case When语句统计每组中的胜和负的数量。 2. Case When语句: 在第二道面试题中,需要使用Case When语句实现逻辑判断。Case When语句是SQL语句中最常用的...

    arcgis中的sql语句

    - **VBE环境下ADO方式执行SQL**:在Visual Basic for Applications (VBA)环境中,使用ActiveX Data Objects (ADO)技术可以实现SQL语句的自动化执行,适用于大规模数据处理和脚本编程。 综上所述,SQL在ArcGIS中的...

    sql语句sql语句sql语句sql语句.txt

    sql语句sql语句sql语句sql语句sql语句

    SQLTracker,抓取sql语句的工具

    SQLTracker是一款专为数据库操作监控设计的工具,它在IT领域中主要用于跟踪和记录SQL语句的执行情况。SQL(Structured Query Language)是用于管理关系数据库的编程语言,包括查询、更新、插入和删除数据等操作。SQL...

Global site tag (gtag.js) - Google Analytics