1. 程式人生 > >MySQL快速入門(一)—Java進階學習第十五天

MySQL快速入門(一)—Java進階學習第十五天

文件版本 開發工具 測試平臺 工程名字 日期 作者 備註
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(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 語句總結 :
    • 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庫中的資料,並恢復