SQL快速入门

建立数据库

create database zhouzhuo

建立学生表

create table student
(student_number char(9) primary key,
    student_name char(20),
    student_sex char(2),
    student_age smallint,
    student_depart char(4)
);

删除表

drop table stuent;

查询表的所有内容

select * from  student;

插入数据

insert into student values('200215121','李勇','男','20','CS');
insert into student values('200215122','刘晨','女','19','CS');
insert into student values('200215123','王敏','女','18','MA');
insert into student values('200215125','张立','男','19','IS');

创建一张课程表

create table course(
course_number char(4) primary key,
course_name char(20),
primary_course char(4)constraint PK_course foreign key references course(course_number),
course_credit smallint)

向课程表中插入数据

insert into course values('1','数据库','5',4);
insert into coursevalues('2','数学',null,2);
insert into coursevalues('3','信息系统','1',4);
insert into coursevalues('4','操作系统','6',3);
insert into coursevalues('5','数据结构','7',4);
insert into coursevalues('6','数据处理',null,2);
insert into coursevalues('7','Pascal语言','6',4);

--注意:上面的插入数据有技巧,要先插入先修null的,句要服从完整性

建立学生_课程表

create table student_course(
student_number char(9) foreign key references student(student_number),
course_number char(4) foreign key references course(course_number),
primary key(student_number,course_number),
grade smallint);

插入数据

insert into student_coursevalues('200215121','1',92);
insert into student_coursevalues('200215121','2',85);
insert into student_coursevalues('200215121','3',88);
insert into student_coursevalues('200215122','2',90);
insert into student_coursevalues('200215122','3',80);

修改表

(1)增加列  增加学生表中入学年份一列

alter table stu add student_entrancedate char(10);

(2) 除表 注意:当要除的表中某一列被其他表所引用,要先除所引用的表才能除此表

drop table stu;

部分查询

select student_name,student_sex,student_agefrom stu;
select distinct student_number from student_course

--distinct表示唯一示学号

--注意:在有些元的某些属性上若存在多个null,distinct可以只示一个空

--使用distinct可以将两个或多个属性同时执,得出来的其属性的唯一表达式

--eg 唯一查询学生选课表中学生号和分数

select distinct student_number,gradefrom student_course;

 

select  student_number from student_course

--没有distinct表示示所有学号与下面的句等价

select all student_number from student_course

--条件查询 eg1

select student_namefrom studentwhere student_depart='CS';

--eg2

select student_name,student_agefrom studentwhere student_age<20;

--eg3

select distinct student_number,gradefrom student_coursewhere grade<60;

--唯一查询不及格的学生

--查询~22的学生的姓名,系,年

select student_name,student_depart,student_agefrom studentwhere student_age between 20 and 22;

--可以否定地使用between  and

select student_name,student_depart,student_agefrom studentwhere student_age not between 20 and 22;

--查询属于某个属性的元:查询CS,MA,IS,系的所有学生的元

select student_name,student_sex,student_departfrom studentwhere student_depart in('CS','MA','IS');

--模糊匹配

--用like行字符串匹配

--eg 查询学生的详细情况

select * from studentwhere student_number like '200215121';

--等价于下面命令

select * from studentwhere student_number = '200215121';

--eg  用%,%可以任意

select student_name,student_number,student_sexfrom studentwhere student_name like '刘%';

--可以否定like 查询 eg

select student_name,student_number,student_sexfrom studentwhere student_name not like '刘%';

--使用模糊查询时可以限定查询的要范,用[a-b]表示要查询的字段在a-b

--用[a,b]表示要查询的字段a或者b

--用[a-b]表示要查询的字段在a-b

--用[^a-b]表示要查询的字段不在a-b--- ' ^  '异或符Ctrl+6

--eg  程表里程号含有或者的

select *from coursewhere course_number like '[3,7]'

--eg  程表里程号第一个字符含有-7

select *from coursewhere course_number like '[3-7]%'

--eg  程表里程号第一个字符不含有-7

select *from coursewhere course_number like '[^3-7]%'

--总结:要匹配的符号均要用引号括起来

--如果用查询的字符串本身就包含通配符%或_,这时就要使用escape'<换码>'

--eg  先建一个含有通配符的元

insert studentvalues('10001','刘_','男',18,'CS');

--查询

select student_number,student_sexfrom studentwhere student_name like '刘\_'escape '\';

--,escape '\' 表明\号做转义字符,\后面的符号_普通字符

查询

例:某学生没有参加的考其考绩为NULL(注意是空,不是)要求查询其学生的学号和对应程号

--eg  先建一个分数空的元

select *from student_course;insert student_coursevalues('10001','1',null);

--查询分数空的学生
 

select student_number,course_numberfrom student_coursewhere grade is null;

