mysql开发技巧1
SQL语言的发展
SQL分有(关系型数据库,非关系型数据库)
常见的sql语句类型:
DDL数据定义语言
TPL事务处理语言
DCL数据控制语言
DML数据操作语言
SQL开发技巧着重于DML语句:
DML(SELECT,INSERT , UPDATE , DELETE)
正确使用SQL:
增加数据库处理效率,减少应用响应时间
减少数据库服务器负载,增加服务器稳定
减少服务器间通讯的网络流量
正确的使用join从句:
SQL标准中join的类型:
Join:
内连接(INNER)
全外连接(FULL OUTER)
左外连接(LEFT OUTER)
右外连接(RIGHT OUTER)
交叉连接(CROSS)
1.join操作的类型--innerjoin
Select from tableA A inner join tableB B on A.key=B.key
2.join操作的类型--leftouter join
Select from TableA A left join TableB B onA.key=B.key
Select from TableA A left join TableB B on A.key=B.key where B.keyis null
例子:
查询取经四人组中那些人不是悟空的结拜兄弟
如:
SELECT a.’user_name,a.’over’,b.’over’ FROMuser1 a LEFT JOIN user2 b ON a.’user_name’ WHEREb.user_name IS NULL
3.join操作的类型--rightouter join
Select from TableA A right join TableB B on A.key=B.key
Select from TableA A right join TableB B on A.key=B.key where A.keyis null
例子:
查询悟空的结拜兄弟中那些人没有去取经
如:
SELECT b.’user_name’,b.’over’,a.’over’ FROMuser1 a RIGHT JOIN user2 b ON a.’user_name’ =b.’user_name’ WHEREa.user_name IS NULL
4.join操作的类型--FULLjoin
Mysql 中不支持fulljoin 的连接
解决join操作的类型----fulljoin
如:
SELECT a.’user_name’,a.’over’,b.’over’ FROMuser1 a LEFT JOIN user2 b ON a.’user_name’ =b.’user_name’ NUIONALL SELECT b.’user_name’,b.’over’,a.’over’ FROMuser1 a RIGHT JOIN user2 b ON a.’user_name’ =b.’user_name’
5.join操作的类型---Crossjoin
交叉连接,又称卡迪尔连接,如:A和B是两个合集,他们的交叉连接就是:A*B
如:
SELECT a.’user_name’,a.’over’,b.user_name,b.’over’ FROMuser1 a CROSS JOIN user2 b
如何更新使用过滤条件中包含自身的表?
情景:
把同时存在于取经四人组和悟空兄弟表中的记录的人在取经组表中的over字段更新为“大圣”
如:UPDATEuser1 SET over = “大圣” WHEREuser1.’user_name’ IN(SELECT b.’user_name’ FROMuser1 a INNER JOIN user2 b ON a.’user_name’ =b.user_name);
Mysql中不支持这种查询,可以联合更新
使用join来解决问题
如:UPDATE user1 a join (SELECTb.’user_name’ FROMuser1 a INNER JOIN user2 b ON a.’user_name’=b.’user_name’)b ON a.user_name = b.user_name SET a.over = ‘大圣’
使用join优化子查询
如1:SELECT a.user_name,a.’over’,(SELCTover FROM user2 b WHERE a.user_name = b.’user_name’)AS over2 FROM user1 a ;
使用join优化子查询
如2:SELECT a.’user_name’,a.’over’,b.’over’ ASover2 FROM user1 a LEFT JOIN user2 b ONa.’user_name’ =b.’user_name’;
使用JOIN优化聚合子查询
问题:如何:查询出四人组中打怪最多的日期?
如:SELECT a.user_name,b.timestr,b.kills FROMuser1 a.id = b.user_id WHERE b.kills=(SELECT MAX(c.kills) FROMuser_kills c WHERE c.user_id = b.user_id)
使用JOIN优化聚合子查询
问题:如何查询出四人组中打怪最多的日期?(避免子查询)
如:SELECT a.user_name,b.timestr,b.kills FROMuser1 a JOIN user_kills b ON a.id = b.user_id JOIN user_kills c ONc.user_id = b.user_id GROUP BY a.user_name,b.timestr,b.kills HAVINGb.kills = MAX(c.kills);
如何实现分组选择?
显示:
SELECT a.user_name,b.timestr,b.kills FROM user1 a JOIN user_kills bON a.id = b.user_id WHERE user_name = ‘孙悟空’ ORDERBY b.kills DESC LIMIT 2
对每一个人分别进行以上查询
显示:
SELECT d.user_name, c.timestr, 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 cntFROM user_kills a GROUP BY user_id,timestr,kills) c JOIN user1 d ONc.user_id = d.id WHERE cnt <=2
但有些查询方式不支持