Java面向對象(四)學習筆記 JDBC

前言:

JDBC之前 需要先回憶一下SQL語句:
https://www.cnblogs.com/xiaoxi/p/6734025.html

需要注意的是

常用的聚合函數,要做到可以直接寫出來哦

mysql查詢的五種子句,要加以運用

區分好having 和where

 

可以參看一下這篇優秀的博文進行學習。

https://www.cnblogs.com/bypp/p/8618382.html

 

基礎語句練習:
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擴展訓練

https://blog.csdn.net/qq_23501635/article/details/74999980

適當的練習,但這篇文章的答案感覺許多地方可以優化,題目可以參照!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章