--注意:is 不能用 =  代替

多重条件查询

运用逻辑运算符and ,or可以联结多个查询条件and高于or 但可以用括号改

--eg  查询计算机系年以下的学生名字

select student_namefrom studentwhere student_depart='CS'and student_age<20;

--在使用or如果条件比,可以用in

--eg 查询计算机系,数学系,信息系学生的姓名和性

select student_name,student_sex from student where student_depart='CS'or student_depart='MA'or student_depart='IS';

--上面的句等价于下面的

select student_name,student_sexfrom studentwhere student_depart in('CS','MA','IS');

--算列

----eg 算学生选课表中所有学生的成减少分

select student_number,course_number,grade-10 from student_course

--注意:此grade-10一列是无列名,可以用as跟它起个名字

select student_number,course_number,grade-10 as "AAA"from student_course

--注意:as 可以省略,了移植性好,起的名字最好用双引号括起来(在sql中引号也可以)

----在数据中,不等于号可以写!=   更多的情况下写 <>

-----逻辑取反  或取反, 且取反

--top 的用法

--top 用于出表中的前若干个元或若干百分比个元

----eg  出学生表前个元

select top 2 *from student 

-----eg 出学生表前%的元,由于学生表共有个元%组应取上整

select  top 70 percent *from student 

----eg 程表中学分在-3程前个降序排列

select top 3 *from course where course_credit between 2 and 3 order by course_credit desc

--注意此select  *from course 句的:选择-3的学分,再排序,最后选择前三个

 

null

----1 程表中先修课为空的,2 先修空的

select *from course where primary_course=null 

--错误
 

select *from course where primary_course!=null

--错误

select *from course where primary_course<>null

--错误

------总结:null句不能参与 =  !=   <> 运算

--注意null 不能参加四运算,只能参与is  is not 运算

----候要null能参加运算,并把它看做,要用isnull

----isnull(A,0),表示若A,就返回

---:工表中有月薪和年终奖列,有的工没有,值为,但要算他的年

--收入由于null不能参加四运算,就得isnull句;sal*12+isnull(jiangjin,)

select *from course where primary_course is null
select *from course where primary_course  is not null

 

----另外,与null意不同0是一个null表示值为 任何型的数据都允许为

 

--order by ,可以使用order by 对查询结果按照一个或多个属性列的升序(asc)或降序排列(desc),缺认为升序

--eg 查询选修了号程的学生学号和其成果按降序排列

select student_number,gradefrom student_coursewhere course_number='3'order by grade desc

---order by 句后面可以接多个参数,排列序由参数序依次排列

--eg 选课表中的学号降序排列,分数升序排列

select *from student_courseorder by student_number desc,grade

/*注:

order by A,B         ---先按A升序排列,再按B升序排列

order by A desc,B      ----先按A降序排列,再按B升序排列

order by A,B desc      ----先按A升序排列,再按B降序排列

order by A desc,B desc    ----先按A降序排列,再按B降序排列

*/

 

--函数的分: 1,行函数;2,多行函数

--行函数 每一行返回一个

--多行函数: 多行返回一个

 

----eg 将学生表中系的名字成小写形式

select lower(student_depart) "low_depart" from student

--lower()函数每一行返回一个,所以它是行函数

----eg 求学生选课表中学生最高成

select max(grade) "max_grade" from student_course

--max()函数多行返回一个,所以它是多行函数

------聚合函数的引入

--聚合函数是多行函数

--的聚合函数有

--1  max()      求最大

--2  min()      求最小

--3  avg()      求平均

--4  count()    数,求个数

 

--count的用法

--eg 算学生表所有记录

select count(*) from student

--eg 算学生表中学生的系部个数

select count(student_depart) from student 

--注:里返回的是逐个记录个数,要去除重复的,需要用distinct

select count(distinct student_depart) from student

----统计的是有效的系部

--在使用count()统计含有空(null)记录时,count不会算其数目

--eg

select *from student_course

--学生选课表中的学生成绩为,记录共有条

--统计学生选课表的成绩记录个数

select count(grade) from student_course 

--里把null记录去除了,记录为

--group by

--句功能:行分,可求表的整体属性

--eg 求学生表中各系的学生的平均年

--按两个列分  group by a,b;

--eg 学生表各系的学生分男女求平均年

select student_depart,student_sex,avg(student_age)"各系学生平均年龄"from student group by student_depart,student_sex

--求分内部各参数

--eg 学生表各系的学生求平均年,最大年,最小年

select student_depart,avg(student_age)"平均年龄", max(student_age)"最大年龄",min(student_age)"最小年龄"from student group by student_depart

--注:group by a,b,c  的意,先按a分,若a相同,再按b分,若b相同,再按c分,

