SQL 开发技巧
SQL 语句类型
DDL:数据定义语言
TPL:事务处理无言
DCL:数据控制语言
DML:数据操作语言{SELECT INSERT UPDATE DELETE}
SQL重要性:
1.增加数据库处理效率,减少 应用相应时间。
2.减少数据库服务器负载,增加服务器稳定。
3.减少服务器间通讯的网络流量。
(实现一些其他人觉得SQL语句完成不了的功能,这也是一件非常酷的事情)
Join从句的正确使用
例子表:
一表: 唐僧四人表(four) 悟空关系表(relation)
id username over id uasername over
1 唐僧 仙 1 牛魔王 被降服
2 孙悟空 斗战 2 红孩儿 被降服
3 猪八戒 猪 3 托塔天王 被降服
4 沙和尚 傻逼 4 孙悟空 超牛逼
Join的类型:
1.内连接--INNER
将两张表的组合在一起,产生新的结果表
SELECT * FROM four as f INNER JOIN relation as r ON f.username = r.username
结果就是只有一条记录
2.全外连接--FULL OUTER
左连接和右连接的结合
1.可以将两张表的所有字段结果集
2.可以过滤AB两表的关联字段
问题来了:
SELECT * FROM four as f FULL JOIN relation as r ON r.username = f.username 会报ERROR 1600错误
解决方法:UNION ALL
select f.username, f.over, r.over from four f LEFT JOIN relation r ON f.username = r.username
union ALL
select r.username, r.over, f.over from relation r RIGHT JOIN four f ON r.username = f.username
这样就能查询出两表的所有数据
3.左外连接--LEFT OUTER
1.A表B表关联,取得A表中的所有结果集
2.A表B表关联,取得A表中除了和B表关联的其他字段结果集
查询取经四人组中哪些人不是悟空的结拜兄弟。
select a.user_name,a.over,b.over FROM four as f LEFT JOIN relation as r ON r.username = f.username WHERE r.username IS NULL(反之则IS NOT NULL)
4.右外连接--RIGHT OUTER
1.A表B表关联,取得B表中的所有结果集
2.A表B表关联,取得B表中除了和A表关联的其他字段结果集
查询悟空的结拜兄弟中那些人没有去取经
select r.user_name,r.over,f.over FROM four as f LEFT JOIN relation as r ON r.username = f.username WHERE f.username IS NULL(反之则IS NOT NULL)
5.交叉连接(CROSS)
交叉连接(cross join),又称笛卡尔连接(cartesian join)或叉乘(Product),如果A和B是两个集合,他们的交叉连接就为:A x B(如果A有4个字段,B有五个,就是20个)
select a.name,b.name from user1 a CROSS JOIN user b (没有任何关键字)
Join相关SQL技巧
如何更新使用过滤调教中包括自身的表?
UPDATE user1 a join (select b.username from user1 a join user2 b on a.username = b.username) b on a.username = b.username
SET a.over = '齐天大神';
使用JOIN优化子查询
select a.username,a.over,b.over as over2 from user1 a LEFT JOIN user2 b ON a.username = b.username
使用JOIN优化聚合子查询
select 【field1,field2..fieldn】 functionname(聚合函数) from tablename
【where condition】
group by field1,field2..fieldn 进行分类聚合的字段
【with rollup】 可选语法:是否对已经聚合过的结果再进行汇总
【having where condition】分类聚合后再进行条件过滤
分组选择
使用场景:选择阅读量前十的不同分类的新闻头条//选择前十的不同分类的课程(如前端,后段,数据库)
例子: SELECT d.username, ctimestr, kills FROM (SELECT user_id, timestr,kills, (SELECT COUNT(*) FROM user_kills b WHERE b.user_id=a.user_id AND a.kills <= b.kills) AS cnt FROM user_kills a GROUPS BY user_id,timestr,kills) c JOIN user1 d ON c.user_id=d.id WHERE cnt <= 2
=====================自己记录的笔记,可能有点简陋