计算机网络10——数据库语法1

目录

1、sql语句执行顺序

2、多表查询

3、写sql的步骤

4、去重

5、视图

6、自定义函数:function

7、调用函数


1、sql语句执行顺序

一般情况下:1、from 2、where 3、select

如果有分组和having:from 分组 having最后执行

2、多表查询

内联:select * from 表1 inner join 表2 on 连接条件 inner join 表3 on 连接条件;

左联:select * from 表1 left join 表2 on 连接条件 left join 表3 on 连接条件;

右联:select * from 表1 right join 表2 on 连接条件 right join 表3 on 连接条件;

笛卡尔积:select * from 表1,表2 where 连接条件;

区别

内联:不包含空的结果,取两个表的交集

左联:以左边的表为基准匹配行,如果没有对应的,属性为空

右联:以右边的表为基准匹配行,如果没有对应的,属性为空

笛卡尔积:查询结果和内联一致,写法简单,但效率低,不推荐使用,先采用排列组合的方式,再按照条件筛选符合条件的结果

3、写sql的步骤

1、联表

2、加条件

3、筛选显示的列

4、去重

distinct

举例:select s from sc;

          select distinct s from sc;

          select s,c from sc;

          select distinct s,c from sc;

5、视图

view:为了简化复杂的sql查询语句而提出的概念。视图是一个表或者是多个表导出的虚拟表,所以不需要满足范式的要求

视图创建好以后,永久保存在数据库中,查询语句可以通过视图名代替

创建语法:create view 视图名 as (sql查询语句)

使用:跟表的使用方法一样(只能查询数据)

删除:drop view 视图名

eg:

create view myview as
(
select student.*,C,score from student inner join sc on sc.S=student.S
);

优点:sql语句在网络中传输,使用视图可以减少流量,更安全

缺点:执行效率并没有提高,还是执行原来的sql

6、自定义函数:function

普通函数

int add(int a,int b)

{
    int c=0;
    c=a+b;
    return c;
}

创建函数语法

delimiter //                #声明//为sql语句的结束标志
create function 函数名(参数名 参数类型,参数名 参数类型.....)
return 返回值类型
begin
函数语句;
..........
函数语句;
end //
delimiter ;                #重新声明;为sql语句的结束标志

7、调用函数

select 函数名 (参数列表);

删除(如果函数不存在,会报错):drop function 函数名

判断存在,再删除:drop function if exists 函数名;

例子:实现一个加法函数

drop function if exists myadd;
delimiter //
create function myadd(a int,b int)
returns int
begin 
	declare c int default 0;
    set c=a+b;
    return c;
end //
delimiter ;

select myadd(1,2);

数据库题目

create table Student(S varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10));
insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男');
insert into Student values('02' , N'钱电' , '1990-12-21' , N'男');
insert into Student values('03' , N'孙风' , '1990-05-20' , N'男');
insert into Student values('04' , N'李云' , '1990-08-06' , N'男');
insert into Student values('05' , N'周梅' , '1991-12-01' , N'女');
insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女');
insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女');
insert into Student values('08' , N'王菊' , '1990-01-20' , N'女');
create table Course(C varchar(10),Cname nvarchar(10),T varchar(10));
insert into Course values('01' , N'语文' , '02');
insert into Course values('02' , N'数学' , '01');
insert into Course values('03' , N'英语' , '03');
create table Teacher(T varchar(10),Tname nvarchar(10));
insert into Teacher values('01' , N'张三');
insert into Teacher values('02' , N'李四');
insert into Teacher values('03' , N'王五');
create table SC(S varchar(10),C varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);
insert into SC values('09' , '03' , 98);

数据库例题

#1、查询成绩高于60分的学生信息
select distinct student.* from student inner join sc on sc.S=student.S where score>60;

#2、查询每个学生的总成绩以及学生信息
select * from sc,student where sc.S=student.S;
select student.*,sum(score) from sc inner join student on sc.S=student.S group by sc.S;

#3、查询总成绩 > 200的学生信息
select student.*,sum(score) from sc,student where sc.S=student.S group by sc.S having sum(score)>200;

#4、查询总成绩最低的学生信息
select student.*,sum(score) from sc inner join student on sc.S=student.S 
group by sc.S order by sum(score) limit 0,1;

#5、查询学过"张三"老师授课的同学的信息
select student.* from student 
inner join sc on sc.S=student.S
inner join course on course.C=sc.C
inner join teacher on teacher.T=course.T
where Tname='张三';

#1、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩。
select student.S,student.Sname,avg(score)
from sc inner join student on sc.S=student.S group by sc.S 
having avg(score)>60;
#2、查询每门课程被选修的学生数-- 带课程名字 。
select course.Cname,count(*) from sc inner join course on sc.C=course.C group by sc.C ;

#3、查询每门课程被选修的学生数,排序按照选修的学生人数降序排序 , 如果人数相等按照课程号升序排列。
select course.Cname,count(*) from sc inner join course on sc.C=course.C group by sc.C 
order by count(*) desc,sc.C asc;

#4、查询同时存在"01"课程和"02"课程的学生的学生信息。
select student.* from student 
inner join sc on sc.S=student.S
and (C='01' or C='02') group by sc.S having count(*)=2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值