-
2021-10-28 10:13:40更多相关内容
-
sql:mysql:on和where区别,on后可跟多个条件
2019-08-16 17:11:41数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件...数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
eg:
创建表语句:
tab1: insert into tab1 (id, size) values (1, '10'); insert into tab1 (id, size) values (2, '20'); insert into tab1 (id, size) values (3, '30'); insert into tab1 (id, size) values (4, '11'); tab2: insert into tab2 (id, size, name) values (1, '10', 'aaa'); insert into tab2 (id, size, name) values (2, '20', 'bbb'); insert into tab2 (id, size, name) values (3, '20', 'ccc');
表1
select * from tab1;
id
size
1
10
2
20
3
30
4
11
表2
select * from tab2;
size
name
10
aaa
20
bbb
20
ccc
分析下面两条 sql
select * from tab1 left join tab2 on (tab1.size = tab2.size)where tab2.name='aaa';
select * from tab1 left join tab2 on (tab1.size = tab2.sizeand tab2.name='aaa');其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
总结:
1. 对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面
2. 对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。
on后可跟多个条件,语法如下:
SELECT * FROM dws.dws_t_result_tmp2 tmp2 LEFT JOIN ods.ods_t_tmp1 tmp_a ON (tmp2.branchno='WE-BEIJING-1') and ( tmp2.branchno='RE-BEIJING-1')
on后边加like:
select position_name,code,senior_name,parent_code,level from position_name_data pnd right join senior_function_data sfd on regexp_replace(sfd.senior_name,'\\\\','/') like concat('%',regexp_replace(pnd.position_name,'\\\\','/'),'%') where senior_name is not null group by position_name,code,senior_name,parent_code,level
参考:
-
mysql join on多条件关联on大于小于
2020-11-19 15:16:43MySQL多个条件关联,join多个条件关联 介绍 使用join关联表时on后面写多个条件 代码 SELECT * FROM lecture l INNER JOIN lecture_limit lt ON l.id = lt.lecture_id INNER JOIN student_class sc ON sc....MySQL多个条件关联,join多个条件关联,on后面大于小于><
介绍
使用join关联表时on后面写多个条件
代码
SELECT * FROM lecture l INNER JOIN lecture_limit lt ON l.id = lt.lecture_id INNER JOIN student_class sc ON sc.CODE = lt.CODE OR floor( sc.CODE / 1000 ) = lt.CODE OR floor( sc.CODE / 1000000 ) = lt.CODE OR floor( sc.CODE / 100000000 ) = lt.CODE OR floor( sc.CODE / 100000000000 ) = lt.CODE OR floor( sc.CODE / 1000000000000 ) = lt.CODE where sc.teacher_id =3
thinkphp组装
$res = $lecture ->field('*') ->alias('l') ->join('lecture_limit lt', 'l.id = lt.lecture.id') ->join('student_class sc', 'sc.code = lt.code or floor(sc.code / 1000) = lt.code or floor(sc.code / 1000000) = lt.code or floor(sc.code / 100000000) = lt.code or floor(sc.code / 100000000000) = lt.code or floor(sc.code / 1000000000000) = lt.code') ->where($where) ->order(['l.id' => 'desc']) ->paginate([ 'list_rows' => $size, 'page' => $page, ]);
效果
-
MySQL多个left join on关联条件的顺序
2019-12-18 11:49:14如果存在多个left join on,请注意on后面的条件与哪个表关联。这一条统计的SQL很重要!例如表A,B,C,A left join B on A.x = B.x left join C on A.x = C.x,B和C的都要和A建立关联,B和C之间是没有任何数据上的...注意:下面的案例特别重要!请重视!SQL有点长,但确实是干货!
结论
如果存在多个left join on,请注意on后面的条件与哪个表关联。这一条统计的SQL很重要!例如表A,B,C,A left join B on A.x = B.x left join C on A.x = C.x,B和C的都要和A建立关联,B和C之间是没有任何数据上的关系。但是 如果把A.x = C.x改成B.x = C.x,那么B和C的表数据先建立关联并过滤数据,再与A表数据进行关联,这样可能会出现数据丢失!
案例
有一张分数表,表字段有日期、姓名、语文得分和数学得分等,请统计每个日期中,语文最高得分的姓名和分数,数学最低得分的姓名和分数。
思路:过滤出所有日期 left join 筛选语文 on … left join 数学得分 on …
正确的SQL:SELECT * FROM ( SELECT report_date reportDate FROM tb_more_left_join mlj GROUP BY mlj.report_date ) mix LEFT JOIN ( SELECT mlj.report_date maxReportDate, GROUP_CONCAT( mlj.user_name ) maxUserNames, a.maxScore FROM tb_more_left_join mlj LEFT JOIN ( SELECT report_date, MAX( chinese_score ) maxScore FROM tb_more_left_join mlj GROUP BY mlj.report_date ORDER BY NULL ) a ON mlj.report_date = a.report_date WHERE mlj.chinese_score = a.maxScore GROUP BY mlj.report_date ) mx ON mix.reportDate = mx.maxReportDate LEFT JOIN ( SELECT mlj.report_date minReportDate, GROUP_CONCAT( mlj.user_name ) minUserNames, a.minScore FROM tb_more_left_join mlj LEFT JOIN ( SELECT report_date, MIN( math_score ) minScore FROM tb_more_left_join mlj GROUP BY mlj.report_date ORDER BY NULL ) a ON mlj.report_date = a.report_date WHERE mlj.math_score = a.minScore GROUP BY mlj.report_date ) mn ON mix.reportDate = mn.minReportDate
正确结果:
错误的SQL:
把正确SQL中最后一个on条件改为mx.maxReportDate = mn.minReportDate,注意,是把mix.reportDate改为了mx.maxReportDate。错误结果:
错误原因:
- 查询语文最高成绩时,没有查到2019-12-01的数据
- 查询数学最低成绩时,使用on与语文最高成绩关联,因为没有查到语文最高成绩的日期,所以两个表关联时,数学最低成绩即使有数据,也会因为语文最高成绩无数据而被忽略。
SQL数据
CREATE TABLE `tb_more_left_join` ( `id` int(11) NOT NULL, `report_date` date NULL DEFAULT NULL, `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `math_score` int(255) NULL DEFAULT NULL, `chinese_score` int(255) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; INSERT INTO `tb_more_left_join` VALUES (1, '2019-12-01', '盲僧', 70, NULL); INSERT INTO `tb_more_left_join` VALUES (2, '2019-12-01', '薇恩', 100, NULL); INSERT INTO `tb_more_left_join` VALUES (3, '2019-12-02', '赵信', 30, 60); INSERT INTO `tb_more_left_join` VALUES (4, '2019-12-02', '琴女', NULL, 100); INSERT INTO `tb_more_left_join` VALUES (5, '2019-12-03', '蛮王', 50, 100); INSERT INTO `tb_more_left_join` VALUES (6, '2019-12-03', '艾希', 100, 100); INSERT INTO `tb_more_left_join` VALUES (7, '2019-12-03', '亚索', 60, 90);
-
mysql多个if语句
2021-04-19 04:26:51Mysql 语句 有多个条件 查询所有 返回符合条件最多的一条这边先给你提供一个动态SQLselect*fromtablewhere1=1 //这一步是针对所有条件均未满足(where后必须跟子句)if(name != "" and name!=null){ and name=条件一}... -
MySql 别犯糊涂了! LEFT JOIN 的 ON 后接上筛选条件,多个条件会出事!
2020-09-14 10:47:57很多时候我们在使用LEFT JOIN ...... ON .... 时, 除了连接两个表的字段条件外,我们往往还需要一些等值或者范围 等等类似的数据筛选条件。 那么对于初学者,往往会犯一个错误,就是 想当然 地 认为,ON 后面的... -
MySQL JOIN ON 时使用多个字段作为约束条件的查询方法
2020-04-20 16:08:19数据库设计时,没有考虑关联数据的逻辑,通过两个或多个字段才可以关联到一条数据 解决方法 利用MySQL内置的concat函数,对字段进行拼接后,关联查询 比如,我的业务中遇到的是通过name和version进行关联: SELECT ... -
mysql if条件中的多个条件
2021-04-19 04:27:49我试图将多个参数添加到if语句中.我正在尝试检查两队之间的比赛是否是联赛.SELECT visitor AS school, home AS temp, vl.leagueid AS vleague, hl.leagueid AS hleague,if(vl.leagueid = hl.leagueid, 1, 0) AS ... -
mysql 多表 多个条件 查询
2021-01-19 13:21:06mysql 查询关键字SELECT 类名 FROM 主表名INNER JOIN 子表名1ON 主表=次表 同样的内容 WHERE 查询条件多表请用INNER JOIN连接 且加 同样条件内容SELECT 类名 FROM 主表名INNER JOIN 子表名1INNER JOIN 子表名2ON 主... -
MySQL-在CASE中组合多个WHEN条件
2021-07-16 16:49:00SELECT CASE org.size WHEN 0 THEN ', COUNT(DISTINCT org.id) AS '# of Companies' FROM org INNER JOIN usr ON usr.orgid = org.id INNER JOIN usr_role ON usr.id = usr_role.usrid WHERE org.deleted = 0 AND ... -
centos安装多个mysql
2018-10-26 20:28:22linux 下安装多个mysql -
mysql中一个字段同时满足多个条件,(3个以上)
2021-01-18 18:19:47这是两张表的关联后的数据,现在是labelName = 9 and labelname = 108 时显示第一条, 当labelName = 9 and labelname = 23时显示第二条数据,类似很多种组合查找 子堇 | 园豆:161 (初学一级) | 2018-12-28 13:59 ... -
mysql 实现主键之外的多个字段自增
2020-09-24 16:44:15通过sql实现编号自动增加,序号也是自动增加,一个编号下有20个序号,id是主键 尝试使用触发器 create trigger my_trigger before insert on test.test for each row begin set new.`编号`=(select if(`序号`=... -
MySql存在多个root用户
2020-07-01 17:46:33因为mysql的登陆用户是可以限制某个用户在某个IP才能登陆的,所以你看到一个用户有多条数据也是不奇怪,你可以将Host+user来作为一个标准 一、 用户登录 格式: mysql -h主机地址 -u用户名 -p用户密码 mysql ... -
MySQL 一个字段,用','隔开,存储多个id,关联查询
2019-07-03 16:31:10MySQL 一个字段,用’,'隔开,存储多个id,关联查询 因为朋友过来问我,一个商品表的一个颜色的关联字段,里面放着多个颜色的id,这些id用逗号隔开,然后想要查出一条商品记录上显示出所有颜色。实现效果如下: 商品... -
mysql根据条件批量插入更新(on duplicate key update)
2019-09-26 21:47:04一、前言 ...一般来说我们都是采用on duplicate key update 写法,只是假如我们需要、在唯一字段相同,并且满足其他条件时才进行更新,那么该怎么写这个"where"条件呢?on duplicate key upd... -
join on多个条件的理解
2020-06-12 16:03:28左连接,on后面跟了2个条件,其中第二个条件对左表进行刷选,可以看到在结果中并没有起作用。因为on的条件筛选是对2张表生成的全连接(笛卡尔积)临时表进行的筛选,这时a.id=4的数据实际上是被去除掉了,因为没有a.... -
mysql触发器之创建多个触发器
2018-07-13 13:30:41这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的。... mysql 5.7.2+版本解决了这样限制,并允许我们为表中的相同事件和动作时间创建多个触发器。当事件发生时,触发器将依次激活。我们来参考创... -
如何实现一台机器上运行多个MySQL实例?
2018-12-15 19:51:05在一台机器上一个MySQL服务器运行多个MySQL实例有什么好处?这里我先入为主给大家介绍这样做至少存在两个好处(看完这篇文章后理解会更透彻): (1)减轻服务器链接负担 (2)为不同的用户提供不同的mysqld服务器... -
mysql多个嵌套查询
2019-03-06 16:33:13MySQL 中多个Left join 子查询 好久没写sql了,今天突然接到产品的需求,要拉取线上数据一个文章的统计,我心里就万马奔腾…TM,不是有前端埋点和事件埋点。。。 简单的联表查询 SELECT a.id, a.thumbNail, a. ... -
mysql左连接多条件,on子句多条件
2019-06-03 18:06:45想查询一个列表,字段包括:用户名、商品ID、商品名称、商品描述,条件:所有用户拥有禁用的商品,如果用户没有禁用的商品也查询出用户的信息。 查询一:条件放在总查询 where 后面 select u.name,g.goods_... -
Mysql的ON DUPLICATE KEY问题
2018-12-11 15:29:20当同一个设备(device_id)的同一个app(package_name)在同一天(collect_date)的采集数据,如果存在,则更新,不存在,则插入。 使用如下语句完成以上需求: INSERT INTO app_use_report (device_id, app_name,... -
【MySQL】mysql left join 多个表
2017-07-24 11:46:48参考:mysql left join 多个表 SQL:select * from t_a a left join t_b b on a.bid = b.bid left join t_c c on a.cid = c.cid t_a表t_b表 t_c表总的结果: ==================================================... -
数据库左右连接on后的限制条件问题
2021-01-19 21:53:03测试环境:MySQL 5.7.19HeidiSQL 9.3 数据库界面连接工具(挺好用的)碰到的问题是:Select * from t1 left outer join t2 on t1.id=t2.id and t2.age>18 和Select * from t1 left outer join t2 on t1.id=t2.id ... -
Mysql将多个查询结果并列显示
2020-05-23 11:51:27目录一、需求二、表数据三、查询语句四、查询结果 ... #student_name取b表的(如果取的a表的student_name,该同学又恰好没一个及格,student_name就为NULL了) b.`student_name`, b.total_number, a.numb -
linux安装多个mysql
2019-09-21 08:06:46一、 Mysql多实例即一台服务器上运行多个Mysql服务进程 ,开启不同的服务端口,通过不同的socket 监听不同的服务端口来提供各自的服务。 二、 Mysql多例有以下几个特点: 1、有效利用服务器资源:通过多实例地... -
MySQL SQL 多个Join on(表连接) 和Where间的执行顺序(nest loop join机制)
2017-11-05 10:14:32若B表有多个符合记录行,则生成多个临时表行,若B表没有符合条件的行,则生成一条所有字段均为null的行与A的记录行连接,若没有ON条件,则以“笛卡尔积”的形式连接,即A结果集的每一行和B表的每一行均连接生成临时... -
mysql在表中添加多个外键
2020-04-19 16:24:34级联: 在末尾可加上(可单独添加,也可全部添加): ON UPDATE CASCADE(级联更新) ON DELETE CASCADE(级联删除) 1 2 比如: ALTER TABLE `ym` ADD CONSTRAINT `fk_author` FOREIGN KEY (`au_id`)