算是基础拾遗,简单记录一下基础的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