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】分类聚合后再进行条件过滤it
分组选择
使用场景:选择阅读量前十的不一样分类的新闻头条//选择前十的不一样分类的课程(如前端,后段,数据库)
例子: 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
io
=====================本身记录的笔记,可能有点简陋