1. 程式人生 > >資料庫的深入學習

資料庫的深入學習

首先輸入以下程式碼,創建出幾個表,方便使用
## 學生表
CREATE TABLE student(
	stuid VARCHAR(10) PRIMARY KEY,
	stuname VARCHAR(50)
);

## 分數表
CREATE TABLE score(
	stuid VARCHAR(10),
	score INT,
	courseid INT
);

## 科目表
CREATE TABLE course(
	courseid VARCHAR(10) PRIMARY KEY,
	cname VARCHAR(50)
);

## A表
create table A(
	name varchar(10),
	score int
);

## B表
create table B(
	name varchar(10),
	score int
);

insert into A values('a',10),('b',20),('c',30);
insert into B values('a',10),('b',20),('d',40);

A表如下 在這裡插入圖片描述 B表如下 在這裡插入圖片描述 創建出學生表,新增幾個記錄,如下 在這裡插入圖片描述 創建出科目表,新增幾個記錄,如下 在這裡插入圖片描述 創建出分數表,新增幾個記錄,如下 在這裡插入圖片描述

合併查詢(把兩張表的記錄合併到一起 , 關鍵詞UNION)
  • 取兩張表交集(欄位名資料型別相同)
SELECT * FROM a
UNION ALL
SELECT * FROM b;

在這裡插入圖片描述 注意:出現重複資料,應該把all去掉,正確程式碼如下

SELECT * FROM a
UNION
SELECT * FROM b;

在這裡插入圖片描述

  • 學生表和分數表一起查詢
SELECT * FROM student,score;

在這裡插入圖片描述 注意:出現重複資料,去除重複資料(99查詢法,通過兩張表關聯的欄位相等來去除重複資料)

SELECT * FROM student,score 
WHERE student.stuid=score.stuid;

在這裡插入圖片描述

  • 查詢學生姓名和學生的分數(利用學生表和分數表)
SELECT student.stuname,score.score FROM student,score
WHERE student.stuid=score.stuid;

在這裡插入圖片描述

  • 起別名(多表查詢時不一定要有外來鍵)
SELECT s.stuname,sc.score FROM student s,score sc
WHERE s.stuid=sc.stuid;

在這裡插入圖片描述

  • 同時查詢學生表,分數表和科目表並去除重複
SELECT * FROM student s,score sc,course c 
WHERE s.stuid=sc.stuid
AND
sc.courseid=c.courseid;

在這裡插入圖片描述

  • 查詢學生的名字對應的分數和科目
SELECT s.stuname,sc.score,c.cname FROM student s,score sc,course c 
WHERE s.stuid=sc.stuid
AND
sc.courseid=c.courseid;

在這裡插入圖片描述

  • 查詢表中80分以上學生的姓名,分數和科目資訊
SELECT s.stuname,sc.score,c.cname FROM student s,score sc,course c 
WHERE s.stuid=sc.stuid
AND
sc.courseid=c.courseid
AND sc.score>80;

在這裡插入圖片描述

連結查詢(多表查詢)
分為:內連結,外連結,自然連結
內連結寫法:內連結 表1 INNER(可以省略) JOIN 表2 ON 去除重複的條件
  • 查詢學生表和分數表
SELECT * FROM student s
JOIN
score sc
ON s.stuid=sc.stuid;

在這裡插入圖片描述 查詢學生表,科目表和分數表(注意:on後面只能加去除重複的條件)

SELECT * FROM student s
JOIN
score sc
ON s.stuid=sc.stuid
JOIN
course c
ON sc.courseid=c.courseid
WHERE sc.score>80;
外連線(OUTER JOIN ON)
  • 左外連結left(以左邊那張表為主,會輸出這個表的全部資料)
  • 右外連結right(以右邊那張表為主,會輸出這個表的全部資料)
SELECT * FROM student s
LEFT  JOIN
score sc
ON s.stuid=sc.stuid;

在這裡插入圖片描述

自然連結(NATURAL JOIN)
  • 自動匹配表中關聯條件(欄位名和型別相同)
SELECT * FROM student 
NATURAL JOIN score;

在這裡插入圖片描述

