目录
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;