mysql开发技巧1

来源:互联网 发布:狂人日记读后感知乎 编辑:程序博客网 时间:2024/05/20 04:28

SQL语言的发展

SQL分有(关系型数据库,非关系型数据库)

常见的sql语句类型:

DDL数据定义语言

TPL事务处理语言

DCL数据控制语言

DML数据操作语言

SQL开发技巧着重于DML语句:

DMLSELECT,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

mysql开发技巧1
 

 

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

 

mysql开发技巧1 

例子:

查询取经四人组中那些人不是悟空的结拜兄弟

如:

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

 

mysql开发技巧1 

例子:

查询悟空的结拜兄弟中那些人没有去取经

如:

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的连接

mysql开发技巧1 

解决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

交叉连接,又称卡迪尔连接,如:AB是两个合集,他们的交叉连接就是: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优化子查询

1SELECT a.user_name,a.’over’,(SELCTover FROM user2 b WHERE a.user_name = b.’user_name’)AS over2 FROM user1 a ;

 

使用join优化子查询

2SELECT 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

但有些查询方式不支持