MySQL篇
今日任務
Ø 完成對MySQL數據庫和表以及表數據的CRUD操作
Ø 完成對系統模型可以分析其中表關係並完成建表操作
Ø 完成對MySQL數據庫的多表查詢及建表操作.
1.1 數據庫整體介紹
【MySQL的概述】
Ø 什麼是數據庫:
數據庫就是一個文件系統,需要通過標準SQL語句才能訪問.
Ø 常見的數據庫:
MySQL :開源免費的數據庫,中小型的數據庫.已經被Oracle收購了.MySQL6.x版本也開始 收費.
Oracle :收費的大型數據庫.Oracle公司的產品.Oracle收購SUN公司
DB2 :IBM公司的數據庫產品,收費的.銀行系統中用的比較多
SQLServer:MS公司.收費的中型的數據庫.
SyBase :已經不用了,但是供了一個非常專業數據建模的工具PowerDesigner.
SQLite : 嵌入式的小型數據庫,應用在手機端,比如android和ios
Java相關的數據庫:MYSQL,Oracle.
Ø 關係型數據庫:
數據庫中存的實體和實體之間的關係.
Ø MySQL數據庫服務器結構
見圖解
【MYSQL的安裝和卸載】
安裝和卸載的過程記錄下服務器安裝的路徑和數據文件存放的路徑.卸載的時候將這個兩個路徑下的文件一併都刪除掉.
如果使用mysql -u root -p不好使,可以將mysql的bin目錄配置到path變量值裏面
【MYSQL的SQL語句】
Ø 什麼是SQL
SQL:結構化查詢語言.
Ø SQL的分類:
※數據定義語言(DDL),例如:CREATE、DROP、ALTER等語句。
※數據操作語言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(刪除)語句。
※ 數據查詢語言(DQL),例如:SELECT語句。(一般不會單獨歸於一類,因爲只有一個語句)。
※數據控制語言(DCL),例如:GRANT、REVOKE等語句。
※事務控制語言(TCL),例如:COMMIT、ROLLBACK等語句。
SQL語言包括四類種主要程序設計語言類別的語句:數據定義語言(DDL),數據操作語言(DML) 及數據控制語言(DCL)還有事務控制語言(TCL)。
1.2 SQL語句的使用
1.2.1 使用SQL語句對數據庫進行CRUD操作
【創建數據庫】
語法:
* createdatabase 數據庫名;
* createdatabase 數據庫名character set 字符集;
【查看數據庫】
* 查看數據庫服務器中的所有的數據庫:show databases;
* 查看某個數據庫的定義的信息:show create database 數據庫名;
【刪除數據庫】
* drop database 數據庫名稱;
【修改數據庫】
* alter database 數據庫名 character set 字符集;
【其他的數據庫操作命令】
* 切換數據庫:use 數據庫名;
* 查看正在使用的數據庫:select database();
1.2.2 使用SQL語句對數據庫中表進行CRUD的操作
【創建表】
create table 表名(
字段名 類型(長度) 約束,
字段名 類型(長度) 約束
);
Java MYSQL
int int
float float
double double
char/String char/varchar(char固定長度字符串,varchar可變長度的字 符串)
Date date,time,datetime,timestamp
文件類型 BLOB、TEXT TEXT指的是文本文件 BLOB二進制文件
單表約束:
* 主鍵約束(一個表中只能有一個主鍵,肯定是唯一的):primary key
* 唯一約束(必須是唯一的,但是一個表中可以有多個):unique
* 非空約束:not null
創建一個商品分類表:
分類id int類型主鍵 自動增長(auto_increment)
分類名稱 字符串類型長度20
create table category(id int primary keyauto_increment,
name varchar(20));
注意:建表之前一定先選擇數據庫
use 數據庫名;
【查看錶】
查看數據庫中的所有表:show tables;
查看錶結構:desc 表名;
查看錶的創建信息:show create table 表名;
【刪除表】
drop table 表名;
【修改表】
alter table 表名 add 列名 類型(長度) 約束; 修改表添加列
alter table 表名 modify 列名類型(長度) 約束; 修改表修改列的類型長度及約束
alter table 表名 change 舊列名新列名 類型(長度) 約束; 修改表列名
alter table 表名 drop 列名; 修改表刪除列
rename table 表名 to 新表名; 修改表名
alter table 表名 character set 字符集; 修改表的字符集
1.2.3 使用SQL語句對錶中的記錄進行CRUD操作
創建商品表:
【插入記錄】
語法:
* insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..); 向表中 插入某些列
* insert into 表 values (值1,值2,值3..); 向表中插入所有列
注意:
* 1.列名數與values後面的值的個數相等
* 2.列的順序與插入的值得數據類型要保持一致
* 3.插入值得時候不能超過最大長度.
* 4.值如果是字符串或者日期需要加’’.
cmd下插入中文的亂碼的解決:
* 修改mysql.ini文件.
* 將[mysql]下面的字符集改爲gbk
* 重啓mysql服務.services.msc
【修改記錄】
語法:
* update 表名 set 字段名=值,字段名=值 [where 條件];
注意:
* 1.列名的類型與修改的值要一致
* 2.修改值得時候不能超過最大長度
* 3.值如果是字符串或者日期需要加’’
#where後的條件寫法:#
* >,<,=,>=,<=,<>
* like 使用佔位符 _ 和 % _代表一個字符 %代表任意個字符.
* in在某個範圍中獲得值.
增加cid這一列:alter table product add cid int;
【刪除記錄】
語法:
* delete from 表名 [where 條件];
注意:刪除表中所有記錄使用delete from 表名; 還是用truncatetable 表名;
* 刪除方式:delete 只是將記錄刪除. 而truncate直接將表結構記錄刪除.
* 事務控制DML(transaction),而delete屬於DML.如果在一個事務中,delete數據,這些數據可以找回.truncate刪除的數據找不回來.
【查詢記錄】
語法:
* select [distinct]*[列名,列名] from 表 [where 條件].
簡單查詢:
* 1.查詢所有的商品:
* 2.查詢商品名和商品價格:
* 3.別名查詢.使用的關鍵字是as.as可以省略的.
* 3.1表別名: select * from product as p;
* 3.2列別名:
* 4.去掉重複值的查詢:
select運算查詢:
* 1.將所有商品的價格+20元進行顯示.
條件查詢:
* 1.查詢商品名稱爲xxx的商品所有信息:
* 2.查詢商品價格>3000元的所有的商品信息:
(order by)排序查詢:
* 1.查詢所有的商品,按價格進行排序.(asc-升序,desc-降序)
* 2.查詢名稱有xxx的商品的信息並且按價格降序排序.
聚合函數:
* sum(),avg(),max(),min(),count();
* 1.獲得所有商品的價格的總和:
* 2.獲得所有商品的平均價格:
* 3.獲得所有商品的個數:
分組查詢:使用group by
* 1.根據cid字段分組,分組後統計商品的個數:
如果使用分組想要加條件進行篩選使用的關鍵字是having
select 列名或者* from 表名 group by 列名 having 條件;
* 2.根據cid分組,分組統計每組商品的平均價格,並且平均價格> 3000:
1.3 SQL創建多表及多表的關係
1.3.1 需求
分類表和商品表之間是不是有關係?如果有關係,在數據庫中如何表示這種關係.
1.3.2 技術分析和使用
【外鍵約束】
多個表之間是有關係的,那麼關係靠誰來維護?
多表約束:
外鍵約束寫法:
alter table product addforeign key (cid) references category(id);
【多表的關係】
Ø 一對多關係:
客戶和訂單,分類和商品...
一對多建表原則:在多的一方創建一個字段,字段作爲外鍵指向一的一方的主鍵.
Ø 多對多關係:
學生和課程...
多對多關係建表原則:需要創建第三張表,中間表中至少兩個字段,這兩個字段分別作爲外鍵指向各自一方的主鍵.
Ø 一對一關係:
在實際的開發中應用不多.因爲一對一可以創建成一張表.
兩種建表原則:
唯一外鍵對應:假設一對一是一個一對多的關係,在多的一方創建一個外鍵指向一的一方的主鍵,將外鍵設置爲unique.
主鍵對應:讓一對一的雙方的主鍵進行建立關係.
1.5 分析商城表關係完成多表的查詢
1.5.1 需求
在商城的案例中很多涉及多表查詢的功能,[我的購物車]
1.5.2 技術分析和使用
【多表查詢】
Ø 交叉連接查詢(基本不會使用-得到的是兩個表的乘積)
語法:
* select * from A,B;
Ø 內連接查詢(使用的關鍵字 inner join -- inner可以省略)
* 隱式內連接:
* select* from A,B where 條件;
* 顯示內連接:
* select * from A inner join B on 條件;
Ø 外連接查詢(使用的關鍵字 outer join -- outer可以省略)
* 左外連接:left outer join
* select* from A left outer join B on 條件;
* 右外連接:right outer join
* select* from A right outer join B on 條件;
【子查詢】
SQL語句的嵌套查詢:查詢“手機產品”分類的商品信息:
首先要查詢"手機產品"的id:
select id from category where name='手機產品';
然後拿id去商品表裏面和cid進行匹配查詢:
select * from product where cid=(select id from category wherename='手機產品');
【練習】
按分類的名稱統計商品的個數:
select c.name,count(*)from category c,product p where c.id=p.cid groupby c.name;
根據訂單的id查詢商品和訂單項的信息:
給你訂單的id=1,查詢這個訂單具有的商品信息
select * from product p,orderItem o where p.id=o.pid and o.oid=1;
【MySQL的分頁查詢】
* select * from product limit a,b; --a:從哪開始,b:查詢多少條.