前言:

JDBC之前 需要先回忆一下SQL语句:

需要注意的是

常用的聚合函数,要做到可以直接写出来哦

mysql查询的五种子句,要加以运用

区分好having 和where


可以参看一下这篇优秀的博文进行学习。


基础语句练习:

1.基础的回顾

SELECT studentName.birthday,phone
from


-- 集合函数
select MAX(gradeId),MIN(gradeId),gradeName from grade
GROUP BY gradeName;

-- 按出生年份分组统计学生人数,将各组中人数达到2人的年份和人数显示出来
SELECT year(borthday) as year , COUNT(*) as total,
FROM student
GROUP BY year
HAVING total>=2

-- 多表查询
-- 第一种写法:
SELECT 列名列表 FROM 表名1,表明2
WHERE 量表关联条件

-- 内连接
select 列名列表 from 表名1 INNER JOIN 表名2
ON 两表关联条件呢
-- 左外连接
select 列名列表 from 表名1 LEFT JOIN 表名2
ON 两表关联条件呢
-- 左外连接
select 列名列表 from 表名1 RIGHT JOIN 表名2
ON 两表关联条件呢


-- 需要用到两表时

-- 查询科目名称为JAVA的的考试成绩
SELECT studentResult as 考试成绩 from result a, subject b
WHERE a.subjectNo=subjectNo AND b.subject and b.subjectName='JAVA'

-- 子查询
SELECT studentResult as 考试成绩 from result
where studentNo =(SELECT subjectNo from `subject` WHERE `subject`='JAVA')


-- 左连接和外连接
-- 查询所有科目的考试成绩,科目编号,学号,有些科目没有被考试过。

SELECT s1.studentResult,s1.subjectNo,student.studentNo as 考试成绩 FROM result s1 LEFT JOIN student stu1

-- 查询学生的考试i信息,显示学号,姓名,科目名称,成绩
SELECT stu1.studentName as 姓名,stu1.studentNo as 学号 ,stu1.subjectName as 科目名称 ,r1.studentResult as 成绩,
FROM result r1,student stu1, subject sub1,grade g1
WHERE r1.subjectNo =sub1.subjectNo

-- c查询参加最近一次java考试成绩的学生的最高分和最低分
SELECT MAX(studetResult) AS 最高分
MIN(studentResult) AS 最低分
FROM result
WHERE `subjectNo`=(SELECT subjectNo from student WHERE subject.subjectName='JAVA')
AND
`examDate`=(SELECT MAX('examDate') FROM "result")

2.课后习题:
2.1前期数据储备:


#借书卡
create table tb_CARD(
CNO nvarchar(20) not null primary key COMMENT '卡号',
NAME nvarchar(20)not null COMMENT '姓名',
CLASS nvarchar(20)not null COMMENT '年级'

)
#图书表
create table tb_BOOKS(
BNO nvarchar(20) not null primary key COMMENT '书号',
BNAME nvarchar(20) not null UNIQUE key COMMENT '书名',
AUTHOR nvarchar(20) not null COMMENT '作者',
PRICE numeric(6,2) not null COMMENT '单价',
QUANTITY int not null COMMENT '库存数'
)
#借书记录
create table tb_BORROW(
ID int not null primary key COMMENT '编号',
CNO nvarchar(20) not null COMMENT '借书卡号',
BNO nvarchar(20) not null COMMENT '书号',
RDATE DATETIME not null COMMENT '还书日期'
)
#加外键
ALTER TABLE tb_BORROW add CONSTRAINT fk_BORROW_CARD FOREIGN key(CNO) REFERENCES tb_CARD(CNO)
ALTER TABLE tb_BORROW add CONSTRAINT fk_BORROW_BOOKS FOREIGN key(BNO) REFERENCES tb_BOOKS(BNO)

insert tb_BOOKS(BNO,BNAME,AUTHOR,PRICE,QUANTITY) VALUES
('B01','水浒','张某',12.2,100),
('B02','计算方法','李某',11.2,50),
('B03','计算方法习题集','王某',9,10 ),
('B04','组合数学','黄某',5,5 ),
('B05','网络教材','徐某',8 ,15 ),
('B06','会计','陈某',14 ,5 )



insert tb_BORROW(ID,CNO,BNO,RDATE)VALUES
(1,'001','B01','2014-04-20'),
( 2,'001','B02','2014-04-28'),
( 3,'001','B03','2014-04-29' ),
(4,'001','B04','2014-04-30' ),
( 6,'001','B06','2014-05-30' ),
( 7,'002','B02','2014-04-30'),
( 8,'002','B06','2014-04-22' )

