1. 程式人生 > >JavaWeb總複習——資料庫基礎

JavaWeb總複習——資料庫基礎

MYSQL的概述

  1. 什麼是資料庫:
    資料庫就是一個檔案系統,需要通過標準SQL語句才能訪問.

  2. 常見的資料庫:

    MYSQL	:開源免費的資料庫,小型的資料庫.已經被Oracle收購了.MySQL6.x版本也開始收費.
    
    Oracle	:收費的大型資料庫.Oracle公司的產品.Oracle收購SUN公司,收購MYSQL.
    
    DB2		:IBM公司的資料庫產品,收費的.銀行系統中.
    
    SQLServer:MS公司.收費的中型的資料庫.
    
    SyBase	:已經淡出歷史舞臺.提供了一個非常專業資料建模的工具PowerDesigner.
    
    SQLite	: 嵌入式的小型資料庫,應用在手機端.
    
    Java相關的資料庫:MYSQL,Oracle.
    
  3. 關係型資料庫:
    資料庫中存的實體和實體之間的關係. 資料庫中存的實體和實體之間的關係.

  4. MYSQL資料庫伺服器

SQL:

結構化查詢語句
作用:
	管理資料庫.

sql的分類:

DDL:資料定義語言
	操作物件:資料庫和表
	關鍵詞:create alter drop
DML:資料操作語言
	操作物件:記錄
DQL:資料查詢語言(非官方)
DCL:資料控制語言
	操作物件:使用者 事務 許可權

登入資料庫:

mysql -uroot  -p密碼

DDL:資料定義語言

	操作物件:資料庫和表
	關鍵詞:create alter drop	
  1. 操作資料庫:

    建立:
    	格式:
    		create database 資料庫名稱;
    刪除:
    	格式:
    		drop database 資料庫名稱;
    常用的命令:
    	檢視所有的資料庫: show databases;
    
  2. 操作表:

  • 建立表

     	格式:
     		create table 表名(欄位描述,欄位描述);
     		欄位描述:
     			欄位名稱 欄位型別 [約束]
     		例如:
     			create table user(
     				id int primary key auto_increment,
     				username varchar(20)
     			);
     			
     			create table user1(
     				id int primary key auto_increment,
     				username varchar(20)
     			);
    
  • 修改表

     	格式:
     		alter table 表名 ....
     	修改表名:
     		alter table 舊錶名 rename to 新表名;
     		例如:
     			alter table user1 rename to user10;
     	新增欄位:
     		alter table 表名 add [column] 欄位描述;
     		例如:
     			alter table user add password varchar(20);
     	修改欄位名:
     		alter table 表名 change 欄位名稱 新欄位描述;
     		例如:
     			alter table user change password pwd varchar(20);
     	修改欄位描述:
     		alter table 表名 modify 欄位名稱 欄位型別 [約束];
     		例如:
     			alter table user modify pwd int;
     	刪除欄位:
     		alter table 表名 drop 欄位名;
     		例如:
     			alter table user drop pwd;
    
  • 刪除表:

     	格式:
     		drop table 表名;
    
  • 常用命令:

     	切換或者進入資料庫: use 資料庫名稱;
     	檢視當前資料庫下所有表: show tables;
     	查看錶結構:desc 表名;
     	檢視建表語句:show create table 表名;
    

DML:資料操作語言

操作物件:記錄(行)
關鍵詞:insert update delete
插入:
	格式1:
		insert into 表名 values(欄位值1,欄位值2...,欄位值n);
		注意:
			預設插入全部欄位,
			必須保證values後面的內容的型別和順序和表結構中的一致
			若欄位型別為數字,可以省略引號
		例如:
			insert into user values(1,'tom');
			insert into user values('2','tom');
			insert into user values('3');-- 錯誤的  
	
	格式2:
		insert into 表名(欄位名,欄位名1...) values(欄位值,欄位值1...);
		注意:
			插入指定的欄位
			必須保證values後面的內容的型別和順序和表名後面的欄位的型別和順序保持一致.
		例如:
			insert into user (username,id) values('jack',4);
			insert into user (username) values('jack',5);-- 錯誤的
		
修改:
	格式:
		update 表名 set 欄位名=欄位值,欄位名1=欄位值1... [where 條件];
	例如:
		update user set username='jerry' where username='jack';
刪除:
	格式:
		delete from 表名 [where 條件];
	例如:
		delete from user where id = '2';

DQL:資料查詢語言

	關鍵詞:select
格式:
	select ... from 表名 where 條件 group by 分組欄位 having 條件 order by 排序欄位 ase|desc

