精华内容
下载资源
问答
  • 查询 差查询 student表 sc表 查询 什么是查询? 将两个select语句查询到的结果合并 如图,将查询到的A结果集和B结果集结合在一起 代码实现: select a.CId,a.score ,b.Sname ...

    目录

     

    并查询

    交查询

    差查询


            student表  

                                 sc表     

     

     

    并查询

                                                                 

    什么是并查询?

    将两个select语句查询到的结果合并

    如图,将查询到的A结果集和B结果集结合在一起

     

    代码实现:

    select a.CId,a.score ,b.Sname           --找出指定学生
    from sc a, student b
    where a.SId =b.SId and CId = 01
    
    union
    
    select ' ',sum(score),'合计'               --成绩总数
    from sc a, student b
    where a.SId =b.SId and CId = 01
    

    执行结果:

                      

     


    交查询

                                                              

    什么是交查询?

    将两个select语句结果集结合在一起,求他们共有的部分

    如图,得到结果集A和结果集B,求他们共同拥有的结果集C部分

    代码实现:

    select a.CId ,a.score ,b.Sname  from sc a ,student b            --查询课程为801,考试为01的学生
    where a.SId =b.SId and a.CId ='01' and a.课程编号 ='801'
    
    intersect
    
    select top 10 a.CId ,a.score ,b.Sname  from  sc a, student b    --查询课程为801,成绩前10的学生
    where a.SId =b.SId  and a.课程编号 ='801'  order by a.score desc
    

    执行结果:

                        

     


    差查询

    差查询求的是哪部分?

    去除select两个结果集不想交的地方

    代码实现:

    select a.CId ,a.score ,b.Sname  from sc a ,student b            --查询考试为01的学生
    where a.SId =b.SId and a.CId ='01' 
    
    except
    
    select top 15 a.CId ,a.score ,b.Sname  from  sc a, student b    --查询课程为801,成绩前10的学生
    where a.SId =b.SId  and a.课程编号 ='801'  order by a.score desc

    执行结果:

                         

     

     

     

    展开全文
  • 一、查询(INTERSECT) ①查询查出的数据是两个数据表中的哪块数据呢? A,B数据的交集C部分为查询最后的查询结果。 ②我想要查询两个数据表之间的查询,是不是把两个表用intersect连接起来就行了呢? ...

    一、交查询(INTERSECT)

    ①交查询查出的数据是两个数据表中的哪块数据呢?

    A,B数据的交集C部分为交查询最后的查询结果。

    ②我想要查询两个数据表之间的交查询,是不是把两个表用intersect连接起来就行了呢?

    看来不是这样的,报错提示:UNION(联合查询),INTERSECT(交查询)与EXCEPT(差查询)必须在目标列表中有相同的数目表达式,具体什么是数目表达式,我们前面的博客中有实例说明,不再赘述。

    我们找数据表达式相同的两个数据表来进行交查询。

    结果是可行的。

    ③如果我们在intersect前面的数据表中加上order by是什么样的结果呢?

    显示语法错误,显然我们得出的结论是:intersect前面的表格中不能添加order by语句

    ④那么在intersect后面的表格中添加会是什么样呢?

    放到后面就没有问题了,但有时会有影响,那么放到子查询语句中来避免就可以了。

    二、差查询(EXCEPT)

    ①差查询是与交集相对立的补集么?

    不是补集,而是相对补集

    ②什么是相对补集

    B中A的相对补集为蓝色部分,而差查询,则是B中的数据减去A与B相交数据剩下的部分

    此查询的结果正是‘旧员工信息’数据表中的数据,减去两个表格相交的数据。

    三、思维导图(在前三篇博客基础上的拓展与总结)

    到此数据库视频的第七章已梳理完毕,下一站,走起^_^

    展开全文
  • 把能进行会议的国家之间都用并查集连接起来,然后把每个进行过会议的国家扔进队列跑BFS,将搜到的国家用并查集连接  最终答案等于每个单点的出度个数+2*C(每个集合的大小,2)  #include #include #include ...

    Po姐说

    把能进行会议的国家之间都用并查集连接起来,然后把每个进行过会议的国家扔进队列跑BFS,将搜到的国家用并查集连接 
    最终答案等于每个单点的出度个数+2*C(每个集合的大小,2) 


    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<set>
    #define V G[p].v
    using namespace std;
    typedef long long ll;
    
    inline char nc()
    {
    	static char buf[100000],*p1=buf,*p2=buf;
    	if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
    	return *p1++;
    }
    
    inline void read(int &x)
    {
    	char c=nc(),b=1;
    	for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
    	for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
    }
    
    const int N=100005;
    
    namespace TSet{
    	int fat[N],rank[N],size[N];
    	void init(int n){
    		for (int i=1;i<=n;i++) fat[i]=i,rank[i]=0,size[i]=1;
    	}
    	int Fat(int u){
    		return u==fat[u]?u:fat[u]=Fat(fat[u]);
    	}
    	void Union(int x,int y){
    		x=Fat(x),y=Fat(y); if (x==y) return;
    		if (rank[x]>rank[y]) swap(x,y);
    		if (rank[x]==rank[y]) rank[x]++;
    		fat[x]=y; size[y]+=size[x];
    	}
    };
    
    int n,m;
    ll ans;
    int Q[N],vst[N];
    int l=-1,r=-1;
    
    set<int> M[N];
    typedef set<int>::iterator ITER;
    
    int main()
    {
    	using namespace TSet;
    	freopen("t.in","r",stdin);
    	freopen("t.out","w",stdout);
    	int iu,iv;
    	read(n); read(m); init(n);
    	for(int i=1;i<=m;i++)
    		read(iu),read(iv),M[iu].insert(iv);
    	for(int i=1;i<=n;i++)
    		for(ITER it=M[i].begin();it!=M[i].end();it++)
    			if (M[*it].find(i)!=M[*it].end())
    				Union(i,*it);
    	for(int i=1;i<=n;i++)
    		if (M[i].size()>1)
    		{
    			int last=*M[i].begin();
    			ITER it=M[i].begin(); it++;
    			for(;it!=M[i].end();it++)
    		   		Union(*it,last);
    		}
    	for(int i=1;i<=n;i++) 
    		if(size[Fat(i)]>1) 
    			vst[i]=1,Q[++r]=i;
    	while (l<r)
    	{
    		iu=Q[++l];
    		for(ITER it=M[iu].begin();it!=M[iu].end();it++)
    		{
    			Union(iu,*it);
    			if(!vst[*it]) vst[*it]=1,Q[++r]=*it;
    		}
    	}
    	for(int i=1;i<=n;i++)
    		if (Fat(i)==i)
    		{
    			if(size[i]==1)
    				ans+=M[i].size();
    			else
    				ans+=(ll)size[i]*(size[i]-1);
    		}
    	printf("%lld\n",ans);
    	return 0;
    }


    展开全文
  • 你的工作是对于可以进行会议的两国,选择会议的中介促使会议进行。使用这张图进行工作的模拟的话,世界距离和平还有多远的一个重要的基准就是这张图上的边数。也就是说,你想知道反复进行【选择两个国家使其进行...

    Description

    你是活跃在历史的幕后的一名特工,为了世界的和平而日以继夜地努力着。
    这个世界有N个国家,编号为1…N,你的目的是在这N个国家之间建立尽可能多的友好关系。你为了制定一个特工工作的计划,作出了一张当今国际关系的示意图。
    你准备了一张非常大的画纸,先画下了代表每个国家的N个点。接下来,为了表示现在的国际关系,画下了M个连接两个国家的有向边,其中从国家a连向国家b的有向边(下面称作“边(a,b)”)表示“现在国家a向国家b派遣了大使”。这样就做出了N个点M条边的当今国际关系示意图。
    作为两国友好关系的开端,两国之间需要进行“友好条约缔结会议”(以下简称会议)。如果某两个国家p和q要进行会议,那么需要一个向两国都派遣了大使的国家x作为中介。会议结束后,会议的双方相互向对方的国家派遣大使。换句话说,为了让国p和国q进行会议,必须存在一个国家x满足边(x,p)和边(x,q)都存在,并且在会议后添加两条边(p,q)和(q,p)(如果需要添加的某条边已经存在则不添加)。
    你的工作是对于可以进行会议的两国,选择会议的中介并促使会议进行。使用这张图进行工作的模拟的话,世界距离和平还有多远的一个重要的基准就是这张图上的边数。也就是说,你想知道反复进行【选择两个国家使其进行会议】的工作后,图上的边数最多会到达多少。
    现在给出国家的个数以及当今国际关系的情报,请你求出反复进行【选择两个国家使其进行会议】的工作后,图上的边数最多会到达多少。
    Input

    第一行两个空格分隔的整数N和M,分别表示世界上国家的个数和图中的边数
    接下来M行描述画纸上的有向边的信息,其中第i行(1<=i<=M)有两个空格分隔的整数Ai和Bi,表示图中有一条从Ai到Bi的有向边(即Ai国向Bi国派遣了大使)。
    Output

    输出一行一个整数,表示能实现的边数的最大值。注意这个边数包括原有的边数和新连接的边数。
    Sample Input

    5 4

    1 2

    1 3

    4 3

    4 5
    Sample Output

    10
    HINT

    按照下面的顺序实现10条边:

    以国1为中介,国2与国3进行会议;

    以国4为中介,国3与国5进行会议;

    以国3为中介,国2与国5进行会议。

    1<=N<=10^5

    1<=M<=2*10^5

    1<=Ai<=N(1<=i<=M)

    1<=Bi<=N(1<=i<=M)

    Ai≠Bi(1<=i<=M)

    (Ai,Bi)≠(Aj,Bj)(1<=i<j<=M)

    Source

    JOI 2013~2014 春季training合宿 竞技2 By PoPoQQQ

    分析:
    假设有一个点pp,显然他连出去的点a1,a2,....,ana_1,a_2,....,a_n将会连成一个完全子图。
    然后把大于11的完全子图的节点插入一个队列里。
    枚举队列里的点,如果存在xx连向yy的一条边,显然xx中的所有点都可以有连向yy的双向边,所以可以合并xxyy。如果yy是一个大小为11的完全子图,则把他插入队列。

    代码:

    /**************************************************************
        Problem: 4243
        User: liangzihao
        Language: C++
        Result: Accepted
        Time:4904 ms
        Memory:8904 kb
    ****************************************************************/
     
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <queue>
    #define LL long long
     
    const int maxn=2e5+7;
     
    using namespace std;
     
    int n,m,x,y,cnt,pl;
    int ls[maxn],vis[maxn],size[maxn],p[maxn];
    LL ans;
     
    struct edge{
        int y,next;
    }g[maxn];
     
    queue <int> q;
     
    void add(int x,int y)
    {
        g[++cnt]=(edge){y,ls[x]};
        ls[x]=cnt;
    }
     
    int find(int x)
    {
        if (!p[x]) return x;
        return p[x]=find(p[x]);
    }
     
    void uni(int x,int y)
    {
        int u=find(x),v=find(y);
        if (u==v) return;
        p[u]=v;
        size[v]+=size[u];
    }
     
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            add(x,y);
        }
        for (int i=1;i<=n;i++)
        {
            p[i]=0;
            size[i]=1;
        }   
        for (int i=1;i<=n;i++)
        {
            pl=0;
            for (int j=ls[i];j>0;j=g[j].next)
            {
                int y=g[j].y;
                if (!pl) pl=y;
                else
                {
                    uni(pl,y);
                    if (!vis[y]) q.push(y),vis[y]=1;
                    if (!vis[pl]) q.push(pl),vis[pl]=1;
                }
            }
        }   
        while (!q.empty())
        {
            int x=q.front();
            q.pop();
            for (int i=ls[x];i>0;i=g[i].next)
            {
                int y=g[i].y;
                uni(x,y);
                if (!vis[y]) q.push(y),vis[y]=1;
            }
        }   
        for (int i=1;i<=n;i++)
        {
            if (find(i)==i)
            {
                ans+=(LL)size[i]*((LL)size[i]-1);
            }
            for (int j=ls[i];j>0;j=g[j].next)
            {
                int y=g[j].y;
                if (find(i)!=find(y)) ans++;
            }
        }
        printf("%lld\n",ans);
    }
    
    展开全文
  • 逻辑梳理就花费了很长时间,在第一个‘学生上机统计信息’的组合查询窗体中有很多代码冗余,导致代码篇幅很长,这次在做‘学生基本信息维护’窗体时又遇到了组合查询,这次的组合查询未直接按照之前的那种方法,...
  • 集合的

    2019-09-30 05:06:08
    http://ifeve.com/google-guava-collectionutilities/ 转载于:https://www.cnblogs.com/DengGao/p/10193972.html
  • 并查

    2021-01-07 08:10:10
    文章目录并查并查集问题中集合如何存储实现 并查集 集合的运算:、并、补、差和判断一个元素是否属于某一集合。 并查集:集合的合并、判断一个元素是否属于某一集合的操作。 并查集问题中集合如何存储 可以用树...
  • 我现在不懂的是,如何在SQL查询中进行isKosher的交并判断? ``` CREATE TABLE ingredient ( code CHAR(8) PRIMARY KEY, name VARCHAR(127) UNIQUE, is_kosher BOOLEAN ); CREATE TABLE recipe ( name VARCHAR...
  • 为了进行、差运算,要求运算的两个查询结果具有相同的字段个数,并且对应的字段的值要出自同一个值域,即具有相同的数据类型和取值范围  10:运算(union)  主要将两个或者更多个查询的结果组合...
  • 并查集要有的一些属性:value:表示当前值,指针:(不一定是指针)指向父节点。 还有一个属性number:表示该树存在的总个数。(也可以用深度表示)。我用小树插在大树上。 如果是普通数字表示的树,可以简化: ...
  • #updateset1= {'alex','wusir','ritian','egon','barry'}set1.update('abc')print(set1)删1,popset.pop()#随机删除,有返回值2,removeremove#按元素去...---》会报错只能用for去3、集合的交集并集差集1,交集:...
  • 为了进行、差运算,要求运算的两个查询结果具有相同的字段个数,并且对应的字段的值要出自同一个值域,即具有相同的数据类型和取值范围  10:运算(union)  主要将两个或者更多个查询的结果组合...
  • 在employees表中查询出员工的工资,计算应税款:如果工资小于1000,税率为0,如果工资大于等于1000小于2000,税率为10%,如果工资大于等于2000小于3000,税率为15%,如果工资大于等于3000,税率为20%。
  • 尾部附加源码 增加数据Status ListInsert_Sq(SqList &L,int i,ElemType e){ if(L.length == LIST_INIT_SIZE || i||i>L.length+1){ return ERROR; } ElemType *q,*p; p = &(L.elem[i-1]); /**这个可
  • 解题思路:看到连接具有传递性就该想到木棍将组成集合,判断连接即判断木棍是否属于同一个集合,用并查集再方便不过了。然后是决定并查集合并集合的条件,也就是上面提到的两种情况:线段相交和共线重叠。 判断...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,588
精华内容 635
关键字:

并查交