--终统计的是最小分的信息

--明一个问题,若要分的属性里含有空,也将把空

--eg对课程表按先修  例子,实际

select primary_coursefrom coursegroup by primary_course

--having :信息过滤

--eg 求学生表中各系的学生的平均年于的信息

select student_depart,avg(student_age)from studentgroup by student_departhaving avg(student_age)>18

--没有having之前有三信息,加上having过滤,将小于的信息过滤掉了

--注意:在用having过滤信息,不允用自己起的过滤

--eg

select student_depart,avg(student_age)"平均年龄"from student group by student_departhaving "平均年龄">18    

      --error

----上面句中使用了过滤,现错误

--having总结

--having与where的异同

--having后的信息过滤,where原始数据过滤

--where句不能使用聚合函数而having可以

----having组进过滤,因此,使用having之前一般都有group by

---若没使用group by 句就使用having 句,就意味着having将所有元组视为过滤,很少使用

---having子句出的字段必是分之后的的整体信息,having子句不允现组内的详细信息

---select中可以出现别名,而having子句和where句都不允现别

--查询()

----:将两个表或者两个以上的表以一定的接条件接起来,从中索出足一定条件的数据

---

----  select...from A,B 的用法  此句相当于把A表和B表做笛卡尔积

---eg 学生表和程表做笛卡尔积  学生表行列,程表行列,行列

select *from student,course

---果的行数是原两个表的行数之,两表列之和

-----select ...from A,B where 的用法:原来的笛卡尔积进过滤

---eg出学生号的学生与程表的笛卡尔积

select *from student,coursewhere student_number='10001'

---行列

-----select...from A join B on 的用法

--A表与B表的接,on后面接A的某个属性和B的某个属性

--eg 查询学生的个人信息与选课信息

select *from student "S"join student_course "SC"on "S".student_number="SC".student_number

---双引号里面表示on后面接的是筛选条件,去除了笛卡尔积中一些没用的西

--eg 查询学生的姓名,及他选课程信息

select "S".student_name,"S".student_depart,"SC".course_numberfrom student "S"join student_course "SC"on "S".student_number="SC".student_number

--注意:select句后面的选择条件的属性要明确,student_name 等要指明是哪表里的

--以上句等效于下面(上是下面的),上面的句是SQL99,下面的句是SQL92

--推荐使用SQL99

select "S".student_name,"S".student_depart,"SC".course_numberfrom student "S", student_course "SC"where "S".student_number="SC".student_number

--SQL99准中的on句能更好地与where句分工,on表的接条件,where为过滤

--示例:查询学生姓名,,所大于分选课

--SQL92

select "S".student_name,"S".student_depart,"SC".course_number,"SC".grade from student "S",student_course "SC"where "S".student_number="SC".student_number and "SC".grade>85

--SQL99

select "S".student_name,"S".student_depart,"SC".course_number,"SC".gradefrom student "S"join student_course "SC"on "S".student_number="SC".student_number where "SC".grade>85

---此示例能清楚地看到on与where的分工,在准中where的分工不明确,而准中on与where分工明确

三表()

--以示例

--eg 查询学生姓名,,所大于分选课程名

--此要求涉及到三,,遵循两表接的

--SQL99

select "S".student_name,"S".student_depart,"C".course_name,"SC".grade from student "S"join student_course "SC"on "S".student_number="SC".student_number join course "C"on "SC".course_number="C".course_number where "SC".grade>85

--SQL92

select "S".student_name,"S".student_depart,"C".course_name,"SC".grade from student "S",student_course "SC",course "C" where  "S".student_number="SC".student_number and "SC".course_number="C".course_number and "SC".grade>85

左外

--左外接是内接加以特殊要求的接:用左表的第一行和右表的所有行

--若有匹配的行,一起出,若没有匹配的,则结果只出一行,行左是左表第一行的内容,

--全部null;再用左表的第二行和右表的所有行匹配,若有匹配的一行,一起出,

--若有多行匹配则输出多行,否则结果只出一行,行左是左表第一行的内容,

--全部null;以此推;

完全 (full join)

--它的果包括三个部分的集合两个表匹配的所有行的记录

--2  左表中那些在右表中找不到的行的记录记录的右null

--3  右表中那些在左表找不到的行的纪录纪录的左null

交叉接(cross join

--等价于全体的笛卡尔积

--  :一表和自己建立

--eg 用聚合函数查询分数最高的学生信息

select *from student_coursewhere grade=(select max(grade) from student_course)

---若不用聚合函数,要用到自(会出错,不建议这种方法)

select * from student_coursewhere student_number not in select  "S1".student_number from student_course "S1"  join student_course  "S2"  on "S1".grade<"S2".grade)

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值