初始化環境:
	-- 建立商品表
	create table products(
		pid int primary key auto_increment,
		pname varchar(20),
		price double,
		pnum int,
		cno int,
		pdate timestamp
	);

	insert into products values (null,'泰國大榴蓮',98,12,1,null);
	insert into products values (null,'新疆大棗',38,123,1,null);
	insert into products values (null,'新疆切糕',68,50,2,null);
	insert into products values (null,'十三香',10,200,3,null);
	insert into products values (null,'老乾媽',20,180,3,null);
	insert into products values (null,'豌豆黃',20,120,2,null);
練習:
  1. 簡單查詢:

    練習:
    1.查詢所有的商品
    	select * from products;
    2.查詢商品名和商品價格.
    	-- 檢視指定的欄位 
    	-- 格式: select 欄位名1,欄位名2 from 表名
    	select pname,price from products;
    3.查詢所有商品都有那些價格.
    	-- 去重操作 distinct
    	-- 格式: select distinct 欄位名,欄位名2 from 表名
    	select price from products;
    	select distinct price from products;
    4.將所有商品的價格+10元進行顯示.(別名)
    	-- 可以在查詢的結果之上進行運算,不影響資料庫中的值
    	-- 給列起別名 格式: 欄位名 [as] 別名
    	select price+10 from products;
    	select price+10 新價格 from products;
    	select price+10 '新價格' from products;
    	select price+10 新 價 格 from products;-- 錯誤
    	select price+10 '新 價 格' from products;
    	select price+10 `新 價 格` from products;
    
  2. 條件查詢:

    練習:
    1.查詢商品名稱為十三香的商品所有資訊:
    	select * from products where pname = '十三香';
    2.查詢商品價格>60元的所有的商品資訊:
    	select * from products where price>60;
    3.查詢商品名稱中包含”新”的商品
    	-- 模糊匹配 
    	--	格式: 欄位名 like "匹配規則";
    	--		匹配內容 %
    					"龍"	值為龍
    					"%龍"	值以"龍"結尾
    					"龍%"	值以"龍"開頭
    					"%龍%" 	值包含"龍"
    	--		匹配個數 "__" 佔兩個位置
    	
    	select * from products where pname like "%新%";
    4.查詢價格為38,68,98的商品
    	select * from products where price = 38 or price = 68 or price=98;
    	select * from products where price in(38,68,98);
    	
    	where後的條件寫法:
    		* > ,<,=,>=,<=,<>,!=
    		* like 使用佔位符 _ 和 %  _代表一個字元 %代表任意個字元. 
    			* select * from product where pname like '%新%';
    		* in在某個範圍中獲得值.
    			* select * from product where pid in (2,5,8);
    		* between 較小值 and 較大值
    			select * from products where price between 50 and 70;
    
  3. 排序查詢:

    1.查詢所有的商品,按價格進行排序.(asc-升序,desc-降序)
    	select * from products order by price desc;
    2.查詢名稱有新的商品的資訊並且按價格降序排序.
    	select * from products where pname like '%新%' order by price  desc;
    
  4. 聚合函式:

    	對一列進行計算 返回值是一個,忽略null值
    * sum(),avg(),max(),min(),count();
    1.獲得所有商品的價格的總和:
    	select sum(price) from products;
    2.獲得商品表中價格的平均數:
    	select avg(price) from products;
    	-- round(值,保留小數位)
    	select round(avg(price),2) from products;
    3.獲得商品表中有多少條記錄:
    	select count(*) from products;
    
  5. 分組:使用group by

    1.根據cno欄位分組,分組後統計商品的個數.
    	select cno,count(*) from products group by cno;
    2.根據cno分組,分組統計每組商品的總數量,並且總數量> 200;
    	select cno,sum(pnum) from products  group by cno;
    	select cno,sum(pnum) from products  group by cno having sum(pnum)>200;
    	注意:
    		where和having區別:
    			1.where 是對分組前的資料進行過濾 ;having 是對分組後的資料進行過濾 
    			2.where 後面不能使用聚合函式,having可以
    

資料型別:(瞭解)

java mysql
byte tinyint
short smallint
int int(★)
long bigint
char/String varchar(★)
boolean tinyint
float/double float/double
java.sql.Date date 日期
java.sql.Time time 時間
java.sql.Timestamp timestamp(★) 時間戳
java.sql.Clob(長文字) mysql的方言(text)
java.sql.Blob(二進位制) blob

