SQL复杂查询语句总结
- 格式:ppt
- 大小:629.50 KB
- 文档页数:68


SQL多表查询语句大全讲解一、引言在数据库中,数据通常存储在多个表中。
为了从多个表中检索所需的数据,我们需要使用多表查询语句。
SQL(Structured Query Language)是一种用于管理关系型数据库的语言,它提供了丰富的查询语句来处理多表查询。
本文将详细介绍SQL多表查询语句的使用方法和常见技巧。
二、基本概念在开始学习SQL多表查询之前,我们需要了解一些基本概念。
1.表(Table):数据库中的数据以表的形式进行组织和存储。
每个表由一系列的行和列组成。
2.列(Column):表中的每个字段称为列。
每列都有一个唯一的名称和数据类型。
3.行(Row):表中的每个记录称为行。
每行包含了一组相关的数据。
4.主键(Primary Key):表中的一列或一组列,用于唯一标识每个行。
主键的值不能重复。
5.外键(Foreign Key):用于建立表之间的关系。
外键是另一个表的主键,用于连接两个表。
三、多表查询的类型在SQL中,多表查询可以分为以下几种类型:1. 内连接(INNER JOIN)内连接是最常用的多表查询类型之一。
它返回两个表中匹配的行。
SELECT列名FROM表1INNER JOIN表2 ON表1.列名 = 表2.列名;2. 左连接(LEFT JOIN)左连接返回左表中的所有行,并包括与右表匹配的行。
SELECT列名FROM表1LEFT JOIN表2 ON表1.列名 = 表2.列名;3. 右连接(RIGHT JOIN)右连接返回右表中的所有行,并包括与左表匹配的行。
SELECT列名FROM表1RIGHT JOIN表2 ON表1.列名 = 表2.列名;4. 全连接(FULL JOIN)全连接返回两个表中的所有行,无论是否匹配。
SELECT列名FROM表1FULL JOIN表2 ON表1.列名 = 表2.列名;5. 自连接(Self JOIN)自连接是指在同一个表中进行连接操作。
它通常用于将表与其本身进行比较。
mysql中字符串拼接,查询sql语句总结DELIMITER $$USE `ld_wpfmgl_sys`$$DROP PROCEDURE IF EXISTS `code_query`$$CREATE DEFINER=`root`@`%` PROCEDURE `code_query`(IN `$opfrom` INT, IN `$username` VARCHAR(50), IN `$password` VARCHAR(50), IN `$pagesize` INT, IN `$pageindex` INT, IN `$enterpriseID` INT, IN `$productSeriesID` INT, IN `$productID` INT, IN `$productStandard` VARCHAR(50), IN `$taskID` INT, IN `$code` VARCHAR(50))COMMENT '3.35 编码查询 web'BEGIN/*********************参数定义区域(begin)*************************//*定义接收外部参数变量*/DECLARE $_opfrom INT; # 命令请求来源DECLARE $_username VARCHAR(50); # ⽤户名DECLARE $_password VARCHAR(50); # 密码DECLARE $_pagesize INT DEFAULT 0; # 页码数DECLARE $_pageindex INT DEFAULT 0; # 当前页数DECLARE $_enterpriseID INT DEFAULT 0; # 企业IDDECLARE $_productSeriesID INT DEFAULT 0; # 产品系列IDDECLARE $_productID INT DEFAULT 0; # 产品IDDECLARE $_productStandard VARCHAR(50) ; # 产品规格DECLARE $_taskID INT ; # 任务名称DECLARE $_code VARCHAR(50) ; # 码值/*内部使⽤变量*/DECLARE $totalPages INT DEFAULT 0; # 返回⽤户总数DECLARE $sqltext VARCHAR(2000); # 拼接sql串DECLARE $f_code_id INT DEFAULT 0 ; # ⽗码IDDECLARE $biaoshi INT DEFAULT 0; # 标识记号DECLARE $t_id INT DEFAULT 0; # 任务id/*错误代码及描述*/DECLARE $_error INT DEFAULT 0;#declare continue handler for sqlexception set $_error=1;/*接收外部参数*/SET $_opfrom =IFNULL($opfrom,0);SET $_username=IFNULL($username,'');SET $_password=IFNULL($PASSWORD,'');SET $_pagesize=IFNULL($pagesize,0);SET $_pageindex=IFNULL($pageindex,0);SET $_enterpriseID = IFNULL($enterpriseID ,0);SET $_productSeriesID = IFNULL($productSeriesID,0);SET $_productID = IFNULL($productID ,0);SET $_productStandard = IFNULL($productStandard,'');SET $_taskID = IFNULL($taskID ,0);SET $_code = IFNULL($CODE ,'');/*********************参数定义区域(end)***************************//*********************业务逻辑处理区域(begin)*********************/#事务开始SET $sqltext = 'select s.id as taskNO,bu.c_name as enterpriseName,ps.serie_name as proSeries,p.product_name as proName,p.product_spec as proStandard, as packRatio_name,pr.ratio as packRatio, s.batchNO as batchNO,s.subBatchNO as subBatchNO,s.workshop as workshop,s.proline as proline,s.team as team,s.proBeginDate,s.proEndDate,s.product_date as produceDate,s.expired_date as exprieDate, s.code_count as codeCount,(SELECT COUNT(1) FROM ld_bus_code_produced cp where cp.task_id = s.id ) as codeUsed,s.createBy as opName, s.state as status';SET $sqltext = CONCAT($sqltext,' from ld_bus_task s join ld_bus_business bu on s.business_id=bu.idjoin ld_bus_product_series ps on s.product_series_id=ps.idjoin ld_bus_product p on s.product_id=p.idjoin ld_bus_pack_ratio pr on s.ratio_id=pr.id where s.isvalid=1 ');#1判断任务ID是否为空IF($_taskID !=0)THENSET $sqltext=CONCAT($sqltext,' and s.id =',$_taskID);#2判断码值是否为空ELSEIF($_code!='')THEN#获取码值所属任务SELECT task_id FROM ld_bus_code_produced WHERE CODE =$_codeINTO $t_id;SET $sqltext=CONCAT($sqltext,' and s.id =',$t_id);#set $sqltext=concat($sqltext,' and cp.code= \'',$_code,'\'');#3判断产品规格是否为空ELSEIF($_productStandard!='')THENSET $sqltext=CONCAT($sqltext,' and p.product_spec= \'',$_productStandard,'\'');ELSESET $biaoshi = 1;END IF;#1#任务号,编码,产品规格都为空时才判断企业信息IF($biaoshi=1)THEN#判断企业是否为空IF($_enterpriseID !=0)THENSET $sqltext=CONCAT($sqltext,' and s.business_id = ',$_enterpriseID);END IF;#判断产品系列是否为空IF($_productSeriesID!=0)THENSET $sqltext=CONCAT($sqltext,' and s.product_series_id= ',$_productSeriesID);END IF;#判断产品是否为空IF($_productID!=0)THENSET $sqltext=CONCAT($sqltext,' and s.product_id= ',$_productID);END IF;END IF;#set $sqltext = concat($sqltext,' where cp.isValid = 1 group by cp.task_id ');# 输出拼接sql语句返回的总数SET @querycount = CONCAT('select count(1) as totalPages from (',$sqltext,')a');PREPARE querycount FROM @querycount;EXECUTE querycount;# 拼接分页语句SET $sqltext = CONCAT($sqltext,' order by s.createDate desc limit ',$_pageindex,',',$_pagesize); #输出拼接的sql语句SET @querysql = $sqltext;PREPARE stmt FROM @querysql;EXECUTE stmt;/*********************业务逻辑处理区域(end)***********************//*********************事务报错处理区域(begin)*********************/#2 报错处理IF($_error=1) THENROLLBACK;ELSECOMMIT;END IF;/*********************事务报错处理区域(end)***********************//*********************操作⽇志记录区域(begin)*********************/INSERT INTO ld_sys_use_log(username,optname,optfrom,optdesc,errorCode)VALUES($_username,'code_query',$_opfrom,'3.35 编码查询 web',$_error);/*********************操作⽇志记录区域(end)***********************//*********************返回区域(begin)*****************************/SELECT $_error AS errorCode;/*********************返回区域(end)*******************************/END$$DELIMITER ;。
【原创】复杂sql语句参考:⼀,理解:1,复杂sql语句,⼀般是⽤⼦查询嵌套和 join 连接导致的,结合in, not in, any, all, exists, not exists;2,⼦查询是分为关联⼦查询和⾮关联⼦查询,⼦查询的where是否与外部查询的表字段有关联;3,⼦查询的返回有4种情况(单⼀值,⼀⾏,⼀列,多⾏多列的⼦表)对应不同的查询条件(1)单⼀值可以⽤在where⼦句中的 =、 >、>=、<、<=、!=查询条件,select ⼦句中作为⼀个字段返回,order by⼦句中作为排序条件(2)⼀列⽤在where⼦句中的 in,any,all等查询条件(3)⼀⾏的时候,可以当做批量单⼀值来⽤,只能使⽤ = 条件。
SELECT*FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2);//不⽀持!=,<,<=,>,>=SELECT*FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);(4)⼦表可以⽤在where⼦句中的 exists,not exists的查询条件;或者from⼦句后⾯(此时⼦表必须命名,并且不能为有关联的⼦查询)4,join的使⽤:(1)mysql中没有full outer join;只有left outer join或者right outer join(2)mysql中left join和left outer join效果⼀样,right也是;left 或 right的作⽤是连接字段可以在另⼀个表中不存在(3)mysql有⼀个cross join ,相当于inner join 不加on,或者 from两个表的效果:from A, B(4)join都是笛卡尔积,关键是要理解连接字段在表中的存在情况(5)join和group by⼀起使⽤作⽤会⼤增//1select*from A inner join B on A.key_a = B.key_b;//AB交集的笛卡尔积,可能⽐A或B的⾏数还多//2select*from A left join B on A.key_a = B.key_b;//A全部的笛卡尔积//3select*from A right join B on A.key_a = B.key_b;//B全部的笛卡尔积//4select*from A left join B on A.key_a = B.key_b where B.key_b is null;//在A中不在B中的⾏数,笛卡尔积//此时left join可以替换为left outer//5select*from A right join B on A.key_a = B.key_b where A.key_a is null;//在B中不在A中的⾏数,笛卡尔积//6:结合4和5select*from A left join B on A.key_a = B.key_b where B.key_b is null;unionselect*from A right join B on A.key_a = B.key_b where A.key_a is null;//要么在A中要么在B中,这个说法也不具体,具体是连接的字段的值要么在A中存在,要么在B中存在//7:select*from A inner join B;//不加on条件, 就是A表⾏数和B表⾏数的笛卡尔乘积多个结果5,union和union all的使⽤(1)⽤于合并两个或多个 SELECT 语句的结果集(2)每个 SELECT 语句必须拥有相同数量的列(3)列也必须拥有相似的数据类型(4)每个 SELECT 语句中的列的顺序必须相同(5)union会去重,union all不会去重,去重的规则是⼀⾏中所有列都对应相同才去重6,复杂sql语句可能有多种实现写法;⼆,实战举例参考:。
sql 复杂条件语句当涉及到复杂的条件语句时,SQL(结构化查询语言)提供了多种运算符和函数,使您能够构建复杂的查询和条件。
以下是一些常用的复杂条件语句示例:1.使用AND和OR运算符:sqlSELECT * FROM table_name WHERE column1 = 'value1'AND column2 = 'value2';SELECT * FROM table_name WHERE column1 = 'value1'OR column2 = 'value2';2.使用IN运算符:sqlSELECT * FROM table_name WHERE column1 IN ('value1', 'value2', 'value3');3.使用BETWEEN运算符:sqlSELECT* FROM table_name WHERE column1 BETWEEN value1 AND value2;4.使用LIKE运算符进行模式匹配:sqlSELECT * FROM table_name WHERE column1 LIKE'pattern%';5.使用EXISTS子查询:sqlSELECT* FROM table_name WHERE EXISTS(SELECT1FROM another_table WHERE condition);6.使用CASE语句进行条件逻辑:sqlSELECT column1, column2,CASEWHEN condition1 THEN result1WHEN condition2 THEN result2ELSE result3END AS new_column_nameFROM table_name;这些示例只是复杂条件语句的一小部分。