有关SQL

1.工作中常用sql排行

①group by(用来聚合也时常用来去重注意用groupby select 后要跟聚合字段)
②where(SQL计算之前进行过滤,对性能是极大的提高,代码测试阶段where条件下尽量跟分区)
③having(SQL计算之后进行过滤,它的使用会极大提升的代码的简洁性,同样它的功能十分强大)
④时间函数(时间与我们息息相关时间函数同样也是)
⑤nvl函数(去空变0)
⑥union以及union all(像双面胶一样只要数据结构一样就可以直接拼接 union去重拼接,union all不去重)
⑦row_number,rank_number,dence_rank rank函数(给函数标上rank序号)
⑧窗口函数 over(partition by t1 order by t2)(常与rank函数一同使用)
(⑦⑧使用详细可看博客https://blog.csdn.net/shaiguchun9503/article/details/82349050)

2.工作中常用sql小技巧

①运行代码前进行校检代码逻辑性是否正确使用explain sql语句(运行SQL前检验可以提前发现语法错误,减少资源浪费,提高开发效率,强烈建议每次运行前使用explain进行检验)
②查看异常数据null
③查看表分区下具体数据量(show rowcount extended table)
④代码冗余且可复用可创建临时表
(CREATE TABLE if not exists tem_table select * from table)
注:中间表切记从小维度往大维度走尽量减少直接创建大维度表.
例:
需求:创建一个月维度基于base表的中间表
一、先创建日维度表
二、再用日维度表生成月维度表
这样做的好处,增加中间表的复用性,减少大表join带来的资源浪费.

3.SQL进阶(这是重点)

1.关于null值

null值常见问题
  • null 值不是值也不是变量 连接null值常用is null 或者 is not null 来判断是否为空值

      错误:把null当成值
      case col_1
      when 1 then 'o'
      when null then 'x'
      end
      
      正确语法
      
      case when col_1 =1 then 'O'
      when col_1 is null then 'x'
      end
    
  • 2.null值下not in 不等价于 not exists
    ''not in 不等价于 not exists" ,虽然in 和 exists 是可以互换但是在有null情况下不可使用not in 来代替 not exists,not in 在有null情况下默认生成结果为空值,原理涉及到sql的三值原理(分别为true ,false ,以及因为null存在的unknow)

      	CREATE TABLE Class_A
      	(name VARCHAR(16) PRIMARY KEY,
      	age  INTEGER,
      	city VARCHAR(16) NOT NULL );
      	
      	CREATE TABLE Class_B
      	(name VARCHAR(16) PRIMARY KEY,
      	age  INTEGER,
      	city VARCHAR(16) NOT NULL );
      	
      	INSERT INTO Class_A VALUES('布朗', 22, '东京');
      	INSERT INTO Class_A VALUES('拉里',   19, '埼玉');
      	INSERT INTO Class_A VALUES('伯杰',   21, '千叶');
      	
      	INSERT INTO Class_B VALUES('齐藤',  22,   '东京');
      	INSERT INTO Class_B VALUES('田尻',  23,   '东京');
      	INSERT INTO Class_B VALUES('山田',  NULL, '东京');
      	INSERT INTO Class_B VALUES('和泉',  18,   '千叶');
      	INSERT INTO Class_B VALUES('武田',  20,   '千叶');
      	INSERT INTO Class_B VALUES('石川',  19,   '神奈川');
    
      	CREATE TABLE Students
      	(name VARCHAR(16) PRIMARY KEY,
      	 age  INTEGER );
      	
      	INSERT INTO Students VALUES('布朗', 22);
      	INSERT INTO Students VALUES('拉里',   19);
      	INSERT INTO Students VALUES('约翰',   NULL);
      	INSERT INTO Students VALUES('伯杰', 21);
    
  • 需求: 查询与B班住在东京的学生年龄不同的A班学生的SQL语句?

      /*错误sql语句,结果为空值*/
      SELECT *
        FROM Class_A
       WHERE age NOT IN ( SELECT age
                            FROM Class_B
                           WHERE city = '东京' );
      /* 正确的SQL语句:拉里和伯杰将被查询到 */
      SELECT *
        FROM Class_A A
       WHERE NOT EXISTS ( SELECT *
                            FROM Class_B B
                           WHERE A.age = B.age
                             AND B.city = '东京' );
    
  • 在null下使用限定谓词all也会爆空值

      /* 查询比B班住在东京的所有学生年龄都小的A班学生 */
      SELECT *
      FROM Class_A
      WHERE age < ALL ( SELECT age
                    FROM Class_B
                   WHERE city = '东京' );
    
null值克星(重点):

1.极值函数(max,min) 忽略null值
2.聚合函数:count(具体列名)忽略null值 注:count(*)包含null
avg,sum均忽略null值
3.where条件下过滤null值又或者是使用nvl等函数转换null值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值