子查詢(巢狀查詢)

首先製作2張表 表名emp 在這裡插入圖片描述 表名dept 在這裡插入圖片描述

  • 查詢工資高於JONES的員工資訊

1.先查Jones工資,查出工資為2975

SELECT sal FROM emp WHERE ename='jones';

2.利用Jones工資當條件,查詢工資高於JONES的員工資訊

SELECT * FROM emp WHERE sal>2975;

3.可以將兩個SQL語句巢狀在一起

SELECT * FROM emp WHERE sal>(
SELECT sal FROM emp WHERE ename='jones'
);

在這裡插入圖片描述

  • 查詢與SCOTT同一個部門的員工
SELECT * FROM emp WHERE deptno=(
SELECT deptno FROM emp WHERE ename='scott'
); 

在這裡插入圖片描述

  • 查詢工資高於30號部門所有人的員工資訊
SELECT * FROM emp WHERE sal>(
SELECT MAX(sal) FROM emp WHERE deptno=30
);

在這裡插入圖片描述

  • 查詢工作和工資與MARTIN(馬丁)完全相同的員工資訊
SELECT * FROM emp WHERE job=(
SELECT job FROM emp WHERE ename='MARTIN'
)AND sal=(
SELECT sal FROM emp WHERE ename='MARTIN'
);

在這裡插入圖片描述

  • 查詢有2個以上直接下屬的員工資訊(mgr這列一共出現幾次,這個人就有幾個下屬)
SELECT * FROM emp WHERE empno in(
SELECT mgr FROM emp GROUP BY mgr HAVING COUNT(mgr)>=2
);

在這裡插入圖片描述

  • 查詢員工編號為7788的員工名稱、員工工資、部門名稱、部門地址
SELECT e.ename,e.sal,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND empno=7788;

在這裡插入圖片描述

自連線
  • 查詢7369員工編號、姓名、經理編號和經理姓名
SELECT e1.empno,e1.ename,e2.empno,e2.ename FROM emp e1,emp e2 
WHERE e1.empno=e2.mgr
AND e2.empno=7369;

在這裡插入圖片描述

  • 查詢各個部門薪水最高的員工所有資訊(將查詢完返回的資料,當做一張新表來使用)
SELECT * FROM emp e1,(
SELECT deptno,MAX(sal) msal FROM emp GROUP BY deptno
)e2 WHERE e1.deptno=e2.deptno
AND e1.sal=e2.msal;

在這裡插入圖片描述

JDBC(Java DataBase Connection)

定義:是java為連線資料庫提供的一套規範(介面) 連線資料庫步驟: 1.載入驅動(註冊驅動類) 2.獲取資料庫連結(通過資料庫賬號密碼) 3.通過資料庫連結物件獲取sql語句的執行物件 4.使用sql執行物件,執行sql語句 5.接收執行sql後,處理結果集 6.關閉資源

製作一個表 在這裡插入圖片描述

用eclipse插入一條資料

	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		// 註冊驅動
		// 使用反射來載入驅動類
		Class.forName("com.mysql.jdbc.Driver");
		// 獲取連結
		// 引數url:資料庫的地址
		// jdbc:mysql://主機ip地址:資料庫埠號/資料庫名
		// jdbc:mysql://localhost:3306/wljdbc01
		String url ="jdbc:mysql://localhost:3306/wljdbc01";
		String user ="root";
		String password ="123456";
		Connection connection = DriverManager.getConnection(url, user, password);
		// 通過資料庫連結物件獲取sql語句的執行物件
		Statement statement = connection.createStatement();
		// 使用sql執行物件 執行sql語句
		// statement.executeLargeUpdate(sql) 執行DDL,DML語句
		// statement.executeQuery(sql)       執行DQL語句
		// 插入一條資料
		String sql = "insert into sort"
				+ "(sname,sprice,sdesc)values"
				+ "('櫃子','30','方便好用包郵')";
		int row = statement.executeUpdate(sql);
		System.out.println("受影響的行數"+row);
		// 關閉資源
		// 關閉連線物件
		connection.close();
		// 關閉sql語句執行物件
		statement.close();
	}