JavaWeb總複習——資料庫基礎
MYSQL的概述
-
什麼是資料庫:
資料庫就是一個檔案系統,需要通過標準SQL語句才能訪問. -
常見的資料庫:
MYSQL :開源免費的資料庫,小型的資料庫.已經被Oracle收購了.MySQL6.x版本也開始收費. Oracle :收費的大型資料庫.Oracle公司的產品.Oracle收購SUN公司,收購MYSQL. DB2 :IBM公司的資料庫產品,收費的.銀行系統中. SQLServer:MS公司.收費的中型的資料庫. SyBase :已經淡出歷史舞臺.提供了一個非常專業資料建模的工具PowerDesigner. SQLite : 嵌入式的小型資料庫,應用在手機端. Java相關的資料庫:MYSQL,Oracle.
-
關係型資料庫:
資料庫中存的實體和實體之間的關係. 資料庫中存的實體和實體之間的關係. -
MYSQL資料庫伺服器
SQL:
結構化查詢語句
作用:
管理資料庫.
sql的分類:
DDL:資料定義語言
操作物件:資料庫和表
關鍵詞:create alter drop
DML:資料操作語言
操作物件:記錄
DQL:資料查詢語言(非官方)
DCL:資料控制語言
操作物件:使用者 事務 許可權
登入資料庫:
mysql -uroot -p密碼
DDL:資料定義語言
操作物件:資料庫和表 關鍵詞:create alter drop
-
操作資料庫:
建立: 格式: create database 資料庫名稱; 刪除: 格式: drop database 資料庫名稱; 常用的命令: 檢視所有的資料庫: show databases;
-
操作表:
-
建立表
格式: 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.查詢所有的商品 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;
-
條件查詢:
練習: 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;
-
排序查詢:
1.查詢所有的商品,按價格進行排序.(asc-升序,desc-降序) select * from products order by price desc; 2.查詢名稱有新的商品的資訊並且按價格降序排序. select * from products where pname like '%新%' order by price desc;
-
聚合函式:
對一列進行計算 返回值是一個,忽略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;
-
分組:使用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 |
約束:
-
作用:
為了保證資料的有效性和完整性
-
mysql中常用的約束:
主鍵約束(primary key) 唯一約束(unique) 非空約束(not null) 外來鍵約束(foreign key)
-
主鍵約束:被修飾過的欄位唯一非空
注意:一張表只能有一個主鍵,這個主鍵可以包含多個欄位 方式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');-- 失敗
-
唯一約束:(瞭解)
被修飾過的欄位唯一,對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'
-
非空約束(瞭解)
特點:被修飾過的欄位非空 方式: create table nn( id int not null, username varchar(20) not null ); insert into nn values(null,'tom');-- 錯誤的 Column 'id' cannot be null
-
truncate 清空表 ★
格式:
truncate 表名; 幹掉表,重新建立一張空表
和delete from 區別:
delete屬於DML語句 truncate屬於DDL語句
delete逐條刪除 truncate幹掉表,重新建立一張空表 -
auto_increment 自增
要求:
1.被修飾的欄位型別支援自增. 一般int
2.被修飾的欄位必須是一個key 一般是primary keycreate 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-建立多表,可以描述出表於表之間的關係
-
需求:
把網上商城裡面用的實體建立成表,並且將他們之間建立關係.
-
技術分析:
sql
-
網上商城的實體:
使用者 訂單 商品 分類
-
常見關係:
一對多. 使用者和訂單 分類和商品
多對多. 訂單和商品 學生和課程
一對一. 丈夫和妻子 -
ER圖可以描述實體於實體之間的關係
實體用矩形表示 屬性用橢圓表示 關係用菱形表示
-
一對多:
使用者和訂單 -- 建立使用者表 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,欄位型別一般和主表的主鍵的型別保持一致, 為了保證資料的有效性和完整性,在多表的外來鍵上新增外來鍵約束即可.
-
多對多
例子:商品和訂單 -- 建立商品表 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-多表查詢
-
技術分析:
內連線 外連線 子查詢
-
笛卡爾積:瞭解
多張表無條件的聯合查詢.沒有任何意思 select a.*,b.* from a,b;
-
內連線:★
格式1:顯式的內連線 select a.*,b.* from a [inner] join b on ab的連線條件 格式2:隱式的內連線 select a.*,b.* from a,b where ab的連線條件
-
外連線:★
左外連線:★ 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值展示.
-
子查詢:★
一個查詢依賴另一個查詢.
-
練習:
查詢使用者的訂單,沒有訂單的使用者不顯示 隱式內連線: 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;
-
練習:
檢視使用者為張三的訂單詳情 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;
-
給表起別名
格式: 表 [as] 別名
-
初始化資料:
-- 使用者表(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);