数据库Mysql的学习(六)-子查询和多表操作
?
UPDATE readerinfo SET balance = balance-(SELECT price FROM bookinfo WHERE book_id=20150301)*0.05 WHERE card_id ='20121xxxxxx'; //子查詢就是一個嵌套先計算子查詢SELECT * FROM borrow WHERE book_id =(SELECT book_id FROM bookinfo book_name ='xxxxxx')SELECT * FROM bookinfo WHERE price <(SELECT ROUND(AVG(price),2) FROM bookinfo);//顯示小于平均圖書價格的圖書信息SELECT * FROM bookinfo WHERE book_category_id <> (SELECT category_id FROM boiokcategory WHERE category='數據庫');//顯示不是數據庫的圖書信息SELECT * FROM bookinfo WHERE book_category_id = ANY(SELECT category_id FROM bookcategory WHERE parent_id =1);// SELECT * FROM bookinfo WHERE price > ANY (SELECT price FROM bookinfo WHERE book_category_id=4);//any為大于他的最小值SELECT * FROM bookinfo WHERE price > SOME (SELECT price FROM bookinfo WHERE book_category_id=4);//some為大于他的最大值SELECT * FROM bookinfo WHERE book_category_id IN (SELECT category_id FROM bookcategory WHERE parent_id=2)//這時SELECT * FROM bookinfo WHERE book_category_id = ANY (SELECT category_id FROM bookcategory WHERE parent_id=2)//兩句等效內層查詢語句返回的是一個數據列,供外層查詢語句比較操作SELECT * FROM table1 WHERE EXISTS(子查詢)//exist判斷是否存在,存在就執行外查詢CREATE TABLE readerfee(book_id INT,card_id CHAR(18),actul_return_date DATE,book_fee DECIMAL(7,3),PRIMARY KEY(book_id,card_id) ); SELECT book_id ,card_id,return_id FROM borrowinfo WHERE DATEDIFF(SYSDATE(),return_date) >0 AND statue='否';SELECT INTO readerfee(book_id,card_id,return_date) SELECT book_id ,card_id,return_id FROM borrowinfo WHERE DATEDIFF(SYSDATE(),return_date) >0 AND statue='否'; //將一個表中的記錄插入到另一個表中//練習 UPDATE borrowinfo SET STATUS ='是' WHERE book_id =20151101 AND card_id ='20120xxxxx';UPDATE readerfee SET actual_return_date=SYSDATE(),book_fee=DATEDIFF(SYSDATE(),return_date)*0.2 WHERE book_id =20151101 AND card_id='3213100.0xxxx';//多表查詢 SELECT book_id ,book_name,category FROM bookinfo INNER JOIN bookcategory ON bookinfo.book_category_id=bookcategory.category_id; //有內鏈接 外連接和自連接//內鏈接 內鏈接為兩個表都滿足條件的 SELECT borrowinfo.book_id,book_name,borrowinfo.card_id ,NAME,tel,return_date,STATUS FROM borrowinfo INNER JOIN bookinfo ON borrowinfo.book_id = bookinfo.book_id INNER JOIN readerinfo ON borrowinfo.card_id=readerinfo.card_id WHERE borrowinfo.status='否'; SELECT t1.book_id,book_namet1.card_id ,NAME,tel,return_date,STATUS FROM borrowinfo t1 JOIN bookinfo t2 ON t1.book_id = t2.book_id JOIN readerinfo t3 ON t1.card_id=t3.card_id WHERE t1.status='否'; //起個別名這樣也是可以的,inner可以省略。 //ON 后面為內連接的條件//外連接 有左連接和右連接 左連接 顯示左表的全部記錄 右表滿足條件的記錄,右連接同理SELECT book_id ,book_name,category FROM bookcategory LEFT JOIN bookinfo ON bookcategory.category_id =bookinfo.book_category_id; WHERE parent_id<>0;SELECT book_id ,book_name,category FROM bookcategory RIGHT JOIN bookinfo ON bookcategory.category_id =bookinfo.book_category_id; WHERE parent_id<>0;//自連接 SELECT * FROM bookcategorySELECT s.category_id AS '圖書類別編號' ,s.category AS '圖書類別名稱' ,p.category AS '圖書上級分類名稱' FROM bookcategory s LEFT JOIN bookcategory p ON s.parent_id =p.category_id;//多表更新 首先需要把表連接起來 UPDATE readerfee t1 JOIN readerinfo t2 ON t1.card_id=t2.card_id SET actual_return_date =SYSDATE() , bookfee=DATEDIFF(SYSDATE(),return_date)*0.2 , balance=balance-book_fee WHERE t1.book_id =20151101 AND t1.card_id='2002xxxxxxxx'; //表的復制 CREATE TABLE bookcategory_bak AS SELECT * FROM bookcategory; //多表刪除 多表刪除的話要用到多表連接 DELETE xx,xx,FROM (多表連接的東西)?
UPDATE readerinfo SET balance = balance-(SELECT price FROM bookinfo WHERE book_id=20150301)*0.05 WHERE card_id ='20121xxxxxx';
//子查詢就是一個嵌套先計算子查詢
SELECT * FROM borrow WHERE book_id =(SELECT book_id FROM bookinfo book_name ='xxxxxx')
SELECT * FROM bookinfo WHERE price <(SELECT ROUND(AVG(price),2) FROM bookinfo);//顯示小于平均圖書價格的圖書信息
SELECT * FROM bookinfo WHERE book_category_id <> (SELECT category_id FROM boiokcategory WHERE category='數據庫');//顯示不是數據庫的圖書信息
SELECT * FROM bookinfo WHERE book_category_id = ANY(SELECT category_id FROM bookcategory WHERE parent_id =1);//
SELECT * FROM bookinfo WHERE price > ANY (SELECT price FROM bookinfo WHERE book_category_id=4);//any為大于他的最小值
SELECT * FROM bookinfo WHERE price > SOME (SELECT price FROM bookinfo WHERE book_category_id=4);//some為大于他的最大值
SELECT * FROM bookinfo WHERE book_category_id IN (SELECT category_id FROM bookcategory WHERE parent_id=2)//這時
SELECT * FROM bookinfo WHERE book_category_id = ANY (SELECT category_id FROM bookcategory WHERE parent_id=2)//兩句等效內層查詢語句返回的是一個數據列,供外層查詢語句比較操作
SELECT * FROM table1 WHERE EXISTS(子查詢)//exist判斷是否存在,存在就執行外查詢
CREATE TABLE readerfee(
book_id INT,
card_id CHAR(18),
actul_return_date DATE,
book_fee DECIMAL(7,3),
PRIMARY KEY(book_id,card_id)
);
SELECT book_id ,card_id,return_id FROM borrowinfo WHERE DATEDIFF(SYSDATE(),return_date) >0 AND statue='否';
SELECT INTO readerfee(book_id,card_id,return_date) SELECT book_id ,card_id,return_id FROM borrowinfo WHERE DATEDIFF(SYSDATE(),return_date) >0 AND statue='否';
//將一個表中的記錄插入到另一個表中
//練習
UPDATE borrowinfo SET STATUS ='是' WHERE book_id =20151101 AND card_id ='20120xxxxx';
UPDATE readerfee SET actual_return_date=SYSDATE(),book_fee=DATEDIFF(SYSDATE(),return_date)*0.2 WHERE book_id =20151101 AND card_id='3213100.0xxxx';
//多表查詢
SELECT book_id ,book_name,category FROM bookinfo INNER JOIN bookcategory ON bookinfo.book_category_id=bookcategory.category_id;
//有內鏈接 外連接和自連接
//內鏈接
內鏈接為兩個表都滿足條件的
SELECT borrowinfo.book_id,book_name,borrowinfo.card_id ,NAME,tel,return_date,STATUS FROM borrowinfo
INNER JOIN bookinfo ON borrowinfo.book_id = bookinfo.book_id
INNER JOIN readerinfo ON borrowinfo.card_id=readerinfo.card_id
WHERE borrowinfo.status='否';
SELECT t1.book_id,book_namet1.card_id ,NAME,tel,return_date,STATUS FROM borrowinfo t1
JOIN bookinfo t2 ON t1.book_id = t2.book_id
JOIN readerinfo t3 ON t1.card_id=t3.card_id
WHERE t1.status='否'; //起個別名這樣也是可以的,inner可以省略。
//ON 后面為內連接的條件
//外連接 有左連接和右連接
左連接 顯示左表的全部記錄 右表滿足條件的記錄,右連接同理
SELECT book_id ,book_name,category FROM bookcategory
LEFT JOIN bookinfo ON bookcategory.category_id =bookinfo.book_category_id;
WHERE parent_id<>0;
SELECT book_id ,book_name,category FROM bookcategory
RIGHT JOIN bookinfo ON bookcategory.category_id =bookinfo.book_category_id;
WHERE parent_id<>0;
//自連接
SELECT * FROM bookcategory
SELECT s.category_id AS '圖書類別編號' ,s.category AS '圖書類別名稱' ,p.category AS '圖書上級分類名稱' FROM bookcategory s
LEFT JOIN bookcategory p ON s.parent_id =p.category_id;
//多表更新
首先需要把表連接起來
UPDATE readerfee t1 JOIN readerinfo t2 ON t1.card_id=t2.card_id
SET actual_return_date =SYSDATE() , bookfee=DATEDIFF(SYSDATE(),return_date)*0.2 , balance=balance-book_fee
WHERE t1.book_id =20151101 AND t1.card_id='2002xxxxxxxx';
//表的復制
CREATE TABLE bookcategory_bak
AS
SELECT * FROM bookcategory;
//多表刪除
多表刪除的話要用到多表連接
DELETE xx,xx,FROM (多表連接的東西)
?
轉載于:https://www.cnblogs.com/wpbing/p/9204782.html
總結
以上是生活随笔為你收集整理的数据库Mysql的学习(六)-子查询和多表操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 问渠那得清如许为有源头活水来的意思渠的意
- 下一篇: Django启动服务器时,报错mysql