先看好需求是什么!先看好需求是什么!先看好需求是什么!
一定要先理解好需求是什么!
否则写出来的语句不是那个意思!
然后确定主表
一步步拆需求!
一定要知道、理清楚几张表之间的关联关系!
一定要知道、理清楚几张表之间的关联关系!
一定要知道、理清楚几张表之间的关联关系!
注意:(1)最好不要用temp表然后关联查询,这样效率会很低!
(2)注意使用左右连接的时候,填充null的字段。A left join B on 条件
表示A表的数据是完整的。如果在B表找不到匹配的会自动填充null
(3)查找到数据id,但是想显示name怎么办,这时候id ,name映射关系的表A可以根据id找到name作为select 。如下示例
前提:软件:navicat 16 for mysql
1不等于0 的表示方式><
2group by后面可以跟多个字段
group by a 那么a一定要出现在select a中
3字段设置为null与删掉值是不一样的
4group concat与concat是不同的。
group concat是把属于同一列的数据拼接起来
concat是把不同列的同一行数据拼接起来,可以用分隔符连接
concat_ws是一次性指定分隔符
三、数据库导出的时候花费时间很长
(1)方式一,将数据库查询加上时间的限制,分时间批次下载。此为从X轴分批次
(2)方式二,原本要查询的数据库字段很多,将其分为俩部分,然后分别下载,但是要有一张冗余的表来存储俩表之间的关系吗,所以俩表一定要有一个共同的字段然后冗余表存储这个关系,这样就可以在下载下来之后拼接俩张表
四、mysql中关键字的执行顺序执行顺序
理解这个可以有效避免使用很大的表来驱动/作为主表,在很多时候where作为筛选是先把数据查出来然后where筛选条件,比如在用子查询的时候用很大的主表与子查询的结果集进行条件连接的时候,where放在主表中应该改成子查询中就已经筛选出记录
五、子查询
子查询用法
子查询放在select中
子查询的执行顺序
六、数据库设计的时候
要考虑业务的使用量,某张表在实际中数据量使用较大,应该减少该表的字段个数;如果某个表作为基础表,不会随着时间增长数据量急剧增加的话,可以适当的增加冗余字段
1把限制条件写在一张表里,比写在外围的where效率快
SELECT
DISTINCT(su.user_id )
FROM
approve_user_mapping aum
INNER JOIN mbx_system.sys_user su on (aum.relevance_id = su.user_id AND aum.user_type in (10,20))
SELECT
DISTINCT(su.user_id )
FROM
approve_user_mapping aum
INNER JOIN mbx_system.sys_user su on (aum.relevance_id = su.user_id )
WHERE aum.user_type in (10,20)
2mysql能做的,java程序都能做。要寻求平衡
衡量标准:1)数据库表字段的多少 2)要关联查询的表的多少
数据库字段越多,在内存中查找比较快;
数据库字段越少,表示表结构简单,mysql查询也很快
要关联的表比较多,mysql语句会方便一些
3
select *
from t1,t2
where
上述表示把一对多关系的t1,t2两个表合并成一个表,并且以“多”关系的为基准,所以后面能表示一条记录的是‘多“关系表的主键
4
一对多关系的时候,A表,B表都有字段c,那么在使用left join的时候,应该取哪张表的字段去关联呢?
A:
select X.*
from X
left join A on X.b=A.b
left join B on B.c=X.c
应该使用
B:
select X.*
from X
left join A on X.b=A.b
left join B on B.c=A.c
A方式会产生笛卡尔积,B在left join的时候就已经在筛选条件了
5在使用