文檔版本 | 開發工具 | 測試平臺 | 工程名字 | 日期 | 作者 | 備註 |
---|---|---|---|---|---|---|
V1.0 | 2016.05.09 | lutianfei | none |
數據庫簡介
什麼是數據庫
- 數據庫就是一個文件系統,但是訪問的時候需要使用標準SQL語句來訪問數據。
關係型數據庫
- 存儲的都是
實體
與實體之間的關係
。
- 存儲的都是
ER模型圖
常見的數據庫
- Oracle : 甲骨文公司的數據庫產品,大型的收費的數據庫。
- SQLServer : 微軟公司的數據庫產品,中型的收費的數據庫。
- MySQL : 是開源的,免費的數據庫產品。在5.x版本是免費的,6.x是收費的。
- DB2 : IBM公司的數據庫產品,大型的收費的數據庫。
- SyBASE : 已退出了歷史舞臺,PowerDigener(數據庫建模工具)
MySQL數據庫
MySQL的簡介
MySQL完全卸載
- 找到MySQL的安裝路徑,找到my.ini的配置文件。
- basedir=”C:/Program Files (x86)/MySQL/MySQL Server 5.5/” 安裝的路徑(刪除)
- datadir=”C:/ProgramData/MySQL/MySQL Server 5.5/Data/” MySQL存儲數據的路徑(刪除)
- 通過控制面板卸載MySQL
- 找到上面的兩個路徑,刪除。
MySQL 安裝與配置
注:
- 安裝路徑不要有中文。
- MySQL默認端口是3306,不要修改。
- 設置MySQL的編碼集(採用UTF-8的編碼)
- 要把Include Bin Directory in Windows PATH勾選上。
- 設置用戶名的密碼:兩行都是密碼,第一行是密碼,第二行是確認密碼。
訪問:
- cmd > 輸入命令 mysql -u root -p 回車
- 輸入密碼 回車
密碼重置
1.停止mysql服務:
- services.msc 進入到服務界面
2.在cmd>輸入一個命令:
- mysqld –skip-grant-tables (開啓一個mysql服務,不需要進行認證.)
3.新打開一個cmd窗口
- mysql -u root -p 不需要輸入密碼.就可以進入.
4.輸入命令 show databases;查看數據庫,輸入命令 use mysql;使用mysql數據庫。
- 5.修改密碼的語句:
- update user set password=password(‘root’) WHERE user=’root’;
- 6.將兩個窗口都關閉.
- 7.任務管理器中結束(mysqld)進程.
- 8.重啓mysql服務
MySQL數據庫服務器、數據庫和表關係
- 所謂安裝數據庫服務器,只是在機器上裝了一個數據庫管理程序,這個管理程序可以管理多個數據庫,一般開發人員會針對每一個應用創建一個數據庫。
- 爲保存應用中實體的數據,一般會在數據庫創建多個表,以保存程序中實體的數據。
- 數據庫服務器、數據庫和表的關係如圖所示:
- 1、Java是使用對象封裝數據,例如程序產生了如上所示2個user對象,這些對象的數據要想保存到數據庫中,需要在數據庫中創建與之對應的表,一個user對象中封裝的數據,要保存到數據庫中,一般就要在數據庫中創建一個與之對應的表。
- 2、對象的屬性定義爲表頭,對象的數據對應於表中的一條記錄。
- 3、每個對象對應於表中的一條記錄。
數據在數據庫中的存儲方式
SQL語句(重點)
SQL的簡介
- SQL:Structured Query Language, 結構化查詢語言
- 特點:非過程性語言
過程性語言
:當前的這條語句執行需要依賴於上一條或幾條語句非過程性語言
:寫一條語句,就會執行一個結果。
- 爲加強SQL的語言能力,各廠商增強了過程性語言的特徵
- 如Oracle的PL/SQL 過程性處理能力
- SQL Server、Sybase的T-SQL
- SQL是用來存取關係數據庫的語言,具有查詢、操縱、定義和控制關係型數據庫的四方面功能
SQL語言分類
DDL
(數據定義語言)
- 數據定義語言 - Data Definition Language
- 用來定義數據庫的
對象
,如數據表、視圖、索引等
DML
(數據操縱語言)(重點)
- 數據處理語言 - Data Manipulation Language
- 在數據庫表中更新,增加和刪除記錄
- 如 update, insert, delete
DCL
(數據控制語言)
- 數據控制語言 – Data Control Language
- 指用於設置用戶權限和控制事務語句
- 如grant,revoke,if…else,while,begin transaction
DQL
(數據查詢語言)(重點)
- 數據查詢語言 – Data Query Language
- select
數據庫(CURD – 增刪改查)
創建數據庫
- 語法:
- create database 數據名稱;
- create database 數據庫名稱 character set 編碼 collate 校對規則;
- 校對規則:和編碼是成對出現的
CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype,
)character set 字符集 collate 校對規則
- field:指定列名
datatype:指定列類型
練習
- 創建一個名稱爲mydb1的數據庫。
- create database mydb1;
- 創建一個使用utf8字符集的mydb2數據庫。
- create database mydb2 character set ‘utf8’;
- 創建一個使用utf8字符集,並帶校對規則的mydb3數據庫。
- create database mydb3 character set ‘utf8’ collate ‘utf8_bin’;
查看、刪除數據庫
- 查看數據庫 : show databases;
- 查詢數據庫的定義 : show create database 數據庫;
刪除數據庫 : drop database 數據庫名稱;
練習
- 查看當前數據庫服務器中的所有數據庫
- show databases;
- 查看前面創建的mydb2數據庫的定義信息
- show create database mydb2;
- 刪除前面創建的mydb1數據庫
- drop database mydb1;
修改數據庫
語法:alter database 數據庫 character set 編碼 collate 校對規則;
練習:查看服務器中的數據庫,並把其中某一個庫的字符集修改爲gbk
- alter database mydb2 character set ‘gbk’;
其他的操作
- 切換數據庫 : use db_name;
- 查看當前使用的數據庫 : select database();
數據表(CURD–增刪改查)
創建表
- 語法:
create table 表名(
字段1 類型(長度) 約束,
字段2 類型(長度) 約束,
字段3 類型(長度) 約束,
字段4 類型(長度) 約束
);
- 注意:
- 表名小括號,後面要有分號。
- 每一行字段後面要有逗號,但是最後一行沒有逗號。
- 數據的類型後面有長度,如果是字符串類型,長度必須加。如果其他類型可以不加。默認長度。int 默認長度11
MySQL常用數據類型
字符串型
- VARCHAR、CHAR
- varchar和char區別:
- varchar(經常使用) 長度是可變的。 name varchar(8) 存入數據hello,但是如果存入helloworld報錯了。
- char 長度不可變的。 name char(8) 存入的數據hello,如果不夠用空格補全。
- 效率高:char效果。
大數據類型(一般不用)
- BLOB、TEXT
- BLOB:二進制文件
- TEXT:字符
數值型
- TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
- java 中 byte short int long float double 與之相對應
邏輯性 對應boolean
- BIT
日期型
- DATE、TIME、DATETIME、TIMESTAMP
- date 只包含日期
- time 只包含時分秒
- datetime和timestamp包含日期和時分秒區別:
- datetime需要手動錄入時間。
- timestamp不傳入數據,默認選擇當前系統時間。
練習,創建員工表的練習
create table employee(
id int,
name varchar(20),
gender varchar(10),
birthday date,
entry_date date,
job varchar(100),
salary double,
resume text
);
定義單表字段的約束
主鍵約束(重點)
- 主鍵約束
primary key
: 信息記錄某個字段可以唯一區分其他信息記錄,這個字段就可以是主鍵 (唯一 非空) auto_increment
數據庫維護主鍵。自動增長。- primary key:不允許爲空,不允許重複
- 刪除主鍵:
alter table tablename drop primary key
; - 如果主鍵約束類型爲 數值型 int bigint ,添加auto_increment 自動增長
- 主鍵約束
唯一約束
- 值是唯一的。使用unique聲明
非空約束
- 值不能爲空 not null
創建新的標籤employee2,把約束加上。
create table employee2(
id int primary key auto_increment,
name varchar(20) unique not null,
gender varchar(10) not null,
birthday date not null,
entry_date date not null,
job varchar(100) not null,
salary double not null,
resume text not null
);
查看數據表結構
- desc 表名; 查看錶的信息
- show tables ; 查看當前庫內所有表名
- show create table 表名; 查看建表語句和字符集
刪除表
- 語法:drop table 表名;
- drop table employee2;
修改表
alter table 表名 add 字段 類型(長度) 約束;
– 添加字段alter table 表名 drop 字段;
– 刪除字段alter table 表名 modify 字段 類型(長度) 約束;
– 修改類型或者約束alter table 表名 change 舊字段 新字段 類型(長度) 約束
– 修改字段的名稱rename table 表名 to 新表名;
– 修改表名alter table 表名 character set utf8;
– 修改字符集練習
- 在上面員工表的基本上增加一個image列。
- alter table employee add image varchar(20);
- 修改job列,使其長度爲60。
- alter table employee modify job varchar(60);
- 刪除gender列。
- alter table employee drop gender;
- 表名改爲user。
- rename table employee to user;
- 修改表的字符集爲utf8
- alter table user character set utf8;
- 列名name修改爲username
- alter table user change name username varchar(30);
數據–CRUD語句
添加數據
語法:
insert into 表名 (字段1,字段2,字段3..) values(值1,值2,值3...);
有幾列就插入多少的值。insert into 表名 values(值1,值2,值3...);
插入所有的列
注意:
- 插入的數據應與字段的數據類型相同。
- 數據的大小應在列的規定範圍內,例如:不能將一個長度爲80的字符串加入到長度爲40的列中。
- 在values中列出的數據位置必須與被加入的列的排列位置相對應。
字符
和日期型
數據應包含在單引號''
中。- 插入空值:不指定或insert into table values (null)
練習:
- 向user表中插入數據
insert into user values (1,'xiaofeng','1994-10-10','2011-1-1','HR',19000,'aaa','abc');
insert into user values (2,'美美','1994-10-10','2011-1-1','HR',19000,'aaa','abc');
insert into user values (3,'小風','1994-10-10','2011-1-1','WORKER',21000,'aaa','abc');
insert into user values (4,'芙蓉','1994-10-10','2011-1-1','HR',1000,'aaa','abc');
insert into user values (5,'班長','1994-10-10','2011-1-1','HR',100,'aaa','abc');
- 注意:字符和日期要寫在 單引號中
- show variables like ‘character%’;
- set character_set_results=gbk;或者 set names gbk;
解決中文亂碼的問題(重點)
- 解決方案:通過修改my.ini 修改字符集編碼,重啓MySQL的服務
[client]
port=3306
[mysql]
default-character-set=gbk
- mysql有六處使用了字符集,分別爲:client 、connection、database、results、server 、system。
- client是客戶端使用的字符集。
- connection是連接數據庫的字符集設置類型,如果程序沒有指明連接數據庫使用的字符集類型就按照服務器端默認的字符集設置。
- database是數據庫服務器中某個庫使用的字符集設定,如果建庫時沒有指明,將使用服務器安裝時指定的字符集設置。
- results是數據庫給客戶端返回時使用的字符集設定,如果沒有指明,使用服務器默認的字符集。
- server是服務器安裝時指定的默認字符集設定。
- system是數據庫系統使用的字符集設定。(utf-8不可修改)
修改語句
語法:
update 表名 set 字段=值,字段=值... [where ]
- 如果沒有where條件,默認更新所有的記錄。
- 有where提交,選擇某一條記錄。
- UPDATE語法可以用新值更新原有錶行中的各列。
- SET子句指示要修改哪些列和要給予哪些值。
練習:在上面創建的employee表中修改表中的紀錄。
- 將所有員工薪水修改爲5000元。
- update user set salary=5000;
- 將姓名爲’班長’的員工薪水修改爲3000元。
- update user set salary=3000 where username=’班長’;
- 將姓名爲’美美’的員工薪水修改爲4000元,job改爲BOSS。
- update user set salary=4000,job=’BOSS’ where username=’美美’;
- 將班長的薪水在原有基礎上增加1000元。
- update user set salary = salary+1000 where username=’班長’;
刪除數據
語法:
delete from 表名 [where];
truncate 表名;
刪除所有的數據
truncate 和 delete的區別:
- truncate刪除數據,先刪除整個表。再創建一個新的空的表。(效率)
- delete刪除數據,一條一條刪除的。
- 事物(insert update delete)(後面講)
Delete語句練習
- 刪除表中名稱爲’班長’的記錄。
- delete from user where username=’班長’;
- 刪除表中所有記錄。
- delete from user;
- 使用truncate刪除表中記錄。
- truncate user;
查詢語句
語法:
select * from 表名;
查詢所有(字段)select 字段名1,字段名2,字段名3 from 表名;
顯示查詢字段名select DISTINCT 字段名 from 表名;
去除重複的數據。
select 指定查詢哪些列的數據。
*
號代表查詢所有列。
create table stu(
id int primary key auto_increment,
name varchar(20),
math int,
english int,
chinese int
);
insert into stu values(null,'班長',18,11,62);
insert into stu values(null,'小風',98,91,92);
insert into stu values(null,'美美',68,81,52);
insert into stu values(null,'美女',98,90,65);
- 練習
- 查詢表中所有學生的信息。
- select * from stu;
- 查詢表中所有學生的姓名和對應的英語成績。
- select name,english from stu;
- 過濾表中重複數據。(面試題)
- select distinct english from stu;
select 語句中別名的使用
在select語句中可使用as語句(as 可以省略)
SELECT column as 別名 from 表名;
練習:
- 在所有學生分數上加10分特長分。
- select name,math+10,english+10,chinese+10 from stu;
- 統計每個學生的總分。
- select name,math+english+chinese from stu;
- 使用別名表示學生分數。
- select name,(math+english+chinese) as sum from stu;
使用where條件過濾
- 在where子句中經常使用的運算符
查詢姓名爲班長的學生成績
- select * from stu where name=’班長’;
查詢英語成績大於90分的同學
- select name,english from stu where english < 15;
查詢總分大於200分的所有同學
- select name,math+english+chinese from stu where (math+english+chinese) > 200;
like – 模糊查詢
- 寫法:like ‘張_或者%’;
_
和%
區別:佔位符。_
只一個%
可以有多個%
的寫法 :
- like ‘%張’; 結果XXX張
- like ‘張%’; 結果張XXX
- like ‘%張%’; 只要有張就行
is null – 判斷是否爲null
- and – 並且
- or – 或者
not – 不成立
練習
查詢英語分數在 80-90之間的同學。
select * from stu where english >80 and english <90;
- select * from stu where english between 80 and 90;
查詢數學分數爲18,78,46的同學。(in)
- select * from stu where math in(18,78,46);
查詢所有姓班的學生成績。
- select * from stu where name like ‘班%’;
- 查詢數學分>80 或者 語文分>80的同學。
- select * from stu where math >80 or chinese > 80;
排序
- 使用
order by
升序默認的(asc
)/降序(desc
) - 出現select的語句末尾。
SELECT column1, column2. column3..
FROM table;
order by column asc|desc
- 練習
對數學成績排序後輸出。
- select name,math from stu order by math;
對總分排序按從高到低的順序輸出
- select name,math+english+chinese from stu order by (math+english+chinese) desc;
對學生成績按照英語進行降序排序,英語相同學員按照數學降序
- select * from stu order by english desc,math desc;
對姓美的學生成績排序輸出
- select * from stu where name like ‘美%’ order by english desc;
聚集函數
聚集函數
指SQL語句中內置函數
聚集函數-count
- Count(列名)返回某一列,行的總數
Select count(*)|count(列名) from tablename
[WHERE where_definition]
- 練習:
- 統計一個班級共有多少學生?
- select count(*) from stu;
- 統計數學成績大於90的學生有多少個?
- select count(*) from stu where math > 90;
- 統計總分大於150的人數有多少?
- select count(*) from stu where (math+english+chinese) > 150;
聚集函數-sum
- sum函數返回滿足where條件的列的和(忽略NULL:ifnull(xxx,0)
Select sum(列名){,sum(列名)…} from tablename
[WHERE where_definition]
- 統計一個班級數學總成績?
- select sum(math) from stu;
- 統計一個班級語文、英語、數學各科的總成績
- select sum(math),sum(english),sum(chinese) from stu;
- 統計一個班級語文、英語、數學的成績總和
- select sum(
ifnull(math,0)
+english+chinese) from stu; - select sum(math)+sum(english)+sum(chinese) from stu;
- select sum(
- 統計一個班級語文成績平均分
- select sum(chinese) / count(*) from stu;
聚集函數-AVG
AVG函數返回滿足where條件的一列的平均值
練習:
- 求一個班級數學平均分?
- select avg(math) from stu;
- 求一個班級總分平均分
- select avg(ifnull(math,0)+english+chinese) from stu;
聚集函數-MAX/MIN
- max/min函數返回滿足where條件的一列的最大/最小值
Select max(列名) from tablename
[WHERE where_definition]
- max 最大值
- select max(math) from stu;
- min 最小值
- select min(math) from stu;
聚集函數-GROUP
GROUP BY子句可以將查詢結果按屬性列或屬性列組合在行的方向上進行分組,每組在屬性列或屬性列組合上具有相同的值。
注意,使用GROUP BY 時,SELECT 子句中只能由以下部分組成:
- 彙總函數
- GROUP BY 中出現的列名
- 上面兩個條件通過函數和表達式的結果
- 條件過濾需要是
having
,不能使用where
例如:
- SELECT A_ID ,COUNT(*) FROM C GROUP BY A_ID; =>合法
- SELECT A_DATE,COUNT(*) FROM C GROUP BY A_ID; =>不合法,如圖示中的按A_ID分組後,對於其他各列的查詢只能是彙總查詢,否則沒有意義
練習:對訂單表中商品歸類後,顯示每一類商品的總價
create table orders(
id int,
product varchar(20),
price float
);
insert into orders(id,product,price) values(1,'電視',900);
insert into orders(id,product,price) values(2,'洗衣機',100);
insert into orders(id,product,price) values(3,'洗衣粉',90);
insert into orders(id,product,price) values(4,'桔子',9);
insert into orders(id,product,price) values(5,'洗衣粉',90);
select product,count(*),sum(price) from orders group by product;
- 練習:查詢購買了幾類商品,並且每類總價大於100的商品
- select product,sum(price) from orders group by product
having
sum(price) > 100;
- select product,sum(price) from orders group by product
- select 語句總結 :
S-F-W-G-H-O 組合
- select … from … where … group by… having… order by … ;
- 順序不能改變
備份、恢復數據庫
- 備份數據庫
備份命令
mysql/bin/mysqldump
將數據庫SQL語句導出- 語法:
mysqldump -u 用戶名 -p 數據庫名 > 磁盤SQL文件路徑
- 語法:
例如: 備份day12數據庫 — c:\day12.sql
cmd > mysqldump -u root -p day12 > c:\day12.sql 回車輸入密碼
恢復數據庫(前提創建空的數據庫,並且use)
恢復命令
mysql/bin/mysql
將sql文件導入到數據庫- 語法: mysql -u 用戶名 -p 數據庫名 < 磁盤SQL文件路徑
- 導入SQL 必須手動創建數據庫 ,SQL不會創建數據庫
例如:將c:\day12.sql 導入 day12數據庫
- cmd > mysql -u root -p day12 < c:\day12.sql 回車密碼
補充知識:恢復SQL也可以在數據庫內部執行 source c:\day12.sql
練習
- 備份test庫中的數據,並恢復