准备数据
说明:
在schoolDB数据库下,在3张表:学生表tstudent、分数表tscore、课程表tsubject
一.简单语句
1、查询所有字段
*可以代表所有字段
示例:查询学生表中的所有学生信息
select studentied,sname,sex,cardid,birthday,email,class,entertime from fromtstudent; select * from tstudent;
回忆: 投影:从源表中选择符合条件的列(字段、属性)
选择:从源表中选择符合条件的行(记录、元组)
2、查询指定字段
a.查询单个字段
b.查询多个字段
示例:
查询学生表中的姓名、性别、邮箱?
select sname,sex,email from tstudent;--投影操作
3、查询指定记录
查询满足条件的元组(记录),使用where子句
示例:查询班级是java开发的学生的姓名、性别、邮箱和专业班级?
select sname,sex,email,class from tstudent where class ='java开发'; --投影 操作
4、带in关键字的查询
示例: 查询专业班级为java开发、大数据和网络与网站开发的学生的信息?
select * from tstudent where class in('java开发",'大数据','网络与网站开发'); select from tstudent where class='java开发'or class='大数据' or class ='网络与网站开发';
5、带between ... and ..关键字的范围查询
示例: 查询1983年至1987年之间出生的所有学生的信息?
select *from tstudent where birthday >='1983-1-1' and birthday<='1987-12-31'; select * from tstudent where birthday between'1983-1-1'and '1987-12-31';
6、like关键字
模糊查询
通配符:_表示任意1个字符
%表示任意多个字符示例:
查询学生表中所有姓“雷”的学生的信息?
select from tstudent where sname like '雷%';
查询姓名中有“军”这个字的学生的信息?
select from tstudent where sname like'%军%';
查询1985年出生的学生的信息?
select*from tstudent where birthday like "1985%';
7、空值查询
空值:nul值 不确定的值 空值不是0,也不是空字符串
示例:查询奖金或补助为空值的雇员信息?
select *from emp where comm is null; select *from emp where comm is not null;
8、and 并且
示例: 查询学号小于18的,且性别为男的,并且专业班级为java开发的学生的信息。
select * from tstudent where studentid<18 and sex='男'and class='java开发';
9、or 或者
示例: 查询姓名中含有“生"字的,或专业班级为'大数据"的学生的信息?
select * from tstudent where sname like%生%'or class='大数据'; select sname,sex,birthday,classfrom tstudent where class='大数据'or class='.net'or class='java开发'; select sname,sex,birthday,classfrom tstudent where class in(大数据,.net',java开发');
10、去掉重复值
distinct 去掉重复值
示例:查询学生表的专业班级有哪些?
select distinct class from tstudent;
11、使用limit限制查询结果的数量
limit[位置偏移量,]行数
功能:返回指定位置的指定条数条记录
示例:查询学生表中的前5名学生的信息?
select *from tstudent limit 5; select*from tstudent limit 4,6;-- 从第4+1条的位置开始取,取6条记录。
12、union合并查询结果
union集合的合并
要求第一个SQL语句返回的列和第二条SQL语句返回的列数相同
selectstudentid,sname,sex from tstudent where studentid='00013' union select studentid,sname,sex from tstudent where sname like '雷%';
13、为表和字段取别名
字段名 [as]别名
select studentid学号,sname as 姓名,birthday as 出生日期from tstudent;
表名 [as] 别名
select s.studentid学号,s.sname as姓名,s.birthday as 出生Efrom tstudent as s;
小结:用户感兴趣的数据来自于1个表
语法:select 字段名1 as 别名1,字段名2 别名2,….
from 表名[as]别名
where 条件
二、连接查询
1、内连接查询
inner join
父表:主关键字所在的表
子表:外部关键字所在的表
主关键字:学生表中的学号在一个表中至少应该有1个字段,这个字段所对应的值一不能有重复、二不能是空值,它能起到唯一标识这一条记录的作用
外部关键字:成绩表中的学号 在某一张表中某个字段它不是当前这个表的主关键字,但是它是另外一个表的主关键字。
注意:学生表与成绩表的关联字段 学号
示例: 查询学生的学号、姓名、科目和成绩?
select s.studentid,s.sname,sub.subjectname,sc.mark from tstudent s,tscore sc,tsubject sub where s.studentid = sc.studentid and sc.subjectid=subsubjectid;
补充:
SQL99标准语法:
表1 inner join 表2 on 连接条件
示例: 查询学生的学号、姓名、科目和成绩?
select s.studentid,s.sname,sub.subjectname,sc.mark from tstudent as s inner join tscore as sc on s.studentid=sc.studentid inner join tsubject as sub on sc.subjectid=sub.subjectid;
连接查询:去掉重复属性的等值相连
提示:“两个表都有的字段,一般要保留父表的"。
2.外连接查询
左连接(以左边的表为主)
右连接(以右边的表为主)
--左连接 select s.*,sc.* from tstudent s left join tscore scon s.studentid=sc.studentid; --右连接 select s.*,sc.* from tstudent s left join tscore scon s.studentid=sc.studentid;
3.自连接查询
插入15000条学生的记录。
call addstudent(15000);
查询学生表中同名的学生的学号和姓名?---使用自连接查询
select a.studentid,a.sname,b.studentid,b.sname from tstudent a inner join tstudent bon a.sname=b.snamewhere a.studentid<>b.studnetid; select a.studentid,a.sanem,b.studentid,b.sname from tstudent a,tstudent b where a.sname=b,sname and a.studentid<>b.studentid;