zoukankan      html  css  js  c++  java
  • 【SQL】高级函数汇总

    基本常用查询

    -- all 查询所有,几乎从来不用 all 关键字,因为是默认关键字
    select all sex from student;
     
    -- distinct 过滤重复 (常用语检查一列数据是否有异常值)
    select distinct sex from student;
     
    -- count 统计
    select count(distinct sex) from student;
     
    -- top 取前N条记录
    select top 3 * from student;
     
    -- column 列运算
    select (age + id) col from student;
    select s.name + '-' + c.name from classes c, student s where s.cid = c.id;
     
    -- having 分组过滤条件
    -- 按照年龄分组,过滤年龄为空的数据,并且统计分组的条数和现实年龄信息
    select count(*), age from student group by age having age is not null;
     
    -- 按照年龄和cid组合分组,过滤条件是cid大于1的记录
    select count(*), cid, sex from student group by cid, sex having cid > 1;
     
    -- 按照年龄分组,过滤条件是分组后的记录条数大于等于2
    select count(*), age from student group by age having count(age) >= 2;
     
    -- 按照cid和性别组合分组,过滤条件是cid大于1,cid的最大值大于2
    select count(*), cid, sex from student group by cid, sex having cid > 1 and max(cid) > 2;

    嵌套子查询

        子查询是一个嵌套在select、insert、update 或 delete 语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也成为外部查询或外部选择。

    -- 将一个 table 的查询结果当做一个新表进行查询
    select * from (
        select id, name from student where sex = 1
    ) t where t.id > 2;

    上面括号中的语句,就是子查询语句(内部查询)。在外面的是外部查询,其中外部查询可以包含以下语句:

         1、 包含常规选择列表组件的常规select查询

         2、 包含一个或多个表或视图名称的常规from语句

         3、 可选的where子句

         4、 可选的group by子句

         5、 可选的having子句

    -- 查询班级信息,统计班级学生人生
    select *, (select count(*) from student where cid = classes.id) as num 
    from classes order by num;
     
    -- 查询班级id大于小于X的这些班级的学生信息
    select * from student where cid in (
        select id from classes where id > 2 and id < 4
    );
     
    -- 查询不是X班的学生信息
    select * from student where cid not in (
        select id from classes where name = '2班'
    )
     
    -- all,any,some
    select * from student where cid = 5 and age > all (
        select age from student where cid = 3
    );
     
    select * from student where cid = 5 and age > any (
        select age from student where cid = 3
    );
     
    select * from student where cid = 5 and age > some (
        select age from student where cid = 3
    );

    聚合查询

    1、 distinct去掉重复数据

    select distinct sex from student;
    select count(sex), count(distinct sex) from student;

    2、 compute和compute by汇总查询

    -- 对年龄大于20的进行汇总
    select age from student where age > 20 order by age compute sum(age) by age;
     
    -- 对年龄大于20的按照性别进行分组汇总年龄信息
    select id, sex, age from student where age > 20 order by sex, age compute sum(age) by sex;
     
    -- 按照年龄分组汇总
    select age from student where age > 20 order by age, id compute sum(age);
     
    -- 按照年龄分组,年龄汇总,id找最大值
    select id, age from student where age > 20 order by age compute sum(age), max(id);

    compute 进行汇总,前面是查询的结果,后面一条结果集就是汇总的信息。compute 子句中可以添加多个汇总表达式,可以添加的信息如下:

         a、 可选by关键字。它是每一列计算指定的行聚合

         b、 行聚合函数名称。包括sum、avg、min、max、count等

         c、 要对其执行聚合函数的列

         compute by适合做先分组后汇总的业务。compute by 后面的列一定要是 order by 中出现的列。


    3、 cube 汇总

    cube汇总和compute效果类似,但语法较简洁,而且返回的是一个结果集。

    select count(*), sex from student group by sex with cube;
    select count(*), age, sum(age) from student where age is not null group by age with cube;

    cube要结合group by语句完成分组汇总

    排序函数

       排序在很多地方需要用到,需要对查询结果进行排序并且给出序号。比如:

       1、 对某张表进行排序,序号需要递增不重复的

       2、 对学生的成绩进行排序,得出名次,名次可以并列,但名次的序号是连续递增的

       3、 在某些排序的情况下,需要跳空序号,虽然是并列

    -- 基本语法 
    -- 排序函数 over([分组语句] 排序子句[desc][asc])
    -- 排序子句 order by 列名, 列名
    -- 分组子句 partition by 分组列, 分组列
     
     
    -- row_number 函数
    -- 根据排序子句给出递增连续序号,按照名称排序的顺序递增
    select s.id, s.name, cid, c.name, row_number() over(order by c.name) as number 
    from student s, classes c where cid = c.id;
     
    -- rank 函数函数 
    -- 根据排序子句给出递增的序号,但是存在并列并且跳空 
    -- 顺序递增
    select id, name, rank() over(order by cid) as rank from student;
     
    -- dense_rank 函数 
    -- 根据排序子句给出递增的序号,但是存在并列不跳空 
    select s.id, s.name, cid, c.name, dense_rank() over(order by c.name) as dense 
    from student s, classes c where cid = c.id;
     
    -- partition by 分组子句 
    -- 可以完成对分组的数据进行增加排序,partition by可以与以上三个函数联合使用。 
    select s.id, s.name, cid, c.name, row_number() over(partition by c.name order by s.id) as rank 
    from student s, classes c where cid = c.id;
     
    select s.id, s.name, cid, c.name, rank() over(partition by c.name order by s.id) as rank 
    from student s, classes c where cid = c.id;
     
    select s.id, s.name, cid, c.name, dense_rank() over(partition by c.name order by s.id) as rank 
    from student s, classes c where cid = c.id;
     
    -- ntile 平均排序函数 
    -- 将要排序的数据进行平分,然后按照等分排序。ntile中的参数代表分成多少等分。 
    select s.id, s.name, cid, c.name, ntile(5) over(order by c.name) as ntile 
    from student s, classes c where cid = c.id;

    集合运算

    操作两组查询结果,进行交集、并集、减集运算

    -- union 并集、不重复
    select id, name from student where name like 'ja%'
    union select id, name from student where id = 4;
     
    -- union all 并集、重复
    select * from student where name like 'ja%'
    union all select * from student;
     
    -- 交集(相同部分)
    select * from student where name like 'ja%'
    intersect select * from student;
     
    -- 减集(除相同部分)
    select * from student where name like 'ja%'
    except select * from student where name like 'jas%';

    公式表表达式

    查询表的时候,有时候中间表需要重复使用,这些子查询被重复查询调用,不但效率低,而且可读性低,不利于理解。那么公式表表达式可以解决这个问题。

    我们可以将公式表表达式(CET)视为临时结果集,在select、insert、update、delete或是create view语句的执行范围内进行定义。

    with statNum(id, num) as 
    (
        select cid, count(*) from student where id > 0 group by cid
    )
    select id, num from statNum order by id;
     
    with statNum(id, num) as 
    (
        select cid, count(*) from student where id > 0 group by cid
    )
    select max(id), avg(num) from statNum;

    表的联合查询

    -- 简化联接查询
    select s.id, s.name, c.id, c.name from student s, classes c where s.cid = c.id;
     
    -- 左连接 (左为基表)
    select s.id, s.name, c.id, c.name from student s left join classes c on s.cid = c.id;
     
    -- 右连接 (右为基表)
    select s.id, s.name, c.id, c.name from student s right join classes c on s.cid = c.id;
     
    -- 内连接 (等值联合)
    select s.id, s.name, c.id, c.name from student s inner join classes c on s.cid = c.id;
     
    -- 交叉联接查询,结果是一个笛卡儿乘积
    select s.id, s.name, c.id, c.name from student s ,classes c
     
    -- 自连接
    select distinct s.* from student s, student s1 where s.id <> s1.id and s.sex = s1.sex;

    函数

    -- 聚合函数 (max最大值、min最小值、count统计、avg平均值、sum求和、var求方差)
    select 
        max(age) max_age, 
        min(age) min_age, 
        count(age) count_age, 
        avg(age) avg_age, 
        sum(age) sum_age, 
        var(age) var_age 
    from student;
     
    -- 日期时间函数 
    select dateAdd(day, 3, getDate());
    select dateAdd(year, 3, getDate());
    select dateAdd(hour, 3, getDate());
    select dateDiff(day, '2011-06-20', getDate());
    select dateDiff(second, '2011-06-22 11:00:00', getDate());
    select dateDiff(hour, '2011-06-22 10:00:00', getDate());
    select dateName(month, getDate());
    select dateName(minute, getDate());
    select dateName(weekday, getDate());
    select datePart(month, getDate());
    select datePart(weekday, getDate());
    select datePart(second, getDate());
    select day(getDate());
    select day('2011-06-30');
    select month(getDate());
    select month('2011-11-10');
    select year(getDate());
    select year('2010-11-10');
    select getDate();
    select getUTCDate();
     
    -- 数学函数 
    select pi();
    select rand(100), rand(50), rand();
    select round(rand(), 3), round(rand(100), 5);
    select round(123.456, 2), round(254.124, -2);
    select round(123.4567, 1, 2);
     
    -- 元数据 
    select col_name(object_id('student'), 1); // 返回列名
    select col_name(object_id('student'), 2);
    -- 该列数据类型长度
    select col_length('student', col_name(object_id('student'), 2)); 
    -- 该列数据类型长度
    select col_length('student', col_name(object_id('student'), 1)); 
    -- 返回类型名称、类型id
    select type_name(type_id('varchar')), type_id('varchar');
    -- 返回列类型长度
    select columnProperty(object_id('student'), 'name', 'PRECISION');
    -- 返回列所在索引位置
    select columnProperty(object_id('student'), 'sex', 'ColumnId');
     
    -- 字符串函数 
    select ascii('a');
    select ascii('A');
    select char(97);
    select char(65);
    select nchar(65);
    select nchar(45231);
    select nchar(32993);
    select unicode('A'), unicode('');
    select soundex('hello'), soundex('world'), soundex('word');
    select patindex('%a', 'ta'), patindex('%ac%', 'jack'), patindex('dex%', 'dexjack');
    select 'a' + space(2) + 'b', 'c' + space(5) + 'd';
    select charIndex('o', 'hello world');
    select charIndex('o', 'hello world', 6);
    select quoteName('abc[]def'), quoteName('123]45');
    select str(123.456, 2), str(123.456, 3), str(123.456, 4);
    select str(123.456, 9, 2), str(123.456, 9, 3), str(123.456, 6, 1), str(123.456, 9, 6);
    select difference('hello', 'helloWorld');
    select difference('hello', 'world');
    select difference('hello', 'llo');
    select difference('hello', 'hel');
    select difference('hello', 'hello');
    select replace('abcedef', 'e', 'E');
    select stuff('hello world', 3, 4, 'ABC');
    select replicate('abc#', 3);
    select subString('abc', 1, 1), subString('abc', 1, 2), subString('hello Wrold', 7, 5);
    select len('abc');
    select reverse('sqlServer'); 
    select left('leftString', 4);
    select left('leftString', 7);
    select right('leftString', 6);
    select right('leftString', 3);
    select lower('aBc'), lower('ABC');
    select upper('aBc'), upper('abc');
    select ltrim(' abc'), ltrim('# abc#'), ltrim('  abc');
    select rtrim(' abc    '), rtrim('# abc#   '), rtrim('abc');
     
    -- 安全函数 
    select current_user;
    select user;
    select user_id(), user_id('dbo'), user_id('public'), user_id('guest');
    select user_name(), user_name(1), user_name(0), user_name(2);
    select session_user;
    select suser_id('sa');
    select suser_sid(), suser_sid('sa'), suser_sid('sysadmin'), suser_sid('serveradmin');
    select is_member('dbo'), is_member('public');
    select suser_name(), suser_name(1), suser_name(2), suser_name(3);
    select suser_sname(), suser_sname(0x01), suser_sname(0x02), suser_sname(0x03);
    select is_srvRoleMember('sysadmin'), is_srvRoleMember('serveradmin');
    select permissions(object_id('student'));
    select system_user;
    select schema_id(), schema_id('dbo'), schema_id('guest');
    select schema_name(), schema_name(1), schema_name(2), schema_name(3);
     
    -- 系统函数
    select app_name(); // 当前会话的应用程序名称
    select cast(2011 as datetime), cast('10' as money), cast('0' as varbinary); // 类型转换
    select convert(datetime, '2011'); // 类型转换
    select coalesce(null, 'a'), coalesce('123', 'a'); // 返回其参数中第一个非空表达式
    select collationProperty('Traditional_Spanish_CS_AS_KS_WS', 'CodePage');
    select current_timestamp; // 当前时间戳
    select current_user;
    select isDate(getDate()), isDate('abc'), isNumeric(1), isNumeric('a');
    select dataLength('abc');
    select host_id();
    select host_name();
    select db_name();
    select ident_current('student'), ident_current('classes'); // 返回主键id的最大值
    select ident_incr('student'), ident_incr('classes'); // id的增量值
    select ident_seed('student'), ident_seed('classes');
    select @@identity; // 最后一次自增的值
    select @@rowcount; // 影响行数
    select @@cursor_rows; // 返回连接上打开的游标的当前限定行的数目
    select @@error; // T-SQL的错误号
    select @@procid;
     
    -- 配置函数 
    set datefirst 7; // 设置每周的第一天,表示周日
    select @@datefirst as '星期的第一天', datepart(dw, getDate()) AS '今天是星期';
    select @@dbts; // 返回当前数据库唯一时间戳
    set language 'Italian';
    select @@langId as 'Language ID'; // 返回语言id
    select @@language as 'Language Name';// 返回当前语言名称
    select @@lock_timeout; // 返回当前会话的当前锁定超时设置(毫秒)
    select @@max_connections; // 返回SQL Server 实例允许同时进行的最大用户连接数
    select @@MAX_PRECISION AS 'Max Precision'; // 返回decimal 和numeric 数据类型所用的精度级别
    select @@SERVERNAME; // SQL Server 的本地服务器的名称
    select @@SERVICENAME; // 服务名
    select @@SPID; // 当前会话进程id
    select @@textSize;
    select @@version; // 当前数据库版本信息
     
    -- 系统统计函数 
    select @@CONNECTIONS;
    select @@PACK_RECEIVED;
    select @@CPU_BUSY;
    select @@PACK_SENT;
    select @@TIMETICKS;
    select @@IDLE;
    select @@TOTAL_ERRORS;
    select @@IO_BUSY;
    select @@TOTAL_READ;
    select @@PACKET_ERRORS;
    select @@TOTAL_WRITE;
    select patIndex('%soft%', 'microsoft SqlServer');
    select patIndex('soft%', 'software SqlServer');
    select patIndex('%soft', 'SqlServer microsoft');
    select patIndex('%so_gr%', 'Jsonisprogram');
     
    -- 查询所有已创建函数
    select definition,* from sys.sql_modules m join sys.objects o on m.object_id = o.object_id
    and type in('fn', 'if', 'tf');
     
    -- 创建函数
    if (object_id('fun_add', 'fn') is not null)
        drop function fun_add
    go
    create function fun_add(@num1 int, @num2 int)
        returns int
    with execute as caller
    as
        begin
            declare @result int;
            if (@num1 is null)
                set @num1 = 0;
            if (@num2 is null)
                set @num2 = 0;
            set @result = @num1 + @num2;
            return @result;
        end
    go
    -- 调用函数
    select dbo.fun_add(id, age) from student;
     
    -- 自定义函数,字符串连接
    if (object_id('fun_append', 'fn') is not null)
        drop function fun_append
    go
    create function fun_append(@args nvarchar(1024), @args2 nvarchar(1024))
        returns nvarchar(2048)
    as
        begin
            return @args + @args2;
        end
    go 
    select dbo.fun_append(name, 'abc') from student;
     
    -- 修改函数
    alter function fun_append(@args nvarchar(1024), @args2 nvarchar(1024))
        returns nvarchar(1024)
    as
        begin
            declare @result varchar(1024);    
            -- coalesce返回第一个不为null的值    
            set @args = coalesce(@args, '');
            set @args2 = coalesce(@args2, '');;
            set @result = @args + @args2;
            return @result;
        end
    go
    select dbo.fun_append(name, '#abc') from student;
     
    -- 返回table对象函数
    select name, object_id, type from sys.objects where type in ('fn', 'if', 'tf') or type like '%f%';
    if (exists (select * from sys.objects where type in ('fn', 'if', 'tf') and name = 'fun_find_stuRecord'))
        drop function fun_find_stuRecord
    go
    create function fun_find_stuRecord(@id int)
        returns table
    as
        return (select * from student where id = @id);
    go
    select * from dbo.fun_find_stuRecord(2);

    转自大神:https://blog.csdn.net/wang1127248268/article/details/53406564

  • 相关阅读:
    (BFS 二叉树) leetcode 515. Find Largest Value in Each Tree Row
    (二叉树 BFS) leetcode513. Find Bottom Left Tree Value
    (二叉树 BFS DFS) leetcode 104. Maximum Depth of Binary Tree
    (二叉树 BFS DFS) leetcode 111. Minimum Depth of Binary Tree
    (BFS) leetcode 690. Employee Importance
    (BFS/DFS) leetcode 200. Number of Islands
    (最长回文子串 线性DP) 51nod 1088 最长回文子串
    (链表 importance) leetcode 2. Add Two Numbers
    (链表 set) leetcode 817. Linked List Components
    (链表 双指针) leetcode 142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/yhnet/p/12671810.html
Copyright © 2011-2022 走看看