SQL查询基础

算是基础拾遗,简单记录一下基础的SQL语句和之前工作遇到的需要条件的语句

SQL操作四大类,增删改查数据库

不同的SQL语句被赋予了不同的定义,DDL DML DCL

一、DDL(数据库定义语言)

1、修改表字段,alter table语句的用法如下

(1)修改表字段的数据类型:alter table table_name modify…
(2)新增表字段:alter table table_name add…
(3)删除表字段:alter table table_name drop…
(4)字段改名:alter table table_name change…
(5)更改表名:alter table table_name rename…

简单概括即,凡修改表属性(表字段 表结构 表名)都属于该类

二、DML(数据操作语句)

(1)增删改查:insert update delete select

update里两表关联操作例子:
update cv inner join cv2 on cv.c=cv2.c set cv.v='vvv';
或者
update cv,cv2 set cv.v=cv2.v where cv.c=cv2.c;

(2)查询不重复的记录:distinct关键字
(3)条件查询:where关键字
(4)排序和限制:
limit限制显示数据条数;
desc和asc是排序关键字;order by按某个字段来排序。
order by后面可以跟多个不同的排序字段,每个排序字段可以有不同的排序规则:如果排序字段的值为一样的,则值相同的字段按照第二个排序字段进行排序;如果只有一个排序字段,则这些字段相同的记录将会无序排列
(5)聚合:
常用的聚合函数有sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)
group by关键字表示要进行分类聚合的字段;
with rollup是可选语法,表名是否对分类聚合后的结果进行再汇总;
having关键字表示对分类后的结果再进行条件的过滤;
having和where的区别在于:having是对聚合后的结果进行条件的过滤,where是在聚合前就对记录进行过滤,如果逻辑允许,建议尽可能用where过滤,这样因为结果集减少,将对聚合的效率大大提高,最后再根据逻辑看是否用having进行再过滤
(6)表连接:
表连接分为:left join(左连接)、right join(右连接)、inner join(内连接)

(7)子查询:
用于子查询的关键字主要包括:in not in = != exists not exists等
子查询一般可以转换为表连接,表连接在很多情况下用于优化子查询的;
(8)记录联合:关键字是union、union all,union是将union all后的结果进行一次distinct,去除重复记录后的结果

小技巧:
(1)多表同时更新数据:update table_a table_b set ….where table_a.xxx=table_b.xxx
(2)多表同时删除数据:delete table_a,table_b from table_a,table_b where table_a.xxx=table_b.xxx and …[其他条件],这样符合where条件的记录,table_a,table_b表里都将被删除

有些人不理解左右连接与普通连接的区别,join 与inner join 是一样的意思,where语句和inner join是等价的

即 
    *
FROM
    A a
INNER JOIN B b ON a.id = b.pid

SELECT
    *
FROM
    A a,
    B b
WHERE
    a.id = b.pid

是完全等价的,左联 右联略有不同,左联即以左边的表为主表,如 A left join B,A为主表,会展示所有符合条件的主表数据,而A有B没有的数据,则会展示成null

 

复盘一下开发中遇到的一个需求,没写出来

照网上给的说法,if条件判断只在存储过程有效,而普通SQL中,我们可以借助case when来实现条件判断

SELECT CASE 
WHEN (SELECT info2.depttypecode FROM HRMDEPARTMENTDEFINED info2 WHERE info2.deptid = ?) = 'JGLX01'
AND (SELECT info3.deptdepth FROM HRMDEPARTMENTDEFINED info3 WHERE info3.deptid = ?) = 2  THEN  ( SELECT CASE  WHEN info4.deptdirectors IS NOT NULL THEN info4.deptdirectors||','|| info1.deptdirectors
ELSE info1.deptdirectors
END
FROM HRMDEPARTMENTDEFINED info4
WHERE info4.deptid = ( SELECT t1.supdepid FROM HRMDEPARTMENT t1 WHERE t1.id = ?)
)
ELSE info1.deptdirectors
END AS result
FROM HRMDEPARTMENTDEFINED info1
WHERE info1.deptid = ?

需求是这样的,给部门ID参数,当该部门为普通部门,返回当前部门负责人ID,当该部门为二级部门,返回当前部门及上级部门负责人

HRMDEPARTMENTDEFINED 表,存储部门负责人(deptdirectors),部门ID(deptid),部门编码(depttypecode),部门深度(deptdepth)

HRMDEPARTMENT 表,存储部门ID(ID 关联上表中的deptid,在该表中为主键),上级部门ID(supdepid),上级部门的负责人信息可能为null

二级部门判断条件为:depttypecode = 'JGLX01' 且部门深度为2

之前没有写过这样的SQL,觉得借助case when实现条件判断是个很神奇的事,记录也是学习,以后再遇到类似的问题,可以做个参考,主语法就是case when else end

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值