08、Java--Mysql基礎
Mysql
MySQL基礎
目前常用的資料庫如下:
SQL Server
Oracle
Sum
Mysql
HSQL
PostgreSQL
SQLite
IBM db2
安裝完成Mysql後在dos視窗下使用 mysql -u 賬號 -p 密碼 來連線資料庫。MySQL的資料和手冊:
基礎語法
關係型資料庫需要操作它,需要傳送特定格式的命令,那麼sql語言幾乎是所有關係型資料庫通用的。
名稱 | 說明 |
---|---|
SQL(結構化查詢語言) | SQL是用來存取關係型資料庫的語言,具有查詢、操縱、定義和控制關係型資料庫的四方面功能。 |
DDL(資料定義問題) | 資料定義語音 - Data Definition Language,用來定義資料庫物件,如資料包、檢視、索引等。 |
DML(資料操縱問題) | 資料處理語言 - Data Manipulation Language,在資料庫表中更新、增加和刪除記錄,如:update、insert、delete等。 |
DCL(資料控制問題) | 資料控制語言 - Data Control Language,指用於設定使用者許可權和控制事務語句,如:grant、revoke、if...else、while、begin transation |
DQL(資料查詢問題) | 資料查詢語言 - Data Query Language,如:slect 可以去查詢相關的檔案Mysql5.1_zh.chm,SQL語句不區分大小寫的。 |
對庫操作
預設存在資料庫有四個,不要隨意更改,否則導致資料庫出錯。
其中對庫的操作語法如下:
語句 | 描述 |
---|---|
create database db_name | 建立資料庫 |
show databases | 顯示資料庫語句 |
show create database db_name | 顯示資料庫建立語句。 |
select database() | 檢視當前資料庫。 |
use db_name | 切換資料庫:。 |
drop database db_name | 刪除資料庫。 |
alter database db_name character set 字符集 collate 校對規則 | 修改資料庫。 |
建立一個使用utf8字符集,並帶校對規則的mydb3資料庫:
create database mydb character set utf8 collate utf8_unicode_ci;
對xx表操作
表是二維表,分為行和列,每行對應著一個實體類的例項物件,沒列對應每個實體類的具體的欄位名和型別。
建立表
建立表的語法如下所示:
create table table_name(
field1 datatype,
field2 datatype,
field3 datatype
)
其中datatype表示資料型別:
型別 | 描述 |
---|---|
String、varchar、char | 字串型別。 |
blob、text、mediumblob、mediumtext、longblob、longtext | 大資料型別。 |
tinyint、smallint、int、bigint、float、double | 數值型。 |
bit、0、1 | 邏輯型。 |
date(日期)、time(時間)datatime(日期時間)、timestamp(時間戳) | 日期型 |
注意:mysql語句中的註釋是 --
建立一張表用於測試用:
create table student(
id int(32) primary key auto_increment,
name varchar(32),
age int(32),
gender varchar(16)
);
如下圖所示:
查看錶
語句 | 描述 |
---|---|
show tables | 檢視所有表。 |
show create table 表名 | 查看錶的建立語句。 |
desc 表名 | 查看錶的詳細結構。 |
注:建立表的時候通常會新增額外的約束,這些約束都是為了保證表中的資料的有效性和完整性。
特性 | 描述 |
---|---|
primarey key | 主鍵約束:宣告為主鍵的欄位必須非空,並且不能重複。 |
auto_increment | 主鍵必須是數值型別,表示主鍵自動增長。 |
unique | 唯一約束,欄位必須唯一,但是可以是空。 |
not null | 非空約束:不能為空。 |
修改表
語句 | 描述 |
---|---|
rename table db_name to new_name | 修改表的名稱。 |
change [column] old_col_name column_definition | 修改列的名稱。 |
alter table db_name character set utf8 | 修改表的字元編碼。 |
刪除表
語句 | 描述 |
---|---|
drop table db_name | 刪除表 |
新增一列
alter table 表名 add 欄位名 型別(長度) [約束]
給student表中的學生新增地址列:
alter table student add address varchar(32);
如下圖所示:
修改列型別
alter table 表名 modify 要修改的欄位名 型別(長度) [約束]
修改student表中的name欄位長度為16,且不能為空:
alter table student modify name varchar(16) not null;
如下圖所示:
修改列的名稱
alter table 表名 change 舊列名 新列名 型別(長度) [約束]
修改student表中的address欄位為addr欄位:
alter table student change address addr varchar(32);
如下圖所示:
刪除表的列
alter table 表名 drop 列名
刪除student表中的gender欄位:
alter table student drop gender;
如下圖所示:
修改表名
rename table 表名 to 新表名
修改表的編碼
alter table 表名 character set 編碼
除了可以修改表的字符集之外,還可以檢視當前表的編碼:
操作表記錄
插入記錄
insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……)
insert into 表名 values(值1,值2,值3……)
向表中插入多條資料:
insert into student values(1, 'legend', 22, 'shenzhen');
insert into student values(2, 'vinvent', 25, 'hunan');
insert into student values(3, 'uding', 20, 'yunnan');
如下圖所示:
修改記錄
修改記錄有帶條件和不帶條件等兩種方式:
update 表名 set 欄位名=值, 欄位名=值, 欄位名=值……
update 表名 set欄位名=值, 欄位名=值, 欄位名=值…… where 條件
其中不帶條件的會將表中列下所有記錄都更改。
update student set age=28 where name='uding';
如下圖所示:
刪除記錄
delete from 表名;
delete刪除的時候是一條一條的刪除記錄,它配合事務,可以將刪除的資料找回。id不會重置。
truncate刪除,它是將整個表摧毀,然後再建立一張一模一樣的表。它刪除的資料無法找回。id會重置。
查詢記錄
select [distinct] *| 列名,列名 from 表名 [where條件]
1>檢視年齡為25歲的學生:
2>單獨查詢某些列:
3> 使用表別名查詢所有記錄:
注意:其中as可以被省略。
4>查詢所有的學生,按年齡進行排序(升序、降序)
其中升序是asc,降序是desc。
多條件查詢
1> 查詢學生表中年齡大於20 並且地址在深圳的記錄
2> 查詢學生表中地址在深圳或者湖南的記錄
聚合函式
1> 獲得所有學生的年齡總和
2> 獲得學生的平均年齡
3> 獲得學生的總數
分組操作
1> 首先為學生表新增分類
alter table student add cid varchar(32);
2> 初始化資料,配置不同的cid
3> 根據cid分組,分組統計每組學生的數量
4> 根據cid分組,分組統計每組學生的平均年齡,且年齡大於20歲以上
注意:查詢條件如果是聚合函式,則使用having。
多表設計
外來鍵約束
表是用來儲存現實生活中的資料的,而現實生活中資料和資料之間往往具有一定的關係,我們在使用表來儲存資料時,可以明確的宣告
表和表之前的依賴關係,命令資料庫來幫我們維護這種關係,向這種約束就叫做外來鍵約束。
一對一關係
一對一的關係在實際開發中應用並不多,因為一對一的關係完全可以建立成一張表。
兩種建表原則如下:
1)外來鍵唯一:主表的主鍵和從表的外來鍵唯一,形成主外來鍵關係。
2) 外來鍵是主鍵:主表的主鍵和從表的主鍵,形成主外來鍵關係。
一對多關係
一對多的建表原則是:在從表(多方)建立一個欄位,欄位作為外來鍵指向主表(一方)的主鍵。
我們建立兩張表,分別是分類表和商品表,其中一個分類對應多個商品。
--分類表:
create table category(
cid varchar(32) primary key,
cname varchar(100)
);
--商品表:
create table product(
pid varchar(32) primary key,
pname varchar(40),
price double,
category_id varchar(32)
);
然後分別向分類表和商品表中新增資料:
--分類表
insert into category(cid,cname) values('c001','家電');
insert into category(cid,cname) values('c002','服飾');
insert into category(cid,cname) values('c003','化妝品');
--商品表
insert into product(pid,pname,price,category_id) values('p001','聯想','5000','c001');
insert into product(pid,pname,price,category_id) values('p002','海爾','5000','c001');
insert into product(pid,pname,price,category_id) values('p003','雷神','5000','c001');
insert into product(pid,pname,price,category_id) values('p004','JACK JONES','800','c002');
insert into product(pid,pname,price,category_id) values('p005','真維斯','200','c002');
insert into product(pid,pname,price,category_id) values('p006','花花公子','440','c002');
insert into product(pid,pname,price,category_id) values('p007','勁霸','2000','c002');
insert into product(pid,pname,price,category_id) values('p008','香奈兒','800','c003');
insert into product(pid,pname,price,category_id) values('p009','相宜本草','200','c003');
注意:插入資料如果出現編碼問題,只需要通過set names gbk即可設定編碼。
此時,product和category表是沒有任何關係的,需要設定外來鍵來確定兩張表的關係,將從表categoryid作為外來鍵欄位來對映主表product的cid欄位。
alter table product add foreign key(category_id) references category(cid);
新增外來鍵來確定表之間關係的語法如下:
語法:alter table 從表 add [constraint] [外來鍵名稱] foreign key (從表外來鍵欄位名) references 主表 (主表的外來鍵);
[外來鍵名稱]:用於刪除外來鍵約束的,一般建議_fk結尾。
我們在刪除的時候就可以通過如下語句來刪除外來鍵約束:
alter table 從表 drop foreign key 外來鍵名稱;
多表操作需要注意如下地方:
從表不能夠新增(更新)主表中不存在的資料。
主表不能夠刪除(更新)從表中已經使用的資料。
多對多關係
多對多關係需要建立第三張表作為中間表,中間表中至少有兩個欄位分別作為外來鍵指向各一方的主鍵。其中兩張表都是主表,中間表為從表。
我們建立三張表,分別是訂單表、商品表、訂單項表,其中訂單和商品為多對多關係,訂單項則是中間表指向各方的主鍵。
--商品表
create table product(
pid varchar(32) primary key,
pname varchar(40),
price double,
category_id varchar(32)
);
--訂單表
create table orders(
oid varchar(32) primary key,
totalprice double
);
--訂單項表
create table orderitem(
oid varchar(50),
pid varchar(50)
);
然後我們建立訂單表和商品表的關係,設定聯合主鍵(可省略)
alter table orderitem add primary key(oid,pid);
- 訂單表和訂單項表的主外來鍵關係:
alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);
- 商品表和訂單項表的主外來鍵關係
alter table orderitem add constraint orderitem_product_fk foreign key(pid) references product(pid);
多表查詢
交叉連線查詢
交叉連線查詢得到的是兩個表的乘積,通常稱之為笛卡爾積。
語法:select * from 表一, 表二;
如下圖所示:
內連線查詢
內連線查詢分為隱式內連線和顯示內連線,是取得兩個表中存在連線匹配關係的記錄(交集)。
1> 隱式內連線
語法:select * from A, B where 條件;
2> 顯式內連線
語法:select * from A inner join B on 條件
注意:隱式內連線和顯示內連線查詢到的結果是一樣的,其中顯示內連線中inner關鍵字可以省略。
外連線查詢
外連線查詢分為左外連線和右外連線。其中outer關鍵字可以省略。
- 左外連線
左外連線查詢到的是左表的全部資料和兩張表之間的交集。
語法:select * from A left outer join B on 條件;
- 右外連線
右外連線查詢到的是右表的全部資料和兩張表之間的交集。
語法:select * from A right outer join B on 條件;
子查詢
一條select語句結果作為另一條select語法的一部分。
1> 通過查詢語句查詢到化妝品分類的cid。
2> 將上方查詢語句作為另外一條查詢語句語法的一部分: