Mysql 特别注意点!

初始环境:

CREATE TABLE product (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  amount INT UNSIGNED DEFAULT NULL ,
  PRIMARY KEY (id)
) ENGINE = innodb CHARSET =‘utf8‘;
INSERT INTO product VALUES (1,100), (2,200), (3,300), (4,400);
SELECT * FROM product;

CREATE TABLE product_details (
  id int UNSIGNED NOT NULL,
  weight INT UNSIGNED DEFAULT NULL ,
  exist INT UNSIGNED DEFAULT NULL ,
  PRIMARY KEY (id)
) ENGINE = innodb CHARSET =‘utf8‘;
INSERT INTO product_details VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);
SELECT * FROM product_details;

执行如下两SQL:

1、SELECT * FROM product a LEFT JOIN product_details b ON a.id=b.id AND a.amount=100;
结果:
id amount id weight exist
1 100 NULL NULL NULL
2 200 NULL NULL NULL
3 300 NULL NULL NULL
4 400 NULL NULL NULL
2、SELECT * FROM product a LEFT JOIN product_details b ON a.id=b.id AND a.amount=200;
结果:
id amount id weight exist
2 200 2 22 0
1 100 NULL NULL NULL
3 300 NULL NULL NULL
4 400 NULL NULL NULL

原因解释:

首先要清除SQL执行顺序

首先对a和b表做笛卡尔积生成虚拟表VT1

根据ON条件刷选VT1数据生成虚拟表VT2

如果是外连接则需要将保留表中被过滤的的数据(外部行)添加到VT2中生成VT3

具体分析语句1,a b表生成笛卡尔积后根据a.id=b.id AND a.amount=100条件刷选,没有符合条件的行,所以保留表a表的所有行被过滤掉,在添加外部行时a表的所有行被添加到虚拟表中b表的字段都为NULL,所以就得出结果。

语句2与1过程一致,根据a.id=b.id AND a.amount=200刷选出一行结果添加外部行后得出实际结果。

参考:《MySQL技术内幕:SQL编程.姜承尧》

时间: 2024-08-01 22:44:19

Mysql 特别注意点!的相关文章

Mysql特别注入篇

基于insert/update/delete的注入 一般处在于信息修改处(如注册,修改用户名密码等),可使用单引号进行注入尝试,含有注入漏洞处若开启了mysql显错函数则可看到错误页面 利用的条件: 需要注意的是,报错注入需要通过php中的mysql_error()显示. 下面的例子: $sql = mysql_query('select * from users where id=1 and updatexml(0,concat(0x7e,(select version())),1)'); $

【MySQL】源码编译安装和配置MySql 5.5.32(单实例)

[需求描述] 在CentOS环境中,通过编译源码的方式,安装并且配置“单实例”的MySQL5.5.32数据库. MySQL的安装目录为:/application/mysql-5.5.32 MySQL数据文件的安装目录为:/application/mysql-5.5.32/data MySQL默认的字符编码为:UTF8 [环境参数] VMware:10.0.1 Host:Win7 DB:MySql 5.5.32 编译工具:cmake-2.8.8.tar.gz 其他依赖:ncurses-devel-

Mysql源码方式安装与完全卸载Mysql

1.基础环境介绍 1.1软件环境 操作系统:redhat linux 6.3 Mysql版本:Mysql 5.6.24 1.2磁盘目录规划 序号 目录 用途 1 /opt/mysql/mysql-5.6.24 mysql主程序安装目录 2 /data/mysql/mysql_5624/{data,tmp,logs} 存放数据文件.临时文件.日志文件,5624代表为5.6.24版本号 2.linux环境调整优化 2.1 关闭NUMA 编辑/etc/grub.conf文件,在kernel后面增加 n

三招搞挂Mysql(转)

一.产生大量的undo日志 众所周知,InnoDB是一个支持MVCC的存储引擎,为了支持MVCC,InnoDB需要保存undo日志,以便对用户提供记录的历史版本.如果我们开启一个事务,反复地更新一条记录而不提交,会怎么样呢?将会产生大量的undo日志,使得磁盘空间爆满,导致MySQL不可用. 在innodb现有的实现中,并没有对单个用户或单个连接使用的undo空间进行限制.也就是说,我们只需要反复更新一条记录,而不提交,就会产生大量undo日志.由于我们的事务没有提交,undo日志不能被回收,从

读MYSQL必知必会的总结

看到了mysql必知必会 总结了以下几个以后很有可能用到的知识点: 1.在检索多列的时候,需要再列名之间用","进行分开,最后的列名后面不加. select id,uid,name from 表名;      select* form 表名 代表检索所有的列 2.在检索指定从第几行开始后的几行 select id from 表名 limit 3,4;第3行开始的后4行,要注意的是检测出来的第一行为0. 3.可以用 order by 语句对检测数来的进行排序,因为数据会受到修改编辑的影响

mysql的数据类型和字符集

MySQL的数据类型 MySQL数据库支持的数据类型主要有以下几种: 整型 浮点型 字符 BLOB型 枚举和集合类型 JSON类型(MySQL5.7新增加的支持) 整型 整数类型是数据库中最基本的数据类型.标准SQL中支持INTEGER和SMALLINT这两类整数类型.MySQL数据库除了支持这两种类型之外,还扩展支持了TINYINT, MEDIUMINT和BIGINT. MySQL中各种整型占据的字节数和取值范文如下: 整数类型 字节数 无符号数取值范围 有符号数取值范围(添加一位符号为,把无

cmake编译安装mysql5.5

CMAKE方式编译安装Mysql5.5 1.源码cmake方式编译安装MySQL5.5.32 安装前先安装: yum install ncurses-devel -y 1.1 下载Mysql和cmake安装包: wget http://wwwNaNake.org/files/v2.8/cmake-2.8.8.tar.gz 1.2 查看系统环境 cat /etc/redhat-release uname -r uname -m 1.3 安装cmake包 tar zxf cmake-2.8.8.ta

mysql5.5安装

MySQL是一个关系型数据库管理系统 ,由瑞典MySQL AB公司开发,目前属于Oracle 公司.MySQL分为社区版和商业版,由于其体积小.速度快.总体拥有成本低,尤其是开放源码 这一特点,一般中小型网站的开发都选择MySQL作为网站数据库 . CentOS 6 mysql5.5安装配置 1 安装所需软件 2 安装cmake 3 tar.gz形式安装mysql 4 配置与启动 5 rpm形式安装mysql 6 mysql配置参数详细说明 MySQL自5.5版本以后,就开始使用cmake 编译

CMAKE方式编译安装Mysql5.5

1.源码cmake方式编译安装MySQL5.5.32 安装前先安装: yum install ncurses-devel -y 1.1 下载Mysql和cmake安装包: wgethttp://wwwNaNake.org/files/v2.8/cmake-2.8.8.tar.gz 1.2 查看系统环境 cat/etc/redhat-release uname-r uname-m 1.3 安装cmake包 tarzxf cmake-2.8.8.tar.gz cdcmake-2.8.8 ./conf