約束:

  1. 作用:

    為了保證資料的有效性和完整性
    
  2. mysql中常用的約束:

    主鍵約束(primary key)  
    唯一約束(unique) 
    非空約束(not null) 
    外來鍵約束(foreign key)
    
  3. 主鍵約束:被修飾過的欄位唯一非空

    注意:一張表只能有一個主鍵,這個主鍵可以包含多個欄位
    方式1:建表的同時新增約束 格式: 欄位名稱 欄位型別 primary key
    方式2:建表的同時在約束區域新增約束 
    	所有的欄位宣告完成之後,就是約束區域了
    	格式: primary key(欄位1,欄位2)
    	
    	create table pk01(
    		id int,
    		username varchar(20),
    		primary key (id)
    	);
    	
    	insert into pk01 values(1,'tom');-- 成功
    	insert into pk01 values(1,'tom');-- 失敗 Duplicate entry '1' for key 'PRIMARY'
    	insert into pk01 values(null,'tom');-- 失敗  Column 'id' cannot be null
    	
    	create table pk01(
    		id int primary key,
    		username varchar(20),
    		primary key (id)
    	);-- 錯誤的 一張表只能有一個主鍵
    	
    方式3:建表之後,通過修改表結構新增約束
    	create table pk02(
    		id int,
    		username varchar(20)
    	);
    	
    	alter table pk02 add primary key(欄位名1,欄位名2..);
    	alter table pk02 add primary key(id,username);
    	
    	insert into pk02 values(1,'tom');-- 成功
    	insert into pk02 values(1,'tomcat');-- 成功
    	insert into pk02 values(1,'tomcat');-- 失敗
    
  4. 唯一約束:(瞭解)

    被修飾過的欄位唯一,對null不起作用
    方式1:建表的同時新增約束 格式: 欄位名稱 欄位型別 unique
    	create table un(
    		id int unique,
    		username varchar(20) unique
    	);
    	
    	insert into un value(10,'tom');-- 成功
    	insert into un value(10,'jack');-- 錯誤 Duplicate entry '10' for key 'id'
    	insert into un value(null,'jack');-- 成功
    	insert into un value(null,'rose');-- 成功
    	
    方式2:建表的同時在約束區域新增約束 
    	所有的欄位宣告完成之後,就是約束區域了
    	unique(欄位1,欄位值2...)
    方式3:建表之後,通過修改表結構新增約束
    	alter table 表名 add unique(欄位1,欄位2);-- 新增的聯合唯一
    	alter table 表名 add unique(欄位1);-- 給一個新增唯一
    	alter table 表名 add unique(欄位2);-- 給另一個新增唯一
    	
    		create table un01(
    			id int,
    			username varchar(20)
    		); 
    		alter table un01 add unique(id,username);
    		insert into un01 values(1,'tom');-- 成功
    		insert into un01 values(1,'jack');-- 成功
    		insert into un01 values(1,'tom');-- 失敗  Duplicate entry '1-tom' for key 'id'
    
  5. 非空約束(瞭解)

    特點:被修飾過的欄位非空
    方式:
    	create table nn(
    		id int not null,
    		username varchar(20) not null
    	);
    	
    	insert into nn values(null,'tom');--  錯誤的 Column 'id' cannot be null
    
  6. truncate 清空表 ★
    格式:
    truncate 表名; 幹掉表,重新建立一張空表
    和delete from 區別:
    delete屬於DML語句 truncate屬於DDL語句
    delete逐條刪除 truncate幹掉表,重新建立一張空表

  7. auto_increment 自增

    要求:
    1.被修飾的欄位型別支援自增. 一般int
    2.被修飾的欄位必須是一個key 一般是primary key

    create table ai01(
    id varchar(10) auto_increment
    );-- 錯誤 Incorrect column specifier for column ‘id’

    create table ai01(
    id int auto_increment
    );-- 錯誤 Incorrect table definition; there can be only one auto column and it must be defined as a key

案例2-建立多表,可以描述出表於表之間的關係

  1. 需求:

    把網上商城裡面用的實體建立成表,並且將他們之間建立關係.

  2. 技術分析:

    sql

  3. 網上商城的實體:

    使用者 訂單 商品 分類

  4. 常見關係:

    一對多. 使用者和訂單 分類和商品
    多對多. 訂單和商品 學生和課程
    一對一. 丈夫和妻子

  5. ER圖可以描述實體於實體之間的關係

    實體用矩形表示
    屬性用橢圓表示
    關係用菱形表示
    
  6. 一對多:

    使用者和訂單	
    -- 建立使用者表
    create  table user(
    	id int primary key auto_increment,
    	username varchar(20)
    );
    
    -- 建立訂單表
    create  table orders(
    	id int primary key auto_increment,
    	totalprice double,
    	user_id int
    );
    
    為了保證資料的有效性和完整性,新增約束(外來鍵約束).
    	在多表的一方新增外來鍵約束
    		格式:
    			alter table 多表名稱 add foreign key(外來鍵名稱) references 一表名稱(主鍵);
    		例如:
    			alter table orders add foreign key(user_id) references user(id);
    添加了外來鍵約束之後有如下特點:★
    	1.主表中不能刪除從表中已引用的資料
    	2.從表中不能新增主表中不存在的資料
    開發中處理一對多:★
    	在多表中新增一個外來鍵,名稱一般為主表的名稱_id,欄位型別一般和主表的主鍵的型別保持一致,
    	為了保證資料的有效性和完整性,在多表的外來鍵上新增外來鍵約束即可.
    
  7. 多對多

    例子:商品和訂單
    -- 建立商品表
    create table product(
    	id int primary key auto_increment,
    	name varchar(20),
    	price double
    );
    
    -- 建立中間表
    create table orderitem(
    	oid int,
    	pid int
    );
    
    -- 新增外來鍵約束
    alter table orderitem add foreign key(oid) references orders(id);
    alter table orderitem add foreign key(pid) references product(id);
    
    開發中處理多對多:★
    	引入一張中間表,存放兩張表的主鍵,一般會將這兩個欄位設定為聯合主鍵,這樣就可以將多對多的關係拆分
    	成兩個一對多了
    	為了保證資料的有效性和完整性
    		需要在中間表上新增兩個外來鍵約束即可.
    

案例3-多表查詢

  1. 技術分析:

    內連線
    外連線
    子查詢
    
  2. 笛卡爾積:瞭解

    多張表無條件的聯合查詢.沒有任何意思
    	select a.*,b.* from a,b;
    
  3. 內連線:★

    格式1:顯式的內連線
    	select a.*,b.* from a [inner] join b on ab的連線條件
    格式2:隱式的內連線
    	select a.*,b.* from a,b where ab的連線條件
    
  4. 外連線:★

    左外連線:★
    	select a.*,b.* from a left [outer] join b on 連線條件;
    	意思:
    		先展示join左邊的(a)表的所有資料,根據條件關聯查詢 join右邊的表(b),符合條件則展示出來,不符合以null值展示.
    右外連線:
    	select a.*,b.* from b right [outer] join a on 連線條件;
    	意思:
    		先展示jion右邊的表(a)表的所有資料,根據條件關聯查詢join左邊的表(b),符合條件則展示出來,不符合以null值展示.
    
  5. 子查詢:★

    一個查詢依賴另一個查詢.
    
  6. 練習:

    查詢使用者的訂單,沒有訂單的使用者不顯示
    	隱式內連線:
    		select user.*,orders.* from user ,orders where user.id=orders.user_id;
    	顯示內連線
    		select user.*,orders.* from user join orders on user.id=orders.user_id;
    查詢所有使用者的訂單詳情
    	左外連線: user在左
    		select user.*,orders.* from user left join orders on user.id=orders.user_id;
    查詢所有訂單的使用者詳情
    	右外連線:orders 在右
    		select orders.*,user.* from user right join orders on user.id=orders.user_id;
    
  7. 練習:

    檢視使用者為張三的訂單詳情
    	1.先查詢張三的id
    		select id from User where username = '張三';// 3
    	2.select * from orders where user_id = ?;
    	
    	兩個合二為一
    		select * from orders where user_id = (select id from User where username = '張三');
    查詢出訂單的價格大於300的所有使用者資訊。
    	1.先查詢出訂單價格>300的使用者的id
    		select user_id from orders where price >300;//(3,3,5,null)
    	2.select * from user where id in(3,3,5,null);
    	
    	兩個合二為一:
    		select * from user where id in(select user_id from orders where price >300);
    查詢訂單價格大於300的訂單資訊及相關使用者的資訊。
    	內連線:
    		select orders.*,user.* from orders,user where user.id=orders.user_id  and orders.price>300 ;
    	
    	子查詢:	是將一個查詢的結果作為一張臨時表		
    		select user.*,tmp.* from user,(select * from orders where price>300) as tmp where user.id=tmp.user_id;
    
  8. 給表起別名

    格式: 表 [as] 別名
    
  9. 初始化資料:

    -- 使用者表(user) 
       create table `user` (                                  
    		  `id` int auto_increment primary key,                
    		  `username` varchar(50)  -- 使用者姓名                                                
    		);
    
    -- 訂單表(orders)
       create table `orders` (                                                  
    		  `id` int  auto_increment primary key,                                  
    		  `price` double,                                           
    		  `user_id` int                                       
    		);
    -- 給訂單表新增外來鍵約束
    alter table orders add constraint user_fk foreign key (user_id) references user(id); 
    
    -- 向user表中新增資料
    		insert into user values(3,'張三');
    		insert into user values(4,'李四');
    		insert into user values(5,'王五');
    		insert into user values(6,'趙六');
    
    -- 向orders 表中插入資料
    		insert into orders values(1,1314,3);
    		insert into orders values(2,1314,3);
    		insert into orders values(3,15,4);
    		insert into orders values(4,315,5);
    		insert into orders values(5,1014,null);