基于创建的数据库(包含读者、图书、借阅三张表),试用SQL的查询语句表达下列查询:
1.查询图书表中售价介于50元到70元之间的图书的全部信息
2.查询图书表中全部图书的最高售价、最低售价和平均售价。。
3.查询图书的条形码,书名,出版社和出版日期,要求结果按出版社升序排列,出版社相同的数据按出版日期降序排列
4.在图书表中插入一条记录,内容是:条形码“TP211.3”,书名“狼图腾”,作者“姜戎”,售价 44.5元
5.通过图书表,读者表和借阅表,查询读者的借阅情况,要求结果中包含以下字段:账号,姓名,条形码,书名,借书日期和还书日期。
6.在读者表中查询所有等级为“白银”的读者的余额之和
7.通过读者和借阅表,查询读者信息,包括以下字段:账号,姓名,性别,条形码,借书日期和还书日期
8.查询图书表中有哪些出版社,要求结果没有重复值。
9.将图书表中条形码为TP204.2的图书信息删除。
10.在读者表中,查询男女性读者各多少人。
11.在读者表中查询不同等级各自的人数,结果按人数降序排列
12.查询图书表中条形码左边开始三个字符是“TP3”的图书的全部信息
13.将图书表中科学出版社出版的图书价格上涨5%
14.查询图书表中科学出版社出版的价格在50元以上的图书的信息,要求结果中包括书名,作者,出版社和售价4列。(不包括50元)
15.使用IN子句查询所有‘科学出版社’和‘高教出版社’的书名,作者,售价。
16.在读者表中查询余额最高的读者的全部信息。
提示:请使用嵌套查询作答,不能用top
17.根据读者表和借阅表,查询没有借书记录的读者的账号和姓名。提示:使用“带有NOT IN的嵌套查询”
18.通过图书表和借阅表,查询哪本书没有被借阅过,显示它的条形码,书名和作者信息 提示:使用“带IN的嵌套查询”
实验步骤原始记录(数据、图表、计算等)
(此处放T-SQL代码及更新结果截图)
1.select*
from dbo.Book
where Price>= 50 and Price<=70
2.select
MAX(Price) 最高售价,MIN(Price) 最低售价, AVG(Price)平均售价
from dbo.Book
3.select Barcode,Aname,Publisher,Pubdate
from Book
ORDER BY Publisher ASC,Pubdate DESC
4.Insert into Book(Barcode,Aname,Author,Price)
values ('TP211.3','狼图腾','姜戎',44.5)
5.SELECT Borrow.Account,Name,Book.Barcode,Aname,BorrowTime,ReturnTime
FROM Book INNER JOIN(Borrow INNER JOIN Reader ON Borrow.Account=Reader.Account)
ON Borrow.Barcode=Book.Barcode
6.SELECT SUM(Balance) 白银读者余额之和
FROM Reader
WHERE Grade = '白银'
7.select Reader.Account,Name,Sex,Barcode,BorrowTime,ReturnTime
from Reader inner join Borrow
on Borrow.Account=Reader.Account
8.SELECT DISTINCT Publisher
FROM Book
9.delete
from Book
where Barcode = 'TP204.2'
10.select Sex,count(Sex) 人数
from Reader
group by Sex
11.select Grade,count(*)as 人数
from Reader
group by Grade
order by 人数 desc
12.select *
from Book
where Barcode like 'TP3%'
13.UPDATE Book
SET Price = Price * 1.05
WHERE Publisher = '科学出版社'
14.SELECT Aname,Author,Publisher,Price
FROM Book
WHERE Book.Price > 50 and Publisher = '科学出版社'
15.SELECT Aname,Author,Price
FROM Book
WHERE Publisher in ( '科学出版社','高教出版社')
16.select *
from Reader
where Balance >=all(select max(Balance)from Reader)
17.select Account, Name
from Reader
where Account not in (select Account from Borrow where Borrow.Account=Reader.Account)
18.select Barcode,Aname,Author
from Book
where Barcode not in (select Barcode from Borrow where Borrow.Barcode=Book.Barcode)
sql查询学习小结
1.查询记录
select*from 表名 [where 条件];
eg:select*from students;//查询 students 表中所有记录,所有字段的值都显示出来select field1,field2,...fieldn... from 表名 [where 条件];
eg:select id,name,age from students;//查询 students 表中所有记录, 只显示出 id,name,age三个字段的值
(注:1.“*”表示将所有的字段都显示出来2.用逗号分割,列出需要显示的字段)
2.查询不重复记录
select distinct 字段 from 表名;eg: select distinct name from students;//查询名字不相同的学生;
select distinct name,age from students;//查询名字和年龄同时不同的学生
(1)distinct必须放在最开头
(2)distinct只能使用需要去重的字段进行操作。 ----也就是说我sidtinct了name,age两个字段,我后面想根据id进行排序,是不可以的,因为只能name,age两个字段进行操作. (3)distinct去重多个字段时,含义是:几个字段 同时重复 时才会被 过滤。
3.条件查询
select 字段 from 表名 where 条件;
eg:select * from student where sex='男' and age>20; //查询性别是男,并且年龄大于20岁的人。
where后面的条件可以用>、<、>=、<=、!=等多种比较运算符,多个条件之间可以用or、and等逻辑运算符
4.排序和限制
select * from 表名 [where 条件] [ order by field1 [desc/asc],field2 [desc/asc]... ];
eg:select *from student order by age desc;//查询学生表并按年龄降序排列。
1.desc 降序排列,asc 升序排列
2.order by 后面可以跟多个不同的排序字段,每个排序字段都可以有不同的排序顺序。
3.如果排序字段的值一样,则相同的字段按照第二个排序字段进行排序。
4.如果只有一个排序字段,则字段相同的记录将会无序排列。
5.聚合
select 字段 fun_name from 表名 [where 条件] [group by field1,field2...] [with rollup] [having 条件];
1.fun_name 表示要做的聚合操作,也就是说聚合函数,常用的有 : sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
2.group by关键字 表示要进行分类聚合的字段。比如要按照部门分类统计员工数量,部门就应该写在group by 后面。
3.with rollup 是可选语法,表明是否对分类聚合后的结果进行再汇总4.having 关键字表示对分类后的结果再进行条件过滤。
6.表连接
内连接(仅选出两张表中互相匹配的记录)
select staff.name,deptname from staff,deptno where staff.name=deptno.name;
外连接(左连接,包含所有左边表中的记录,甚至是右边表中没有和他匹配的记录):
select staff.name,deptname from staff left join deptno on staff.name=deptno.name;