Android程序猿必掌握的sqlite数据库连表查询

news/2024/7/8 8:50:14

  
SQL查询的基本原理:两种情况介绍。
第一、   单表查询:依据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后依据SELECT的选择列选择对应的列进行返回终于结果。
第二、   两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后依据WHERE条件过滤中间表的记录,并依据SELECT指定的列返回查询结果。
第三、   多表连接查询:先对第一个和第二个表依照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到全部的表都连接上为止,终于形成一个中间的结果表,然后依据WHERE条件过滤中间表的记录,并依据SELECT指定的列返回查询结果。
理解SQL查询的过程是进行SQL优化的理论根据。


一 交叉连接
语句1:隐式的交叉连接,没有CROSS JOIN。
SELECT TT.ID, TT.ORDER_NUMBER, TP.ID, TP.NAME
FROM TABLE TT , PORTABLE TP 
WHERE TT.ID=1;
得到的是四行数据
语句2:显式的交叉连接,使用CROSS JOIN。
SELECT TT.ID,TT.ORDER_NUMBER,TP.ID,
TP.NAME
FROM TABLE TT , PORTABLE TP 
WHERE TT.ID=1;
语句1和语句2的结果是同样的,2*2的数据。


二、内连接(INNER JOIN)
原来用sqlite自建表,如今习惯用NaviCat了。
内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。
比如:以下的语句3和语句4的结果是同样的。
语句3:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。
SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM CUSTOMERS C,ORDERS O
WHERE C.ID=O.CUSTOMER_ID;
语句4:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。
SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;
语句5 :直接看样例
select a.name,b.qty from student a, (select id,count(*) qty from student group id) b where a.id =b.id;

语句6:工作中,千万要把方法2,写成方法1
 方法一 节省非常多时间。
INNER JOIN ……ON 的语法格式为: 
 
FROM (((表1 INNER JOIN 表2 ON 表1.字段号 = 表2.字段号) INNER JOIN 表3 ON 表1.字段号 = 表3.字段号) 
INNER JOIN 表4 ON Member.字段号 = 表4.字段号) INNER JOIN 表X ON Member.字段号 = 表X.字段号  www.2cto.com  
 
语法二:数据量大,会非常耗时。
 
FROM 表1
 
INNER JOIN 表2 ON 表1.字段号 = 表2.字段号
 
INNER JOIN 表3 ON 表1.字段号 = 表3.字段号
 
INNER JOIN 表4 ON Member.字段号 = 表4.字段号
 
INNER JOIN 表X ON Member.字段号 = 表X.字段号



语句7.补充一个小样例 这里把嵌套的select语句,查询结果,当作一个表b,进行查询
select a.产品编号,a.初始数量 + b.numfrom  Warehouse a,(select 产品编号,sum(数量) as num from danju  group by 产品编号) as b,where a.产品编号=b.产品编号


总结
连接查询是SQL查询的核心,连接查询的连接类型选择根据实际需求。假设选择不当,非但不能提高查询效率,反而会带来一些逻辑错误或者性能低下。以下总结一下两表连接查询选择方式的根据:


1、 查两表关联列相等的数据用内连接。
2、 Col_L是Col_R的子集时用右外连接。
3、 Col_R是Col_L的子集时用左外连接。
4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
5、 求差操作的时候用联合查询。
多个表查询的时候,这些不同的连接类型能够写到一块。比如:
SELECT T1.C1,T2.CX,T3.CY
FROM TAB1 T1
       INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)
       INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)
       LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);
WHERE T1.X >T3.Y;
上面这个SQL查询是多表连接的一个示范。






http://www.niftyadmin.cn/n/1907004.html

相关文章

PTA(Basic Level) 1077:互评成绩计算(C语言实现)

PTA(Basic Level) 1077&#xff1a;互评成绩计算&#xff08;C语言实现&#xff09; #include <stdio.h>int main() {int i,j,n,m,count,score,min,max,tea;double average,sum;scanf("%d%d",&n,&m);for(i0; i<n; i){scanf("%d",&te…

配置Tomcat

1.一定要配置好环境变量 否则有可能出现 invalid request 字样关于配置环境变量的网站&#xff1a;http://jingyan.baidu.com/article/8065f87fcc0f182330249841.html记住&#xff1a;一定要严格按照步骤进行2.如果配置好了 出现 No output folder字样 &#xff0c;则是对于tom…

PTA(Basic Level) 1078:字符串压缩与解压(C语言实现)

PTA(Basic Level) 1078&#xff1a;字符串压缩与解压&#xff08;C语言实现&#xff09; #include <stdio.h> #include <string.h> #include <ctype.h> void compress(char s[]) {int i,count1,n;nstrlen(s);for(i1; i<n; i)//i<n,最后一个字母也要输…

代码简洁之道(1)-年份

为什么80%的码农都做不了架构师&#xff1f;>>> 1.说明 本文是在阅读一些好的框架的源码时看到的&#xff0c;在此做个记录。 2.具体内容 2.1判断年份是否是闰年 2.1.1前言 为什么会有闰年&#xff1f; 若以陽曆為例&#xff0c;「年」的計算基礎是回歸年&…

PTA(Basic Level) 1079:延迟的回文数(C语言实现)

PTA(Basic Level) 1079&#xff1a;延迟的回文数&#xff08;C语言实现&#xff09; #include <stdio.h> #include <string.h> void reverse(char s[]) {int i,j;char t;for(i0,jstrlen(s)-1; i<j; i,j--){ts[i];s[i]s[j];s[j]t;} }void add(char s1[],char s2…

6月西部数码域名注册量统计:国内与全球份额均上涨

IDC评述网&#xff08;idcps.com&#xff09;06月25日报道&#xff1a;根据RegistrarStats最新数据显示&#xff0c;截止至2015年6月21日&#xff0c;西部数码域名注册量增至531,989个。在6月1日至6月21日期间&#xff0c;增速呈缩小之势&#xff0c;净增11,365个。另外&#x…

Zabbix的安装和基本配置

为什么80%的码农都做不了架构师&#xff1f;>>> zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 zabbix能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供柔软的通知机制以让系统管理员快速定位/解…

软件工程问题及回答

一、第一章&#xff1a;概论 IT人基本职业道德是什么&#xff1f;有时候是否跟潮流走&#xff0c;用大多IT人的道德来规范自己&#xff0c;还是按照自己的心里底线&#xff1f; 答&#xff1a;“所谓职业道德&#xff0c;就是同人们的职业活动紧密联系的符合职业特点所要求的…