`

练习——实训6.1

阅读更多


create table bbc(
Name varchar(50) primary key not null,
Region varchar(60),
Area decimal(10),
Population decimal(11),
Gdp decimal(14),
);

insert into bbc values ('中国','亚洲',10,10,10);
insert into bbc values ('美国','北美洲',9,6,3);
insert into bbc values ('巴西','南美洲',13,4,5);
insert into bbc values ('阿根廷','南美洲',6,3,2);

insert into bbc values ('英国','欧洲',7,4,2);
insert into bbc values ('俄罗斯','欧洲',15,5,3);
insert into bbc values ('苏丹','非洲',3,2,1);
insert into bbc values ('日本','亚洲',6,6,2);
insert into bbc values ('南非','非洲',5,3,3);


select * from bbc;

--获得和巴西在同一个地区的所有国家
select * from bbc where region=(
  select region from bbc where name='巴西'
)
and name!='巴西'

--给出人口多于俄国(俄罗斯)的国家名称
select * from bbc where population>(
  select population from bbc where name='俄罗斯'
)

--给出印度、伊朗所在地区的所有国家的所有信息
select * from bbc where region in
(
 select region from bbc where name in('印度','伊朗')
)

select * from bbc where region in
(
 select region from bbc where name='印度' or name='伊朗'
)


--给出人均GDP比加拿大多,但少于阿尔及利亚的国家信息
select * from bbc
where gdp/population
between () and ()

--给出GDP比任何欧洲国家都多(只要显示国家名称)
select name from bbc
where population>all(select gdp from bbc where region='欧洲')
或者
select name from bbc
where population>(select max(gdp) from bbc where region='欧洲')

区别:给出GDP比任何一个欧洲国家都多(只要显示国家名称)

--给出每个地区人口最大的国家
select * from bbc a
where a.population=(
  select max(b.population) from bbc b
  where b.region=a.region
)
所以在实际工作中要用表连接要替换。
思考。

给出地区中所有国家的人口总数大于?的地区
select region
from bbc
group by region
having sum(population)>?

说明:sum(population)不一定要写在select中,
写在sum(population)中只是表示要显示出来。

9思考。
题意:
地区  人口
a     10
a     7
a     2
b     8
b     3
满足条件的只有:
地区  人口
a     10
a     7
都超过2的3倍。

 

 

where xxx>(select .... where a.id=b.id)

 

select * from t_class;

select * from t_class a,t_class b;


select * from t_class;
select * from t_subject;
select * from t_stu;
select * from t_score;


--统计各班有多少人:班级名称,人数
--相关子查询
--通过  表连接 来优化
select c.c_name,
  (select count(*) from t_stu s where s.c_id=c.c_id) 人数
from t_class c
t_stu会被查询3次,所以效率低。

一班 4
二班 2
三班 0


体会场景:全校有20个班,你就会被问20次,你是不是 1班/2班/……
的?

通过表连接来优化,优化的原理是两个表都只查询一次。

思考:用内连接对不对?
select c_id,count(*) as 人数
from t_class c join t_stu s on c.c_id=s.c_id
group by c_id

error:列名 'c_id' 不明确。
因为c_id在两个有中都有,所以必须指出是哪个表的c_id。

select c.c_id,count(*) as 人数
from t_class c join t_stu s on c.c_id=s.c_id
group by c.c_id

需要班级名称,怎么办?
select c.c_id,c.c_name,count(*) as 人数
from t_class c join t_stu s on c.c_id=s.c_id
group by c.c_id

必须将c_name放到group by后面,变成分组字段。
select c.c_name,count(*) as 人数
from t_class c join t_stu s on c.c_id=s.c_id
group by c.c_id,c.c_name

如果让3班也出现?
使用左连接。

select c.c_name,count(*) as 人数
from t_class c left join t_stu s on c.c_id=s.c_id
group by c.c_id,c.c_name

错在哪里呢?
因为用left join以后,三班一定会有一条记录,但是不表示有一个学生。
所以必须对学生的信息进行count。
select c.c_name,count(s.s_id) as 人数
from t_class c left join t_stu s on c.c_id=s.c_id
group by c.c_id,c.c_name


在工作中,经常会涉及到多个表连接。
如:查询:班级名称,姓名,科目名称,分数。

方法:
首先在草稿上画出表间关系图,这是最重要的。
然后确定书写的方向:班级表→学生表→成绩表→科目表

2种写法:传统和JOIN
select c_name,s_name,sub_name,score
from t_class c join t_stu s on c.c_id=s.c_id
               join t_score sc on s.s_id=sc.s_id
               join t_subject sub on sc.sub_id=sub.sub_id
;

select c_name,s_name,sub_name,score
from t_class c, t_stu s ,t_score sc,t_subject sub
where  c.c_id=s.c_id
and s.s_id=sc.s_id
and sc.sub_id=sub.sub_id
;

在开发中,由于连接时计算机消耗的资源多,所以要尽量少连接表。
全连接(full join)的效率非常低,所以尽量不要使用。
要掌握多个表(3个表以上)的连接写法。

作业:银行转账
1、简单版
帐户表:帐户ID,帐户名称,余额,密码

2、完整版
帐户表:帐户ID,帐户名称,余额,密码
业务表:业务ID,业务类型,发生金额,发生时间
业务明细表:流水号,业务ID,发生帐户,发生金额,


帐户表:帐户ID,帐户名称,余额,密码
          1       a        1000
          2       b        100
a向b转账300
业务表:业务ID,业务类型,发生金额,发生时间
        10001    转账       300      2012-1-2
业务明细表:流水号,业务ID,发生帐户,发生金额,
             2001   10001    1       -300
             2002   10001    2       300
同时还要更新帐户表
帐户表:帐户ID,帐户名称,余额,密码
          1       a        1000-300
          2       b        100+300
转账时一共涉及(3个Insert+2个Update)

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Autodyna matsum——v6.1

    Autodyna相关材料参数,对Autodyna中材料进行简要中文概述,提供一定辅助性帮助

    《设计模式实训教程》【PPT+类图与代码+样章】

    1.3实训练习 第2章面向对象设计原则实训 2.1知识讲解 2.1.1面向对象设计原则概述 2.1.2单一职责原则 2.1.3开闭原则 2.1.4里氏代换原则 2.1.5依赖倒转原则 2.1.6接口隔离原则 2.1.7合成复用原则 2.1.8...

    2022-2021学年高一历史人民版必修1训练:6.1民主政治的摇篮——古代希腊 .docx

    2022-2021学年高一历史人民版必修1训练:6.1民主政治的摇篮——古代希腊 .docx

    过关练——6.1平面向量的概念(人教A版2019)) pdf文档整理.zip

    【标题】"过关练——6.1平面向量的概念(人教A版2019)) pdf文档整理.zip" 涉及的是高中数学中关于平面向量的基础概念,这是学习支持向量机、算法、机器学习以及人工智能等领域的基础。在人教A版2019教材中,对这一...

    psim6.1_demo_343803238

    本次我们关注的是PSIM的6.1版本的演示版——"psim6.1_demo_343803238",它为用户提供了对PSIM 6.1核心功能的初步体验。 PSIM 6.1 是该软件系列的一个重要更新,它带来了许多新特性和性能优化。首先,PSIM 6.1 强化...

    基于C#的图书系统(带数据库和实训报告)

    目 录 1 需求分析 2 1.1 功能需求分析 2 1.2 数据需求分析 2 2 E-R模型设计 4 3 关系模型设计 5 3.1 实体集转化成关系模式 5 3.2 联系集转化成关系模式,并确定参照完整性 5 ...8实训小结 12 9参考资料 13

    Windows6.1-KB2533623-x64

    Windows6.1-KB2533623-x64Windows6.1-KB2533623-x64Windows6.1-KB2533623-x64Windows6.1-KB2533623-x64Windows6.1-KB2533623-x64Windows6.1-KB2533623-x64Windows6.1-KB2533623-x64Windows6.1-KB2533623-x64Windows...

    KUDA-Shaders v6.1 Legacy_softlyhcb_KUDA6.1Legacy_KUDAv6.1_KUDA-s

    标题中的“KUDA-Shaders v6.1 Legacy_softlyhcb_KUDA6.1Legacy_KUDAv6.1_KUDA-s”指的是一个针对Minecraft游戏的特定版本的 shader 包。Shaders 在 Minecraft 中是一种增强游戏图形表现的技术,通过自定义的光影效果...

    黑莓手机8830可用 浏览器 opera-mini-6.1.

    标题中的“黑莓手机8830可用 浏览器 opera-mini-6.1”指的是在黑莓8830这款智能手机上可以使用的浏览器版本——Opera Mini 6.1。这款浏览器是专为移动设备设计的,特别是针对黑莓系列手机优化,提供了更便捷的网页...

    Windows6.1-KB2999226-x86_Windows6.1-KB2999226_Windows6.1_

    标题中的"Windows6.1-KB2999226-x86"是指一个针对Windows 7(版本号6.1)32位系统的安全更新。KB2999226是这个更新的独特标识符,通常由微软用于追踪和识别特定的更新或补丁。这个更新旨在解决操作系统中的安全问题...

    力控6.1破解包

    力控6.1版本破解力控6.1版本破解力控6.1版本破解力控6.1版本破解力控6.1版本破解力控6.1版本破解力控6.1版本破解

    matlab6.1完整版下载

    本篇文章将详细解析“MATLAB6.1完整版下载”的相关知识点。 首先,MATLAB6.1,也称为R12,是MATLAB历史上的一个重要版本,发布于2001年。相比于后来的版本,它的体积更小,安装包只有几百MB,但这并不意味着其功能...

    ANSI-ESD-S6.1-2019.rar

    美国国家标准学会(American National Standards Institute, ANSI)发布了一项重要的标准——ANSI ESD S6.1-2019,专门针对静电放电敏感物品的防护进行了详细规定。本文将深入探讨这一标准的核心内容及其在实际应用...

    websphere 6.1 资料集

    Websphere 6.1 资料集涵盖了关于IBM的Websphere Application Server (WAS) 6.1版本的全面知识,包括安装、配置和实用操作等多个方面。Websphere是IBM提供的一个强大的企业级Java应用服务器,用于部署和管理基于Java...

    WIN7(32位) 微软WIN CE同步MicrosoftActiveSync6.1

    标题中的“WIN7(32位) 微软WIN CE同步MicrosoftActiveSync6.1”指的是一款在32位Windows 7操作系统上使用的软件,用于与运行Windows CE(一种嵌入式操作系统)设备进行同步的工具——Microsoft ActiveSync 6.1。...

    labview runtime engine 6.1

    LabVIEW Runtime Engine 6.1是该平台的一个重要组成部分,它允许用户在没有完整LabVIEW开发环境的情况下运行由LabVIEW编译的程序或VI(Virtual Instruments)。 **LabVIEW Runtime Engine的基本概念:** LabVIEW ...

    力控6.1破解文件

    力控6.1破解文件

    EhLib 6.1 Build 6.1.129

    EhLib 6.1 Build 6.1.129最新版,从官网下载的,可支持最新版本Delphi XE4

    PyPI 官网下载 | instancelib-0.3.6.1.tar.gz

    《PyPI官网下载的instancelib-0.3.6.1.tar.gz——探索Python分布式云原生库》 PyPI(Python Package Index)是Python开发者的重要资源库,它提供了无数的开源Python库,便于开发者们下载和安装。在本文中,我们将...

    Unicode字符集 V6.1

    ### Unicode字符集 V6.1 知识点详解 #### 一、Unicode标准简介 Unicode是一种全球性的字符编码标准,旨在提供一个通用的字符集,支持世界上几乎所有语言的文字表示。Unicode标准由Unicode联盟制定和维护,它定义了...

Global site tag (gtag.js) - Google Analytics