--1.找出借书超过5本的读者,输出借书卡号和所借图书册书。

--2.查询借阅了“水浒”一书的读者,输出姓名和班级

--3.查询过期未能还书,输出借阅者(卡号),书号及还书日期

--4查询书名名括“网络”关键词的图书,输出书号,书名,作者

--5.查询现在图书中价格最高的图书,输出书名及作者。

--6. 查询当前借了“计算方法”但没有借“计算方法习题集”的读者,输出其借书卡号,并按卡号降序排序输出

--7.将‘C01’班同学所借图书的还期都延长一周。

--8. 从BOOKS 表中删除当前无人借阅的图书记录。

--9.查询输出“力01”班学生的借书信息(只要显求姓名和书名)

--10.查询当前同时借有“计算方法”和“数学组合”两本书的读者。输出其借书卡号,并按卡号升序排序。


2.2课后习题参考答案:


-- 1.找出借书超过5本的读者,输出借书卡号和所借图书册书。
SELECT CNO as 卡号,COUNT(*)
FROM tb_borrow
GROUP BY CNO
HAVING COUNT(*)>3

-- 2.查询借阅了“水浒”一书的读者,输出姓名和班级
SELECT * FROM tb_card
WHERE tb_card.CNO IN
{SELECT CNO FROM tb_borrow WHERE BNO=(SELECT tb_books.BNO FROM tb_books WHERE tb_books.BNAME='水浒')}
-- 正确方法:
SELECT c1.CNO AS 学号,c1.CLASS AS 班级
FROM tb_card c1,tb_books b1,tb_borrow r1
WHERE c1.CNO=r1.CNO AND b1.BNO=r1.BNO AND
b1.BNAME="水浒"


-- 3.查询过期未能还书,输出借阅者(卡号),书号及还书日期
SELECT CNO,BNO,RDATE
FROM tb_borrow
WHERE RDATE<NOW()

-- 4查询书名名括“网络”关键词的图书,输出书号,书名,作者
SELECT BNO,BNAME,AUTHOR
FROM tb_books
WHERE BNAME LIKE '%网络%'

-- 5.查询现在图书中价格最高的图书,输出书名及作者。
SELECT BNAME,AUTHOR,MAX(PRICE)
FROM tb_books
GROUP BY BNO
LIMIT 1
-- 6.查询当前借了“计算方法”但没有借“计算方法习题集”的读者,输出其借书卡号,并按卡号降序排序输出
SELECT tb_books.BNO,BNAME
FROM tb_books , tb_borrow
WHERE tb_books.BNO=tb_borrow.BNO AND
tb_books.BNAME="计算方法" AND
tb_books.BNAME!="计算方法习题集"
GROUP BY BNO desc

-- 7.将‘C01’班同学所借图书的还期都延长一周。
update b set b.RDATE = DATE_ADD(b.RDATE,INTERVAL 7 DAY)
FROM tb_borrow b,tb_card c
WHERE c.CNO=b.CNO AND
c.CLASS="C01"

update tb_books sett tb_books.BNAME = "计算机会计"
Where BNAME="会计"
???
-- 8.从BOOKS 表中删除当前无人借阅的图书记录。
DELETE A FROM tb_books a
WHERE NOT EXISTS(
SELECT * FROM tb_borrow
WHERE BNO=a.BNO)

-- 9.查询输出“力01”班学生的借书信息(只要显求姓名和书名)
SELECT a.NAME,c.BNAME
FROM tb_card a,tb_borrow b,tb_books c
WHERE a.CNO=b.CNO AND b.BNO=c.BNO AND
a.CLASS="力01"

--10.查询当前同时借有“计算方法”和“数学组合”两本书的读者。输出其借书卡号,并按卡号升序排序。
SELECT a.CNO
FROM tb_borrow a,tb_books b
WHERE a.BNO=b.BNO AND b.BNAME IN('计算方法','组合数学')
GROUP BY a.CNO
HAVING COUNT(*)=2

update b set b.RDATE = DATE_ADD(b.RDATE,INTERVAL 7 DAY)
FROM tb_borrow b,tb_card c
WHERE c.CNO=b.CNO AND
c.CLASS="C01"

update tb_books set `BNAME` = "计算机会计"
FROM tb_books
Where `BNAME`="会计"

NOTE:

在连表查询的时候极其容易出现数据重复的现象,可以通过 ​group by 字段加以排除

左连接适合于​以左边为依据无则为空的情况


2.3扩展训练

适当的练习,但这篇文章的答案感觉许多地方可以优化,题目可以参照!!!