30000字學完MySql資料庫(安裝、SQL、索引、事務等)
1. 資料庫基本介紹
1.1 什麼是資料庫
資料庫: 用於儲存資料的倉庫. 本質上就是一個檔案系統, 只是需要訪問這個檔案系統需要使用特定的語句(sql)進行操作.
1.2 資料庫的作用
我們開發應用程式的時候,程式中的所有資料,最後都需要儲存到專業軟體中。這些專業的儲存資料的軟體我們稱為資料庫。
我們學習資料庫,並不是學習如何去開發一個資料庫軟體,我們學習的是如何使用資料庫以及資料庫中的資料記錄的操作。而資料庫軟體是由第三方公司研發。
1.3 常見的資料庫
資料庫一般被分為兩大類: 關係型 、非關係型
常見的關係型資料庫軟體:
Oracle: 是Oracle公司的大型關係型資料庫, 收費的
DB2: IBM公司提供的資料庫產品, 收費的
SqlServer: 微軟提供的資料庫產品, 收費的
Sybase: Sybase公司的 , 目前已經過時了, 但其資料庫建模工具(PowerDesign)使用較為廣泛
MySQL: 早期瑞典一個公司發明,後期被sun公司收購,後期被Oracle。
java 中常用的資料庫產品:
MySQL(5.x) 、Oracle、DB2
1.4 什麼是關係型資料庫
在開發軟體的時候,軟體中的資料之間必然會有一定的關係存在,需要把這些資料儲存在資料庫中,同時也要維護資料之間的關係,這時就可以直接使用上述的那些資料庫。而上述的所有資料庫都屬於關係型資料庫。
描述資料之間的關係,並儲存在資料庫中,同時學習如果根據這些關係查詢資料庫中的資料,
關係型資料:設計資料庫的時候,需要使用E-R圖來描述。
E-R:實體關係圖。
實體:可以理解成我們Java程式中的一個物件。在E-R圖中使用 矩形(長方形) 表示。
針對一個實體中的屬性,我們稱為這個實體的資料,在E-R圖中使用 橢圓表示。
實體和實體之間的關係:在E-R圖中使用菱形表示。
ER圖示:
矩形用來表示實體
橢圓用來表示實體的屬性
菱形用來表示之間的關係
2. mysql如何在linux安裝
2.1 vmware中安裝完linux注意事項
2.1.1 防火牆的問題
service iptables stop (立即生效,重啟失效)
chkconfig iptables off (重啟生效,永久關閉防火牆)
2.1.2 軟體安裝統一的管理目錄
安裝包存放位置: mkdir -p /export/software
軟體安裝位置: mkdir -p /export/servers
資料儲存的位置: mkdir -p /export/data
日誌儲存的位置: mkdir -p /export/logs
2.1.3 軟體環境
vmware(12以上)、CRT(連線linux工具)、centos6.9
2.1.4 安裝環境
1、VMware軟體安裝
2、構建虛擬機器
3、需要配置Linux(ip,mac地址,hostname,防火牆),就可以透過crt這個客戶端連線進行操作
4、在linux作業系統進行安裝msyql-5.6
說明:因為在linux作業系統中,安裝軟體的方式主要有3種:
1、原始碼安裝(redis)
2、rpm安裝
3、yum線上安裝 ---linux聯網()
2.2 虛擬機器中安裝MySQL
檢測是否自帶的MySQL
rpm -qa |grep mysql
解除安裝自帶的MySQL
rpm -e --nodeps mysql-libs-5.1.73-8.el6_8.x86_64
上傳mysql的安裝包
建議使用rz進行上傳即可:
下載上傳外掛(下載一次即可): yum -y install lrzsz
使用 rz 命令上傳即可或者直接拖
上傳目錄: /export/software
安裝即可
rpm -ivh *.rpm
檢視初始化密碼:
安裝成功後, 會產生一個隨機密碼, 隨機密碼放置的位置: /root/.mysql_secret
cat /root/.mysql_secret
啟動MySQL並登陸
啟動mysql服務:
service mysql start
登陸mysql:
mysql -uroot -p密碼
(密碼即為檢視到的隨機密碼)
修改密碼
set PASSWORD=PASSWORD('123456');
退出MySQL客戶端
quit;
用新密碼進行登入即可
mysql -uroot -p(新密碼)
遠端授權
grant all privileges on *.* to 'root' @'%' identified by '123456';
flush privileges;
驗證遠端授權是否成功
透過Windows的mysql連線工具連線遠端linux上的mysql, 如果正常連線成功說明授權成功
3. MySQL的基礎操作篇
3.1 登入與退出
登入:
mysql -uroot -p密碼
退出:
quit
3.2 輸入查詢
檢視當前mysql的版本號及當前時間
SELECT VERSION(),CURRENT_DATE();
注意:
1) SQL語句不區分大小寫, 只要單詞寫對了, 即可查詢
使用SQL 可以進行簡單的運算
SELECT SIN(PI()/4), (4+1)*5;
注意:
1) PI() 表示的圓周率 3.141593
2) 計算時如果有小括號, 會先計算小括號裡面的內容
3) SQL語句以分號結尾, 一個分號就代表是一句SQL的結束
select SIN(PI()/4) ; select (4+1)*5; 這是兩句SQL
4) 在進行書寫的時候,如果一條SQL太長, 可以分為多行書寫, 只要不輸入分號, 就不會認為SQL已經結束
5) 寫到一半, 如果不想執行SQL了, 在SQL後面加上\c 然後回車即可
3.3 建立和使用資料庫
檢視當前有那些資料庫
show databases ;
建立資料庫
create databases 資料庫名稱;
使用和切換資料庫
use 資料庫名稱 ;
3.4 建立表及使用
檢視當前資料庫中有那些表
show tables ;
建立一個表
create table 表名 (
欄位名稱(長度) 資料型別 [約束] ,
欄位名稱(長度) 資料型別 [約束] ,
欄位名稱(長度) 資料型別 [約束]
)
例如:
CREATE TABLE pet (
name VARCHAR(20),
owner VARCHAR(20),
species VARCHAR(20),
sex CHAR(1),
birth DATE,
death DATE
);
檢視錶的結構
show create table 表名 ;
desc 表名 ;
第一種:將以上資料整理成SQL語句,insert into pet.... 第二種:透過載入檔案的方式將資料匯入到表中 在表中匯入資料的方式有兩種
在表建立後, 匯入資料
第二種: 在本地建立一個pet.txt檔案, 名稱可以自定義 (注:每個欄位中用tab鍵隔開,欄位沒有值得記錄用\N代替)
檔案的內容:
Fluffy Harold cat f 1993-02-04
Claws Gwen cat m 1994-03-17
Buffy Harold dog f 1989-05-13
Fang Benny dog m 1990-08-27
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11
Whistler Gwen bird \N 1997-12-09 \N
Slim Benny snake m 1996-04-29
執行載入檔案的SQL將其匯入表中:
load data local infile '本地路徑' into table 表名 ;
範例:
load data local infile '/root/pet.txt' into table pet;
檢驗是否已經匯入成功:
select * from 表名 ;
注意:
put -a 檔案路徑 //將指定檔案上傳的伺服器.
示例: put -a D:\compile\pet.txt
rm -rf 檔名 //移除指定的檔案.
示例: rm -rf test01.sql
3.5 資料查詢部分
查詢全部資料
select * from 表名 ;
刪除表中全部資料
delete from 表名 ;
更新表中指定記錄的資料
update 表名 set 欄位名稱1 = 值1,欄位名稱2 = 值2,欄位名稱3 = 值3 where 條件 ;
注意: 如果沒有where條件, 就會對錶中所有的資料進行對應修改
查詢特定的行
select * from 表名 where 欄位名稱 = '值' ;
查詢某個範圍的資料
select * from 表名 where 欄位名稱 >|>=|<|<= 值 ;
select * from 表名 where 欄位名稱 between min and max ;
多條件查詢: and 和 or
select * from 表名 where 條件1 and|or 條件2 and|or (條件3 and|or 條件4) ....;
and: 並列關係, 結果必須是and條件內的資料
or: 或者關係 , 結果如果有展示, 沒有就不展示
如果有括號的, 最佳化執行括號內的資料
查詢返回指定列的資料
select 欄位名稱1,欄位名稱2... from 表名 ;
如果表中有重複資料, 可以將其去重 : distinct
select distinct 欄位名稱1,欄位名稱2... from 表名 ;
排序操作: order by
SELECT *|欄位列表 FROM 表名 ORDER BY 排序欄位1 [排序方式],排序欄位2 [排序方式];
排序方式: desc 和 asc , 預設為升序排序
如果是多個欄位排序, 會先按照第一個欄位進行排序,如果第一個欄位有相同的, 然後在按照第二個欄位排序
日期計算
查詢當前的日期:
select curdate() from pet;
獲取當年的年 :
select YEAR('2018-02-05') AS YEARS from pet;
獲取當年的月
select month('2018-02-05') AS month from pet;
獲取當年的日
select day('2018-02-05') AS day from pet;
計算年齡:
SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet;
is null和 is not null值
SELECT name, birth, death, TIMESTAMPDIFF(YEAR,birth,death) AS age FROM pet WHERE death IS NOT NULL ORDER BY age;
格式: 欄位 is null 篩選這個欄位為null的資料
欄位 is not null 篩選這個欄位不為null的資料
4. 案例
建立表和匯入資料
CREATE TABLE shop (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
dealer CHAR(20) DEFAULT '' NOT NULL,
price DOUBLE(16,2) DEFAULT '0.00' NOT NULL,
PRIMARY KEY(article, dealer)
);
INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
(3,'C',1.69),(3,'D',1.25),(4,'D',19.95);
檢索表中的全部資料
select * from shop;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | A | 3.45 |
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | B | 1.45 |
| 0003 | C | 1.69 |
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+
求某一列的最大值或者最小值
SELECT MAX(article) AS article FROM shop;
+---------+
| article |
+---------+
| 4 |
+---------+
//求某一列的最小值
select min(price) as article from shop;
+---------+
| article |
+---------+
| 1.25 |
+---------+
過濾出某個欄位值最大的整條記錄資料
使用子查詢:
SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop);
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0004 | D | 19.95 |
+---------+--------+-------+
使用自關聯查詢:
SELECT s1.article, s1.dealer, s1.price FROM shop s1 LEFT JOIN shop s2 ON s1.price < s2.price WHERE s2.article IS NULL;
SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1;
求出每一列的最大值,並且根據某一個欄位進行分組--分組topn求法
SELECT article, MAX(price) AS price FROM shop GROUP BY article;
+---------+-------+
| article | price |
+---------+-------+
| 0001 | 3.99 |
| 0002 | 10.99 |
| 0003 | 1.69 |
| 0004 | 19.95 |
+---------+-------+
5. SQL中的聚合函式
SQL語言中定義了部分的函式,可以幫助我們完成對查詢結果的計算操作:
count 統計個數(行數)
sum函式:求和
avg函式:求平均值
max、min 求最大值和最小值
5.1 count函式
語法: select count(*|列名) from 表名;
注意:count在根據指定的列統計的時候,如果這一列中有null 不會被統計在其中。
mysql> select * from pet;
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+--------+---------+------+------------+------------+
8 rows in set (0.00 sec)
mysql> select count(sex) from pet;
+------------+
| count(sex) |
+------------+
| 7 |
+------------+
1 row in set (0.00 sec)
mysql> select count(owner) from pet;
+--------------+
| count(owner) |
+--------------+
| 8 |
+--------------+
1 row in set (0.00 sec)
mysql> select count(death) from pet;
+--------------+
| count(death) |
+--------------+
| 1 |
+--------------+
5.2 sum 函式
語法: select sum(列名) from 表名;
注意事項:
1、如果使用sum 多列進行求和的時候,如果某一列中的有null,這一列所在的行中的其他資料不會被加到總和。
2、可以使用mysql 資料庫提供的函式 ifnull(列名,值)
3、在資料庫中定義double型別資料,是一個近似值,需要確定準確的位數,這時可以把這一列設計成numeric型別。numeric(資料的總列數,小數位數)
mysql> select sum(price) from shop;
+------------+
| sum(price) |
+------------+
| 42.77 |
+------------+
5.3 avg 函式
語法:select avg(列名) from 表名;
mysql> select avg(price) from shop;
+------------+
| avg(price) |
+------------+
| 6.110000 |
+------------+
5.4 max函式
語法:select max(列名) from 表名;
mysql> select max(price) from shop;
+------------+
| max(price) |
+------------+
| 19.95 |
+------------+
5.5 min函式
語法:select min(列名) from 表名;
mysql> select min(price) from shop;
+------------+
| min(price) |
+------------+
| 1.25 |
+------------+
6. SQL分類
6.1 DDL語句 (資料庫定義語言)
對資料庫 表 列 進行操作
檢視資料庫:show database;
建立資料庫 create database 資料庫名;
create database 資料庫名 character set 需要使用的編碼;
查詢建立資料庫語句:show create database 資料庫名;
刪除資料庫 drop database 需要刪除的資料庫名;
檢視當前正在使用的資料庫 select database();
使用資料庫: use 資料庫名
建立表: creat table 表名(欄位名 型別(長度) [約束],欄位名 型別(長度) [約束]..);
檢視錶: show tables;
檢視建立表的語句: show creat table 表名;
檢視錶結構: desc 表名;
刪除表: drop table 表名;
向表中新增欄位: alter table 表名 add 欄位名 型別 [約束];
修改 對欄位進行修改 但不修改欄位名: alter table 表名 modify 欄位名 型別 [約束];
改變 對欄位進行修改 可以修改欄位名: alter table 表名 change 舊欄位名 新欄位名 型別 [約束];
刪除表中的列: alter table 表名 欄位;
修改表名: rename table 舊錶名 to 新表名;
6.2 DML語句(資料庫操作語言)
對資料庫裡的資料進行操作 增 刪 改
如 update, insert, delete
insert into 表名(欄位名,欄位名..) values(值,值,..);
insert into 表名 values(值,值,..);
update 表名 set 欄位=值,欄位=值..where 條件 ;
delete from 表名 where 條件 ;
truncate delete區別:
delete 刪除資料時 自動增長不會清除
truncate刪除資料時 清除自動增長 重寫計數
6.3 DCL語句(資料庫控制語言)
用於設定使用者許可權和控制事務語句
如 grant......
6.4 DQL語句(資料庫查詢語言)
對資料庫進行查詢
select distinct * from 表名 where 條件
group by 分組欄位 having分組完接條件篩選條件
order by 排序
distinct 去掉重複
7. 資料庫的備份與恢復
7.1 備份命令
在mysql的安裝目錄的bin目錄下有mysqldump命令,可以完成對資料庫的備份。
語法:mysqldump -u 使用者名稱 -p 資料庫名> 磁碟SQL檔案路徑
由於mysqldump命令不是sql命令,需要在dos視窗下使用。
注意:在備份資料的時候,資料庫不會被刪除。可以手動刪除資料庫。同時在恢復資料的時候,不會
自動的給我們建立資料庫,僅僅只會恢復資料庫中的表和表中的資料。
例如: mysqldump -uroot -p123456 test01 >/root/data/test01.sql
其中: test01是資料庫的名字
7.2 恢復命令
恢復資料庫,需要手動的先建立資料庫:
create database heima2;
語法:mysql -u 使用者名稱-p 匯入庫名< 硬碟SQL檔案絕對路徑
//恢復命令
mysql -uroot -p123456 itcast</root/data/menagerie.sql
8. 多表查詢
8.1 笛卡爾積介紹
笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y,第一個物件是X的成員而第二個物件是Y的所有可能有序對的其中一個成員
準備資料:
create table A(
A_ID int primary key auto_increment,
A_NAME varchar(20) not null
);
insert into A values(1,'apple');
insert into A values(2,'orange');
insert into A values(3,'banana');
create table B(
A_ID int primary key auto_increment,
B_PRICE double
);
insert into B values(1,2.30);
insert into B values(2,3.50);
insert into B values(4,null);
展示效果:
mysql> select * from A,B;
+------+--------+------+---------+
| A_ID | A_NAME | A_ID | B_PRICE |
+------+--------+------+---------+
| 1 | apple | 1 | 2.3 |
| 2 | orange | 1 | 2.3 |
| 3 | banana | 1 | 2.3 |
| 1 | apple | 2 | 3.5 |
| 2 | orange | 2 | 3.5 |
| 3 | banana | 2 | 3.5 |
| 1 | apple | 4 | NULL |
| 2 | orange | 4 | NULL |
| 3 | banana | 4 | NULL |
+------+--------+------+---------+
作用:笛卡爾積的資料,對程式是沒有意義的,我們需要對笛卡爾積中的資料再次進行過濾。
對於多表查詢操作,需要過濾出滿足條件的資料,需要把多個表進行連線,連線之後需要加上過濾的條件。
8.2 內連線:
顯示內連線:
語法: select * from 表名1 inner join 表名2 on 關聯條件 ;
隱式內連線:
select 列名 , 列名 .... from 表名1,表名2 where 關聯條件;
8.3 外連線:
左外連線: 用左邊表去右邊表中查詢對應記錄,不管是否找到,都將顯示左邊表中全部記錄。
語法:select * from 表1 left outer join 表2 on 條件;
右外連線: 用右邊表去左邊表查詢對應記錄,不管是否找到,右邊表全部記錄都將顯示。
語法:select * from 表1 right outer join 表2 on 條件;
全外連線 左外連線和右外連線的結果合併,單會去掉重複的記錄。
語法: select * from a full outer join b on a.A_ID = b.A_ID;
注意: 但是mysql資料庫不支援此語法。
8.4 關聯子查詢
子查詢:把一個sql的查詢結果作為另外一個查詢的引數存在。
in和exist關鍵詞的用法
關聯子查詢其他的關鍵字使用:
回憶:age=23 or age=24 等價於 age in (23,24)
in 表示條件應該是在多個列值中。
in:使用在where後面,經常表示是一個列表中的資料,只要被查詢的資料在這個列表中存在即可。
mysql> select * from A where A_ID in(1,2,3);
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
+------+--------+
3 rows in set (0.00 sec)
mysql> select * from A where A_ID =1 or A_ID =2 or A_ID =3;
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
+------+--------+
//not in
mysql> select * from A where A_ID not in (1,2,3,4);
Empty set (0.00 sec)
mysql> select * from A where A_ID not in (3,4);
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
+------+--------+
2 rows in set (0.00 sec)
exists:表示存在,當子查詢的結果存在,就會顯示主查詢中的所有資料。
mysql> select * from A where exists(select A_ID from B);
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
+------+--------+
mysql> select * from A where not exists(select A_ID from B);
Empty set (0.00 sec)
union 和union all使用法
UNION 語句:用於將不同表中相同列中查詢的資料展示出來;(不包括重複資料)
UNION ALL 語句:用於將不同表中相同列中查詢的資料展示出來;(包括重複資料)
mysql> select * from A union select * from B;
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
| 1 | 2.3 |
| 2 | 3.5 |
| 4 | NULL |
+------+--------+
6 rows in set (0.00 sec)
mysql> select * from A union all select * from B;
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
| 1 | 2.3 |
| 2 | 3.5 |
| 4 | NULL |
+------+--------+
case when 語句
case when 語句語法結構:
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
準備資料:
//建立表
create table employee(
empid int ,
deptid int ,
sex varchar(20) ,
salary double
);
//載入資料
1 10 female 5500.0
2 10 male 4500.0
3 20 female 1900.0
4 20 male 4800.0
5 40 female 6500.0
6 40 female 14500.0
7 40 male 44500.0
8 50 male 6500.0
9 50 male 7500.0
load data local infile '/root/data/emp.txt' into table employee ;
select *,
case
when salary < 5000 then "低等收入"
when salary>= 5000 and salary < 10000 then "中等收入"
when salary > 10000 then "高等收入"
end as level,
case sex
when "female" then 1
when "male" then 0
end as flag
from employee;
如下程式碼為寵物表的程式碼:
9. mysql資料型別
MySQL中定義資料欄位的型別對你資料庫的最佳化是非常重要的。
MySQL支援多種型別,大致可以分為三類:數值、日期/時間和字串(字元)型別。
9.1 數值型別
MySQL支援所有標準SQL數值資料型別。
這些型別包括嚴格數值資料型別(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值資料型別(FLOAT、REAL和DOUBLE PRECISION)。
關鍵字INT是INTEGER的.同義詞,關鍵字DEC是DECIMAL的同義詞。
BIT資料型別儲存位欄位值,並且支援MyISAM、MEMORY、InnoDB和BDB表。
作為SQL標準的擴充套件,MySQL也支援整數型別TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個整數型別的儲存和範圍。
型別 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 位元組 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 位元組 | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 位元組 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 位元組 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 位元組 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 位元組 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度浮點數值 |
DOUBLE | 8 位元組 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 依賴於M和D的值 | 依賴於M和D的值 | 小數值 |
M表示: 總的資料個數, D表示: 小數點後的精確位數.
DECIMAL(5, 2), 希望獲得的數字一共有5位, 並要求小數點保留兩位.
11123.54321 --> 11123.54
9.2 日期和時間型別
表示時間值的日期和時間型別為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每個時間型別有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
TIMESTAMP型別有專有的自動更新特性,將在後面描述。
型別 | 大小(位元組) | 範圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
9.3 字串型別
字串型別指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些型別如何工作以及如何在查詢中使用這些型別。
型別 | 大小 | 用途 |
---|---|---|
CHAR | 0-255位元組 | 定長字串 |
VARCHAR | 0-65535 位元組 | 變長字串 |
TINYBLOB | 0-255位元組 | 不超過 255 個字元的二進位制字串 |
TINYTEXT | 0-255位元組 | 短文字字串 |
BLOB | 0-65 535位元組 | 二進位制形式的長文字資料 |
TEXT | 0-65 535位元組 | 長文字資料 |
MEDIUMBLOB | 0-16 777 215位元組 | 二進位制形式的中等長度文字資料 |
MEDIUMTEXT | 0-16 777 215位元組 | 中等長度文字資料 |
LONGBLOB | 0-4 294 967 295位元組 | 二進位制形式的極大文字資料 |
LONGTEXT | 0-4 294 967 295位元組 | 極大文字資料 |
CHAR 和 VARCHAR 型別類似,但它們儲存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在儲存或檢索過程中不進行大小寫轉換。
BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進位制字串而不要非二進位制字串。也就是說,它們包含位元組字串而不是字元字串。這說明它們沒有字符集,並且排序和比較基於列值位元組的數值值。
BLOB 是一個二進位制大物件,可以容納可變數量的資料。有 4 種 BLOB 型別:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納儲存範圍不同。
有 4 種 TEXT 型別:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 型別,可儲存的最大長度不同,可根據實際情況選擇。
MySQL 5.0 以上的版本:
1、一個漢字佔多少長度與編碼有關:
UTF-8:一個漢字=3個位元組
GBK:一個漢字=2個位元組
2、varchar(n) 表示 n 個字元,無論漢字和英文,Mysql 都能存入 n 個字元,僅是實際位元組長度有所區別
3、MySQL 檢查長度,可用 SQL 語言來檢視:
select LENGTH(fieldname) from tablename
1、整型
MySQL資料型別 | 含義(有符號) |
---|---|
tinyint(m) | 1個位元組 範圍(-128~127) |
smallint(m) | 2個位元組 範圍(-32768~32767) |
mediumint(m) | 3個位元組 範圍(-8388608~8388607) |
int(m) | 4個位元組 範圍(-2147483648~2147483647) |
bigint(m) | 8個位元組 範圍(+-9.22*10的18次方) |
取值範圍如果加了 unsigned,則最大值翻倍,如 tinyint unsigned 的取值範圍為(0~256)。
int(m) 裡的 m 是表示 SELECT 查詢結果集中的顯示寬度,並不影響實際的取值範圍,沒有影響到顯示的寬度,不知道這個 m 有什麼用。
2、浮點型(float 和 double)
MySQL資料型別 | 含義 |
---|---|
float(m,d) | 單精度浮點型 8位精度(4位元組) m總個數,d小數位 |
double(m,d) | 雙精度浮點型 16位精度(8位元組) m總個數,d小數位 |
設一個欄位定義為 float(5,3),如果插入一個數 123.45678,實際資料庫裡存的是 123.457,但總個數還以實際為準,即 6 位。
3、定點數
浮點型在資料庫中存放的是近似值,而定點型別在資料庫中存放的是精確值。
decimal(m,d) 引數 m<65 是總個數,d<30 且 d<m 是小數位。
m: 表示總個數, 要求最大值64.
d: 表示小數位數,
d<30; 小數位數最多保留: 29個.
4、字串(char,varchar,_text)
MySQL資料型別 | 含義 |
---|---|
char(n) | 固定長度,最多255個字元 |
varchar(n) | 固定長度,最多65535個字元 |
tinytext | 可變長度,最多255個字元 |
text | 可變長度,最多65535個字元 |
mediumtext | 可變長度,最多2的24次方-1個字元 |
longtext | 可變長度,最多2的32次方-1個字元 |
char 和 varchar:
char(n) 若存入字元數小於n,則以空格補於其後,查詢之時再將空格去掉。所以 char 型別儲存的字串末尾不能有空格,varchar 不限於此。
char(n) 固定長度,char(4) 不管是存入幾個字元,都將佔用 4 個位元組,varchar 是存入的實際字元數 +1 個位元組(n<=255)或2個位元組(n>255),所以 varchar(4),存入 3 個字元將佔用 4 個位元組。
char 型別的字串檢索速度要比 varchar 型別的快。
varchar 和 text:
varchar( 可指定 n,text 不能指定,內部儲存 varchar 是存入的實際字元數 +1 個位元組(n<=255)或 2 個位元組(n>255),text 是實際字元數 +2 個位元組。
text 型別不能有預設值。
varchar 可直接建立索引,text 建立索引要指定前多少個字元。varchar 查詢速度快於 text, 在都建立索引的情況下,text 的索引似乎不起作用。
5.二進位制資料(Blob)
BLOB和text儲存方式不同,TEXT以文字方式儲存,英文儲存區分大小寫,而Blob是以二進位制方式儲存,不分大小寫。
BLOB儲存的資料只能整體讀出。
TEXT可以指定字符集,BLOB不用指定字符集。
6.日期時間型別
MySQL資料型別 | 含義 |
---|---|
date | 日期 '2008-12-2' |
time | 時間 '12:25:36' |
datetime | 日期時間 '2008-12-2 22:06:44' |
timestamp | 自動儲存記錄修改時間 |
若定義一個欄位為timestamp,這個欄位裡的時間資料會隨其他欄位修改的時候自動重新整理,所以這個資料型別的欄位可以存放這條記錄最後被修改的時間。
資料型別的屬性
MySQL關鍵字 | 含義 |
---|---|
NULL | 資料列可包含NULL值 |
NOT NULL | 資料列不允許包含NULL值 |
DEFAULT | 預設值 |
PRIMARY KEY | 主鍵 |
AUTO_INCREMENT | 自動遞增,適用於整數型別 |
UNSIGNED | 無符號 |
CHARACTER SET name | 指定一個字符集 |
charset
10. MySQL GROUP BY 語句
GROUP BY 語句根據一個或多個列對結果集進行分組。
在分組的列上我們可以使用 COUNT, SUM, AVG,等函式。
語法結構:
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
準備資料:
CREATE TABLE `employee_tbl` (
`id` int(11) NOT NULL,
`name` char(10) NOT NULL DEFAULT '',
`date` datetime NOT NULL,
`singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登入次數',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小麗', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');
mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
+--------+----------+
| name | COUNT(*) |
+--------+----------+
| 小麗 | 1 |
| 小明 | 3 |
| 小王 | 2 |
+--------+----------+
mysql> select * from employee_tbl;
+----+------+---------------------+--------+
| id | name | date | singin |
+----+------+---------------------+--------+
| 1 | ?? | 2016-04-22 15:25:33 | 1 |
| 2 | ?? | 2016-04-20 15:25:47 | 3 |
| 3 | ?? | 2016-04-19 15:26:02 | 2 |
| 4 | ?? | 2016-04-07 15:26:14 | 4 |
| 5 | ?? | 2016-04-11 15:26:40 | 4 |
| 6 | ?? | 2016-04-04 15:26:54 | 2 |
+----+------+---------------------+--------+
mysql> select * from employee_tbl group by singin;
+----+------+---------------------+--------+
| id | name | date | singin |
+----+------+---------------------+--------+
| 1 | ?? | 2016-04-22 15:25:33 | 1 |
| 3 | ?? | 2016-04-19 15:26:02 | 2 |
| 2 | ?? | 2016-04-20 15:25:47 | 3 |
| 4 | ?? | 2016-04-07 15:26:14 | 4 |
+----+------+---------------------+--------+
注意:
1、group by 可以實現一個最簡單的去重查詢,假設想看下有哪些員工,除了用 distinct,還可以用:
SELECT name FROM employee_tbl GROUP BY name;
返回的結果集就是所有員工的名字。
2、分組後的條件使用 HAVING 來限定,WHERE 是對原始資料進行條件限制。幾個關鍵字的使用順序為 where 、group by 、having、order by ,例如:
SELECT name ,sum(singin) FROM employee_tbl WHERE date>'2015-04-07 15:26:14' GROUP BY name HAVING sum(*)>5 ORDER BY sum(singin) DESC;
11、MySQL LIKE 子句
我們知道在 MySQL 中使用 SQL SELECT 命令來讀取資料, 同時我們可以在 SELECT 語句中使用 WHERE 子句來獲取指定的記錄。
WHERE 子句中可以使用等號 = 來設定獲取資料的條件,如 "company = 'itcast"。
但是有時候我們需要獲取 company 欄位含有 "it" 字元的所有記錄,這時我們就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分號 %字元來表示任意字元。
如果沒有使用百分號 %, LIKE 子句與等號 = 的效果是一樣的。
語法:
以下是 SQL SELECT 語句使用 LIKE 子句從資料表中讀取資料的通用語法:
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND|OR] filed2 = 'somevalue'
你可以在 WHERE 子句中指定任何條件。 你可以在 WHERE 子句中使用LIKE子句。 你可以使用LIKE子句代替等號 =。 LIKE 通常與 ' % 和 _ ' 一同使用,類似於一個字元的模糊搜尋。 你可以使用 AND 或者 OR 指定一個或多個條件。 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句來指定條件。
mysql> select * from pet where species like '%d%';
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+--------+---------+------+------------+------------+
12. MySQL NULL 值處理
我們已經知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句來讀取資料表中的資料,但是當提供的查詢條件欄位為 NULL 時,該命令可能就無法正常工作。
為了處理這種情況,MySQL提供了三大運算子:
IS NULL: 當列的值是 NULL,此運算子返回 true。 IS NOT NULL: 當列的值不為 NULL, 運算子返回 true。 <=>: 比較運算子(不同於=運算子),當比較的的兩個值為 NULL 時返回 true。
關於 NULL 的條件比較運算是比較特殊的。你不能使用 = NULL 或 != NULL 在列中查詢 NULL 值 。
在 MySQL 中,NULL 值與任何其它值的比較(即使是 NULL)永遠返回 false,即 NULL = NULL 返回false 。
MySQL 中處理 NULL 使用 IS NULL 和 IS NOT NULL 運算子。
13. MySQL 後設資料
你可能想知道MySQL以下三種資訊:
查詢結果資訊: SELECT, UPDATE 或 DELETE語句影響的記錄數。 資料庫和資料表的資訊: 包含了資料庫及資料表的結構資訊。 MySQL伺服器資訊: 包含了資料庫伺服器的當前狀態,版本號等。
在MySQL的命令提示符中,我們可以很容易的獲取以上伺服器資訊。
命令 | 描述 |
---|---|
SELECT VERSION( ) | 伺服器版本資訊 |
SELECT DATABASE( ) | 當前資料庫名 (或者返回空) |
SELECT USER( ) | 當前使用者名稱 |
SHOW STATUS | 伺服器狀態 |
SHOW VARIABLES | 伺服器配置變數 |
14 MySQL 函式
MySQL 有很多內建的函式,以下列出了這些函式的說明。
14.1 MySQL 字串函式
函式 | 描述 | 例項 |
---|---|---|
ASCII(s) | 返回字串 s 的第一個字元的 ASCII 碼。 | 返回 CustomerName 欄位第一個字母的 ASCII 碼:SELECT ASCII(CustomerName) AS NumCodeOfFirstCharFROM Customers; |
CHAR_LENGTH(s) | 返回字串 s 的字元數 | 返回字串 itcast 的字元數SELECT CHAR_LENGTH("itcast") AS LengthOfString; |
CHARACTER_LENGTH(s) | 返回字串 s 的字元數 | 返回字串 itcast 的字元數SELECT CHARACTER_LENGTH("itcast") AS LengthOfString; |
CONCAT(s1,s2...sn) | 字串 s1,s2 等多個字串合併為一個字串 | 合併多個字串SELECT CONCAT("SQL ", "itcast ", "Gooogle ", "Facebook") AS ConcatenatedString; |
CONCAT_WS(x, s1,s2...sn) | 同 CONCAT(s1,s2,...) 函式,但是每個字串直接要加上 x,x 可以是分隔符 | 合併多個字串,並新增分隔符:SELECT CONCAT_WS("-", "SQL", "Tutorial", "is", "fun!")AS ConcatenatedString; |
FIELD(s,s1,s2...) | 返回第一個字串 s 在字串列表(s1,s2...)中的位置 | 返回字串 c 在列表值中的位置:SELECT FIELD("c", "a", "b", "c", "d", "e"); |
FIND_IN_SET(s1,s2) | 返回在字串s2中與s1匹配的字串的位置 | 返回字串 c 在指定字串中的位置:SELECT FIND_IN_SET("c", "a,b,c,d,e"); |
FORMAT(x,n) | 函式可以將數字 x 進行格式化 "#,###.##", 將 x 保留到小數點後 n 位,最後一位四捨五入。 | 格式化數字 "#,###.##" 形式:SELECT FORMAT(250500.5634, 2); -- 輸出 250,500.56 |
INSERT(s1,x,len,s2) | 字串 s2 替換 s1 的 x 位置開始長度為 len 的字串 | 從字串第一個位置開始的 6 個字元替換為 itcast:SELECT INSERT("google.com", 1, 6, "runnob"); -- 輸出:itcast.com |
LOCATE(s1,s) | 從字串 s 中獲取 s1 的開始位置 | 獲取 b 在字串 abc 中的位置:SELECT INSTR('abc','b') -- 2 |
LCASE(s) | 將字串 s 的所有字母變成小寫字母 | 字串 itcast 轉換為小寫:SELECT LOWER('itcast') -- itcast |
LEFT(s,n) | 返回字串 s 的前 n 個字元 | 返回字串 itcast 中的前兩個字元:SELECT LEFT('itcast',2) -- it |
LEFT(s,n) | 返回字串 s 的前 n 個字元 | 返回字串 abcde 的前兩個字元:SELECT LEFT('abcde',2) -- ab |
LOCATE(s1,s) | 從字串 s 中獲取 s1 的開始位置 | 返回字串 abc 中 b 的位置:SELECT LOCATE('b', 'abc') -- 2 |
LOWER(s) | 將字串 s 的所有字母變成小寫字母 | 字串 itcast 轉換為小寫:SELECT LOWER('itcast') -- itcast |
LPAD(s1,len,s2) | 在字串 s1 的開始處填充字串 s2,使字串長度達到 len | 將字串 xx 填充到 abc 字串的開始處:SELECT LPAD('abc',5,'xx') -- xxabc |
LTRIM(s) | 去掉字串 s 開始處的空格 | 去掉字串 itcast開始處的空格:SELECT LTRIM(" itcast") AS LeftTrimmedString;-- itcast |
MID(s,n,len) | 從字串 s 的 start 位置擷取長度為 length 的子字串,同 SUBSTRING(s,n,len) | 從字串 itcast 中的第 2 個位置擷取 3個 字元:SELECT MID("itcast", 2, 3) AS ExtractString; -- UNO |
POSITION(s1 IN s) | 從字串 s 中獲取 s1 的開始位置 | 返回字串 abc 中 b 的位置:SELECT POSITION('b' in 'abc') -- 2 |
REPEAT(s,n) | 將字串 s 重複 n 次 | 將字串 itcast 重複三次:SELECT REPEAT('itcast',3) -- itcastitcastitcast |
REPLACE(s,s1,s2) | 將字串 s2 替代字串 s 中的字串 s1 | 將字串 abc 中的字元 a 替換為字元 x:SELECT REPLACE('abc','a','x') --xbc |
REVERSE(s) | 將字串s的順序反過來 | 將字串 abc 的順序反過來:SELECT REVERSE('abc') -- cba |
RIGHT(s,n) | 返回字串 s 的後 n 個字元 | 返回字串 itcast 的後兩個字元:SELECT RIGHT('itcast',2) -- ob |
RPAD(s1,len,s2) | 在字串 s1 的結尾處新增字串 s1,使字串的長度達到 len | 將字串 xx 填充到 abc 字串的結尾處:SELECT RPAD('abc',5,'xx') -- abcxx |
RTRIM(s) | 去掉字串 s 結尾處的空格 | 去掉字串 itcast 的末尾空格:SELECT RTRIM("itcast ") AS RightTrimmedString; -- itcast |
SPACE(n) | 返回 n 個空格 | 返回 10 個空格:SELECT SPACE(10); |
STRCMP(s1,s2) | 比較字串 s1 和 s2,如果 s1 與 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1 | 比較字串:SELECT STRCMP("itcast", "itcast"); -- 0 |
SUBSTR(s, start, length) | 從字串 s 的 start 位置擷取長度為 length 的子字串 | 從字串 itcast 中的第 2 個位置擷取 3個 字元:SELECT SUBSTR("itcast", 2, 3) AS ExtractString; -- UNO |
SUBSTRING(s, start, length) | 從字串 s 的 start 位置擷取長度為 length 的子字串 | 從字串 itcast 中的第 2 個位置擷取 3個 字元:SELECT SUBSTRING("itcast", 2, 3) AS ExtractString; -- UNO |
SUBSTRING_INDEX(s, delimiter, number) | 返回從字串 s 的第 number 個出現的分隔符 delimiter 之後的子串。如果 number 是正數,返回第 number 個字元左邊的字串。如果 number 是負數,返回第(number 的絕對值(從右邊數))個字元右邊的字串。 | SELECT SUBSTRING_INDEX('a*b','*',1) -- aSELECT SUBSTRING_INDEX('a*b','*',-1) -- bSELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1) -- c |
TRIM(s) | 去掉字串 s 開始和結尾處的空格 | 去掉字串 itcast 的首尾空格:SELECT TRIM(' itcast ') AS TrimmedString; |
UCASE(s) | 將字串轉換為大寫 | 將字串 itcast 轉換為大寫:SELECT UCASE("itcast"); -- itcast |
UPPER(s) | 將字串轉換為大寫 | 將字串 itcast 轉換為大寫:SELECT UPPER("itcast"); -- itcast |
14.2 MySQL 數字函式
函式名 | 描述 | 例項 |
---|---|---|
ABS(x) | 返回 x 的絕對值 | 返回 -1 的絕對值:SELECT ABS(-1) -- 返回1 |
ACOS(x) | 求 x 的反餘弦值(引數是弧度) | SELECT ACOS(0.25); |
ASIN(x) | 求反正弦值(引數是弧度) | SELECT ASIN(0.25); |
ATAN(x) | 求反正切值(引數是弧度) | SELECT ATAN(2.5); |
ATAN2(n, m) | 求反正切值(引數是弧度) | SELECT ATAN2(-0.8, 2); |
AVG(expression) | 返回一個表示式的平均值,expression 是一個欄位 | 返回 Products 表中Price 欄位的平均值:SELECT AVG(Price) AS AveragePrice FROM Products; |
CEIL(x) | 返回大於或等於 x 的最小整數 | SELECT CEIL(1.5) -- 返回2 |
CEILING(x) | 返回大於或等於 x 的最小整數 | SELECT CEILING(1.5) -- 返回2 |
COS(x) | 求餘弦值(引數是弧度) | SELECT COS(2); |
COT(x) | 求餘切值(引數是弧度) | SELECT COT(6); |
COUNT(expression) | 返回查詢的記錄總數,expression 引數是一個欄位或者 * 號 | 返回 Products 表中 products 欄位總共有多少條記錄:SELECT COUNT(ProductID) AS NumberOfProducts FROM Products; |
DEGREES(x) | 將弧度轉換為角度 | SELECT DEGREES(3.1415926535898) -- 180 |
n DIV m | 整除,n 為被除數,m 為除數 | 計算 10 除於 5:SELECT 10 DIV 5; -- 2 |
EXP(x) | 返回 e 的 x 次方 | 計算 e 的三次方:SELECT EXP(3) -- 20.085536923188 |
FLOOR(x) | 返回小於或等於 x 的最大整數 | 小於或等於 1.5 的整數:SELECT FLOOR(1.5) -- 返回1 |
GREATEST(expr1, expr2, expr3, ...) | 返回列表中的最大值 | 返回以下數字列表中的最大值:SELECT GREATEST(3, 12, 34, 8, 25); -- 34 返回以下字串列表中的最大值:SELECT GREATEST("Google", "itcast", "Apple"); -- itcast |
LEAST(expr1, expr2, expr3, ...) | 返回列表中的最小值 | 返回以下數字列表中的最小值:SELECT LEAST(3, 12, 34, 8, 25); -- 3 返回以下字串列表中的最小值:SELECT LEAST("Google", "itcast", "Apple"); -- Apple |
LN | 返回數字的自然對數 | 返回 2 的自然對數:SELECT LN(2); -- 0.6931471805599453 |
LOG(x) | 返回自然對數(以 e 為底的對數) | SELECT LOG(20.085536923188) -- 3 |
LOG10(x) | 返回以 10 為底的對數 | SELECT LOG10(100) -- 2 |
LOG2(x) | 返回以 2 為底的對數 | 返回以 2 為底 6 的對數:SELECT LOG2(6); -- 2.584962500721156 |
MAX(expression) | 返回欄位 expression 中的最大值 | 返回資料表 Products 中欄位 Price 的最大值:SELECT MAX(Price) AS LargestPrice FROM Products; |
MIN(expression) | 返回欄位 expression 中的最小值 | 返回資料表 Products 中欄位 Price 的最小值:SELECT MIN(Price) AS LargestPrice FROM Products; |
MOD(x,y) | 返回 x 除以 y 以後的餘數 | 5 除於 2 的餘數:SELECT MOD(5,2) -- 1 |
PI() | 返回圓周率(3.141593) | SELECT PI() --3.141593 |
POW(x,y) | 返回 x 的 y 次方 | 2 的 3 次方:SELECT POW(2,3) -- 8 |
POWER(x,y) | 返回 x 的 y 次方 | 2 的 3 次方:SELECT POWER(2,3) -- 8 |
RADIANS(x) | 將角度轉換為弧度 | 180 度轉換為弧度:SELECT RADIANS(180) -- 3.1415926535898 |
RAND() | 返回 0 到 1 的隨機數 | SELECT RAND() --0.93099315644334 |
ROUND(x) | 返回離 x 最近的整數 | SELECT ROUND(1.23456) --1 |
SIGN(x) | 返回 x 的符號,x 是負數、0、正數分別返回 -1、0 和 1 | SELECT SIGN(-10) -- (-1) |
SIN(x) | 求正弦值(引數是弧度) | SELECT SIN(RADIANS(30)) -- 0.5 |
SQRT(x) | 返回x的平方根 | 25 的平方根:SELECT SQRT(25) -- 5 |
SUM(expression) | 返回指定欄位的總和 | 計算 OrderDetails 表中欄位 Quantity 的總和:SELECT SUM(Quantity) AS TotalItemsOrdered FROM OrderDetails; |
TAN(x) | 求正切值(引數是弧度) | SELECT TAN(1.75); -- -5.52037992250933 |
TRUNCATE(x,y) | 返回數值 x 保留到小數點後 y 位的值(與 ROUND 最大的區別是不會進行四捨五入) | SELECT TRUNCATE(1.23456,3) -- 1.234 |
14.3 MySQL 日期函式
函式名 | 描述 | 例項 |
---|---|---|
ADDDATE(d,n) | 計算其實日期 d 加上 n 天的日期 | SELECT ADDDATE("2017-06-15", INTERVAL 10 DAY);->2017-06-25 |
ADDTIME(t,n) | 時間 t 加上 n 秒的時間 | SELECT ADDTIME('2011-11-11 11:11:11', 5)->2011-11-11 11:11:16 (秒) |
CURDATE() | 返回當前日期 | SELECT CURDATE();-> 2018-09-19 |
CURRENT_DATE() | 返回當前日期 | SELECT CURRENT_DATE();-> 2018-09-19 |
CURRENT_TIME | 返回當前時間 | SELECT CURRENT_TIME();-> 19:59:02 |
CURRENT_TIMESTAMP() | 返回當前日期和時間 | SELECT CURRENT_TIMESTAMP()-> 2018-09-19 20:57:43 |
CURTIME() | 返回當前時間 | SELECT CURTIME();-> 19:59:02 |
DATE() | 從日期或日期時間表示式中提取日期值 | SELECT DATE("2017-06-15"); -> 2017-06-15 |
DATEDIFF(d1,d2) | 計算日期 d1->d2 之間相隔的天數 | SELECT DATEDIFF('2001-01-01','2001-02-02')-> -32 |
DATE_ADD(d,INTERVAL expr type) | 計算起始日期 d 加上一個時間段後的日期 | SELECT ADDDATE('2011-11-11 11:11:11',1)-> 2011-11-12 11:11:11 (預設是天)SELECT ADDDATE('2011-11-11 11:11:11', INTERVAL 5 MINUTE)-> 2011-11-11 11:16:11 (TYPE的取值與上面那個列出來的函式類似) |
DATE_FORMAT(d,f) | 按表示式 f的要求顯示日期 d | SELECT DATE_FORMAT('2011-11-11 11:11:11','%Y-%m-%d %r')-> 2011-11-11 11:11:11 AM |
DATE_SUB(date,INTERVAL expr type) | 函式從日期減去指定的時間間隔。 | Orders 表中 OrderDate 欄位減去 2 天:SELECT OrderId,DATE_SUB(OrderDate,INTERVAL 2 DAY) AS OrderPayDateFROM Orders |
DAY(d) | 返回日期值 d 的日期部分 | SELECT DAY("2017-06-15"); -> 15 |
DAYNAME(d) | 返回日期 d 是星期幾,如 Monday,Tuesday | SELECT DAYNAME('2011-11-11 11:11:11')->Friday |
DAYOFMONTH(d) | 計算日期 d 是本月的第幾天 | SELECT DAYOFMONTH('2011-11-11 11:11:11')->11 |
DAYOFWEEK(d) | 日期 d 今天是星期幾,1 星期日,2 星期一,以此類推 | SELECT DAYOFWEEK('2011-11-11 11:11:11')->6 |
DAYOFYEAR(d) | 計算日期 d 是本年的第幾天 | SELECT DAYOFYEAR('2011-11-11 11:11:11')->315 |
EXTRACT(type FROM d) | 從日期 d 中獲取指定的值,type 指定返回的值。type可取值為:MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEARSECOND_MICROSECONDMINUTE_MICROSECONDMINUTE_SECONDHOUR_MICROSECONDHOUR_SECONDHOUR_MINUTEDAY_MICROSECONDDAY_SECONDDAY_MINUTEDAY_HOURYEAR_MONTH | SELECT EXTRACT(MINUTE FROM '2011-11-11 11:11:11') -> 11 |
ROM_DAYS(n) | 計算從 0000 年 1 月 1 日開始 n 天后的日期 | SELECT FROM_DAYS(1111)-> 0003-01-16 |
HOUR(t) | 返回 t 中的小時值 | SELECT HOUR('1:2:3')-> 1 |
LAST_DAY(d) | 返回給給定日期的那一月份的最後一天 | SELECT LAST_DAY("2017-06-20");-> 2017-06-30 |
LOCALTIME() | 返回當前日期和時間 | SELECT LOCALTIME()-> 2018-09-19 20:57:43 |
LOCALTIMESTAMP() | 返回當前日期和時間 | SELECT LOCALTIMESTAMP()-> 2018-09-19 20:57:43 |
MAKEDATE(year, day-of-year) | 基於給定引數年份 year 和所在年中的天數序號 day-of-year 返回一個日期 | SELECT MAKEDATE(2017, 3);-> 2017-01-03 |
MAKETIME(hour, minute, second) | 組合時間,引數分別為小時、分鐘、秒 | SELECT MAKETIME(11, 35, 4);-> 11:35:04 |
MICROSECOND(date) | 返回日期引數所對應的毫秒數 | SELECT MICROSECOND("2017-06-20 09:34:00.000023");-> 23 |
MINUTE(t) | 返回 t 中的分鐘值 | SELECT MINUTE('1:2:3')-> 2 |
MONTHNAME(d) | 返回日期當中的月份名稱,如 Janyary | SELECT MONTHNAME('2011-11-11 11:11:11')-> November |
MONTH(d) | 返回日期d中的月份值,1 到 12 | SELECT MONTH('2011-11-11 11:11:11')->11 |
NOW() | 返回當前日期和時間 | SELECT NOW()-> 2018-09-19 20:57:43 |
PERIOD_ADD(period, number) | 為 年-月 組合日期新增一個時段 | SELECT PERIOD_ADD(201703, 5); -> 201708 |
PERIOD_DIFF(period1, period2) | 返回兩個時段之間的月份差值 | SELECT PERIOD_DIFF(201710, 201703);-> 7 |
QUARTER(d) | 返回日期d是第幾季節,返回 1 到 4 | SELECT QUARTER('2011-11-11 11:11:11')-> 4 |
SECOND(t) | 返回 t 中的秒鐘值 | SELECT SECOND('1:2:3')-> 3 |
SEC_TO_TIME(s) | 將以秒為單位的時間 s 轉換為時分秒的格式 | SELECT SEC_TO_TIME(4320)-> 01:12:00 |
STR_TO_DATE(string, format_mask) | 將字串轉變為日期 | SELECT STR_TO_DATE("August 10 2017", "%M %d %Y");-> 2017-08-10 |
SUBDATE(d,n) | 日期 d 減去 n 天后的日期 | SELECT SUBDATE('2011-11-11 11:11:11', 1)->2011-11-10 11:11:11 (預設是天) |
SUBTIME(t,n) | 時間 t 減去 n 秒的時間 | SELECT SUBTIME('2011-11-11 11:11:11', 5)->2011-11-11 11:11:06 (秒) |
SYSDATE() | 返回當前日期和時間 | SELECT SYSDATE()-> 2018-09-19 20:57:43 |
TIME(expression) | 提取傳入表示式的時間部分 | SELECT TIME("19:30:10");-> 19:30:10 |
TIME_FORMAT(t,f) | 按表示式 f 的要求顯示時間 t | SELECT TIME_FORMAT('11:11:11','%r')11:11:11 AM |
TIME_TO_SEC(t) | 將時間 t 轉換為秒 | SELECT TIME_TO_SEC('1:12:00')-> 4320 |
TIMEDIFF(time1, time2) | 計算時間差值 | SELECT TIMEDIFF("13:10:11", "13:10:10");-> 00:00:01 |
TIMESTAMP(expression, interval) | 單個引數時,函式返回日期或日期時間表示式;有2個引數時,將引數加和 | SELECT TIMESTAMP("2017-07-23", "13:10:11");-> 2017-07-23 13:10:11 |
TO_DAYS(d) | 計算日期 d 距離 0000 年 1 月 1 日的天數 | SELECT TO_DAYS('0001-01-01 01:01:01')-> 366 |
WEEK(d) | 計算日期 d 是本年的第幾個星期,範圍是 0 到 53 | SELECT WEEK('2011-11-11 11:11:11')-> 45 |
WEEKDAY(d) | 日期 d 是星期幾,0 表示星期一,1 表示星期二 | SELECT WEEKDAY("2017-06-15");-> 3 |
WEEKOFYEAR(d) | 計算日期 d 是本年的第幾個星期,範圍是 0 到 53 | SELECT WEEKOFYEAR('2011-11-11 11:11:11')-> 45 |
YEAR(d) | 返回年份 | SELECT YEAR("2017-06-15");-> 2017 |
YEARWEEK(date, mode) | 返回年份及第幾周(0到53),mode 中 0 表示周天,1表示週一,以此類推 | SELECT YEARWEEK("2017-06-15");-> 201724 |
14.4 MySQL 高階函式
函式名 | 描述 | 例項 |
---|---|---|
BIN(x) | 返回 x 的二進位制編碼 | 15 的 2 進位制編碼:SELECT BIN(15); -- 1111 |
BINARY(s) | 將字串 s 轉換為二進位制字串 | SELECT BINARY "itcast";-> itcast |
CASE expression WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... WHEN conditionN THEN resultN ELSE resultEND | CASE 表示函式開始,END 表示函式結束。如果 condition1 成立,則返回 result1, 如果 condition2 成立,則返回 result2,當全部不成立則返回 result,而當有一個成立之後,後面的就不執行了。 | SELECT CASE WHEN 1 > 0 THEN '1 > 0' WHEN 2 > 0 THEN '2 > 0' ELSE '3 > 0' END->1 > 0 |
CAST(x AS type) | 轉換資料型別 | 字串日期轉換為日期:SELECT CAST("2017-08-29" AS DATE);-> 2017-08-29 |
COALESCE(expr1, expr2, ...., expr_n) | 返回引數中的第一個非空表示式(從左向右) | SELECT COALESCE(NULL, NULL, NULL, 'itcast.com', NULL, 'google.com');-> itcast.com |
CONNECTION_ID() | 返回伺服器的連線數 | SELECT CONNECTION_ID();-> 4292835 |
CONV(x,f1,f2) | 返回 f1 進位制數變成 f2 進位制數 | SELECT CONV(15, 10, 2);-> 1111 |
CONVERT(s USING cs) | 函式將字串 s 的字符集變成 cs | SELECT CHARSET('ABC')->utf-8 SELECT CHARSET(CONVERT('ABC' USING gbk))->gbk |
CURRENT_USER() | 返回當前使用者 | SELECT CURRENT_USER();-> guest@% |
DATABASE() | 返回當前資料庫名 | SELECT DATABASE(); -> itcast |
IF(expr,v1,v2) | 如果表示式 expr 成立,返回結果 v1;否則,返回結果 v2。 | SELECT IF(1 > 0,'正確','錯誤') ->正確 |
IFNULL(v1,v2) | 如果 v1 的值不為 NULL,則返回 v1,否則返回 v2。 | SELECT IFNULL(null,'Hello Word')->Hello Word |
ISNULL(expression) | 判斷表示式是否為空 | SELECT ISNULL(NULL);->1 |
LAST_INSERT_ID() | 返回最近生成的 AUTO_INCREMENT 值 | SELECT LAST_INSERT_ID();->6 |
NULLIF(expr1, expr2) | 比較兩個字串,如果字串 expr1 與 expr2 相等 返回 NULL,否則返回 expr1 | SELECT NULLIF(25, 25);-> |
SESSION_USER() | 返回當前使用者 | SELECT SESSION_USER();-> guest@% |
SYSTEM_USER() | 返回當前使用者 | SELECT SYSTEM_USER();-> guest@% |
USER() | 返回當前使用者 | SELECT USER();-> guest@% |
VERSION() | 返回資料庫的版本號 | SELECT VERSION()-> 5.6.34 |
15. MySQL 索引
MySQL索引的建立對於MySQL的高效執行是很重要的,索引可以大大提高MySQL的檢索速度。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
建立索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實際上,索引也是一張表,該表儲存了主鍵與索引欄位,並指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。
建立索引會佔用磁碟空間的索引檔案。
15.1 普通索引
這是最基本的索引,它沒有任何限制。它有以下幾種建立方式:
建立索引:
格式: CREATE INDEX indexName ON mytable(username(length));
//建立索引
create index id on B(A_ID);
如果是CHAR,VARCHAR型別,length可以小於欄位實際長度;如果是BLOB和TEXT型別,必須指定 length。
修改表結構(新增索引)
格式: ALTER table tableName ADD INDEX indexName(columnName)
建立表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
刪除索引的語法
DROP INDEX [indexName] ON mytable;
15.2 唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:
建立索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表結構
ALTER table mytable ADD UNIQUE [indexName] (username(length))
建立表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
15.3 使用alter命令新增和刪除索引
有四種方式來新增資料表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句新增一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句建立索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。 ALTER TABLE tbl_name ADD INDEX index_name (column_list): 新增普通索引,索引值可出現多次。 **ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):**該語句指定了索引為 FULLTEXT ,用於全文索引。
以下例項為在表中新增索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你還可以在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試以下例項刪除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
15.4 使用alter命令新增和刪除主鍵
主鍵只能在一個表中新增一個,新增主鍵索引時,你需要確保該主鍵預設不為空(NOT NULL)。例項如下:
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (itcast);
你也可以使用 ALTER 命令刪除主鍵:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
刪除主鍵時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。
15.5 顯示索引資訊
你可以使用 SHOW INDEX 命令來列出表中的相關的索引資訊。可以透過新增 \G 來格式化輸出資訊。
嘗試以下例項:
格式: SHOW INDEX FROM table_name; \G
mysql> show index from B;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| B | 0 | PRIMARY | 1 | A_ID | A | 3 | NULL | NULL | | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
16. MySQL 事務
MySQL 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!
在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。 事務用來管理 insert,update,delete 語句
一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、永續性(Durability)。
原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,在中間某個環節不會結束。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。 一致性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。 隔離性:資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(Serializable)。 永續性:事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。
16.1 事務控制語句:
BEGIN或START TRANSACTION;顯式地開啟一個事務; COMMIT;也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對資料庫進行的所有修改成為永久性的; ROLLBACK;有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改; SAVEPOINT identifier;SAVEPOINT允許在事務中建立一個儲存點,一個事務中可以有多個SAVEPOINT; RELEASE SAVEPOINT identifier;刪除一個事務的儲存點,當沒有指定的儲存點時,執行該語句會丟擲一個異常; ROLLBACK TO identifier;把事務回滾到標記點; SET TRANSACTION;用來設定事務的隔離級別。InnoDB儲存引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
16.2 MYSQL 事務處理主要有兩種方法:
1、用 BEGIN, ROLLBACK, COMMIT來實現
BEGIN 開始一個事務 ROLLBACK 事務回滾 COMMIT 事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式:
SET AUTOCOMMIT=0 禁止自動提交 SET AUTOCOMMIT=1 開啟自動提交
16.3、事務併發操作出現幾種問題
所謂事務,是使用者定義的一個資料庫操作序列,是資料庫環境中的邏輯工作單元,是一個不可分割的整體。
事務的這個4個特性簡稱為ACID特性,事務ACID特性可能遭到破壞的因素有:
①多個事務併發執行,不同事務的操作交叉執行;
②事務在執行過程中被強行終止。
如何保證在多個事務併發執行的過程中不發生上述的兩種情況,是資料庫管理系統併發控制的主要責任。
16.4、丟失修改資料
舉例:銀行卡有100元,事務A取10元,事務B取10元,事務AB兩人同時取錢,初始值都是100
16.4.1、讀“髒”資料
資料庫技術中,如果正常提交的事務A使用了事務B未提交的撤銷資料,這種資料成為“髒資料”,會造成資料的髒讀和汙讀。
16.4.2、不一致分析
造成這種資料不一致的主要原因是併發執行的兩個事務中,一個事務在讀取資料時,另一個事務正在修改同一個資料。這樣就可能導致兩個事務的相互干擾及“讀”事務的錯誤執行結果。
16.5、資料庫併發的控制(瞭解部分)
16.5.1、併發排程的可序列化
可序列化準則:多個事務的併發執行時正確的,當且僅當其結果按某一次序序列執行它們時的結果相同,這種排程策略稱為可序列化排程。可序列化是併發事務正確性的準則,一個給定的併發排程,當且僅當它是可序列化的,才認為是正確的。
16.5.2、封鎖
封鎖是實現併發控制的非常重要的技術。封鎖是指某事務在對某資料物件進行操作以前,先請求系統對其加鎖,成功加鎖之後該事務就對該資料物件有了控制權,只有該事務對其進行解鎖之後,其他的事務才能更新它,DBMS有兩種鎖:
① 排它鎖(也稱作X鎖) :可讀可寫
如果事務T在對某個資料物件實施了X鎖,那麼其他的事務必須要等到T事務接觸對該資料物件的X鎖之後,才能對這個資料進行加鎖。
② 共享鎖(也稱作S鎖) :只能進行讀取工作
如果事務T在對某個資料物件實施了S鎖,那麼其他的事務也能對該資料物件實施S鎖,但是對這個資料物件施加的所有S鎖都釋放之前不允許任何事務對該資料物件實施X鎖。
16.5.3、死鎖
封鎖技術可以避免一些併發操作引起的不一致錯誤,但也會產生其他的一些問題,活鎖和死鎖。
① 活鎖
如果某個事務處在永遠等待的狀態,得不到封鎖的機會,這種現象為活鎖,避免這種鎖最好的方法就是採用先來先服務的策略。
② 死鎖
兩個或兩個以上的事務都處於等待狀態每個事務都在等待對方事務接觸封鎖,它才能繼續執行下去,這樣任何事務都處於等待狀態而無法繼續執行的現象稱為死鎖
解決死鎖問題方法有兩類:
A、 死鎖的預防
B、 死鎖的診斷與預防
17. 資料庫編碼
檢視mysql編碼
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
s2) 設定mysql編碼
# vi /etc/my.cnf
如下(少補):
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
sql_mode='NO_ENGINE_SUBSTITUTION'
[mysql]
default-character-set=utf8
重啟mysql
# service mysql restart
再次檢視編碼:
# mysql -uroot -p
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
18. mysql 的目錄及配置檔案
/etc/my.cnf : 這是mysql的主配置檔案
/var/lib/mysql : mysql中資料庫及其資料儲存的目錄
/var/log/mysql(或者直接在/var/lib/mysql) : 資料庫的日誌輸出存放位置
檢視埠。netstat -nltp 看是否能找到3306的埠
19. 資料庫常用術語
19.1 資料模型
資料模型(Data model)是資料庫結構的基礎,是用來描述資料的一組概念和定義,資料模型主要有三個要素:資料結構、資料操作、資料約束條件。
資料結構:物件型別的集合,是對靜態屬性的描述。
資料操作:是對資料庫中的各種物件性資料,允許執行的操作的集合,如增刪改查等;資料操作是對系統動態熱性的描述。
資料的約束條件:是一組完整性規則的集合,也就是說,對於具體的應用必須先遵循特定的語義約束條件。比如:性別只能取 “男”或者“女”中的之一。考試成績:(滿分100)只能是0-100的數值。
19.2 資料庫
資料庫(database)是長期儲存在計算機外存上有結構,可共享的資料集合;資料庫中的資料按照一定的資料模型描述、組織和儲存,具有較小的冗餘度,較高的資料獨立性和可擴充套件性,並可以為多個使用者共享。
常見資料庫分類:
關係型資料庫:如:MySQL,oracle,sqlserver
非關係型資料庫:如:redis,hbase等
19.3 資料庫管理系統
資料庫管理系統(database managerment system, DBMS)是指資料庫系統中對資料庫進行管理的軟體系統,是資料庫系統的核心組成部分。資料庫的一切操作,如增刪改查以及各種控制,都是透過DBMS進行的。
具有以下4個基本的功能:
1、資料定義功能
使用者可以透過DBMS提供的資料定義語言對資料庫的資料進行定義。
2、資料操縱功能
使用者可以透過資料操縱語言實現對資料庫的增刪改查操作
3、資料庫執行管理
管理資料庫的執行是DBMS執行時的核心工作。所有訪問資料庫的操作都要在DBMS的統一管理下進行,以保證資料的安全性、完整性、一致性以及多使用者對資料庫的併發使用。
4、資料庫的建立和維護
建立資料庫,包括資料庫初始資料的輸入與資料轉換等。維護資料庫,包括資料庫的轉儲與恢復,資料庫的重組織,效能監控和分析。
19.4 資料庫系統相關管理人員
資料庫系統的相關人員是資料庫系統的重要組成部分,具體可以分為以下的三類人員
1、資料庫管理員(DBA)
職責:負責資料庫的建立、使用、維護的專門人員
2、應用程式開發人員
職責:開發資料庫應用程式的人員,可以使用資料庫管理系統的所有功能。
3、終端使用者
職責:一般來說,是透過應用程式使用資料庫的人員,終端使用者無需自己編寫應用程式。
19.5 資料庫系統
資料庫系統(database system DBS)是由硬體系統,資料庫管理系統,資料庫,資料庫應用程式,資料庫系統相關人員構成的人-機系統,是指有資料庫的整個計算機系統。
說明:在許多場合下,資料庫,資料庫管理系統,資料庫系統不做嚴格區分;
20 資料庫設計流程
一般對於整個資料庫的設定分為5大部分
明確使用者需求,到底做什麼?
需求分析:
優點: 簡潔明瞭, 描述了各個之間的邏輯關係 獨立於計算機與具體的RDBMS無關。 該階段是整個資料庫設計的關鍵,它透過對使用者需求進行綜合、歸納與抽象。主要是透過E-R圖表示
E-R模型的基本元素:
A、實體(Entity) 如:學生
B、屬性(attribute)如:姓名
C、鍵碼(key)如:身份證號碼;
D、關係(relationship)如:兩個實體之間的關係
a) 一對一(1:1): 一個人一個身份證號碼;一個學校一個校長
b) 一對多(1:n):學校和老師的關係
c) 多對多(n:n):學生選課,一個學生可以選擇多門課程,一門課程課被多名學生進行選修。
概念模型設計:
與具體的資料庫相關,反映出業務部門的需求 規範化處理,儘可能的消除關係操作過程中的異常情況。
邏輯模型設計: 該階段會涉及到更多的概念,方法,理論。
建立資料庫,定義資料庫結構,組織資料入庫,除錯資料庫並進行資料庫的試執行。
資料庫實施:
資料庫正式執行之後,對資料庫執行過程中對其進行評價,調整,修改,調優等。
資料庫的執行和維護:
21 資料庫設計遵循的原則
21.1 正規化概念
概念:正規化就是符合某一規範級別的關係模式的集合。共有7種正規化:
1NF ⊃2NF⊃3NF⊃BCNF⊃4NF⊃5NF⊃6NF
21.2 第一正規化(First Normal Form)
如果一個關係模式R的所有屬性都是不可分割的基本資料項,則這個關係屬於第一正規化。
舉例說明:(學生選課:學號,姓名,系別,系部地址,課程名稱,課程成績)
Student(s_no,s_name,s_dept,s_location,s_course_name,s_grade)
注:1NF是關係模式應具備的最起碼的條件,如果資料庫設計不能滿足第一正規化,就不能稱作是關係模式;關聯式資料庫設計研究的關係規範化是在1NF基礎之上進行的。
21.3 第二正規化(Second Normal Form)
定義:若關係模式R屬於第一正規化,且每個非主屬性都是完全函式依賴於主鍵,則R屬於第二正規化。
說明:從2NF的定義可以看出,從2NF開始討論的是主鍵和非主屬性之間的函式依賴關係,所以分析關係模式是屬於2NF,首先指明關係模式的主鍵,然後在討論非主屬性和主鍵之間的函式依賴關係。
例如:選課關係模式
SC(s_no,c_no,score)中,主鍵為(s_no,c_no),而非主屬性score與主鍵之間不存在部分函式依賴關係,所以關係模式SC屬於2NF
21.4 第三正規化(Third Normal Form)
定義:若關係模式R屬於第一正規化,且每個非主屬性都不傳遞函式依賴於主鍵,則R屬於第三正規化。
說明:3NF說明的是非主屬性和主鍵之間的函式依賴關係
例如:選課關係模式
SC(s_no,c_no,score)中,由於除了主鍵之外,只有一個非主屬性score,所以score不可能構成與主鍵之間的傳遞函式依賴,所以SC屬於3NF
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2925508/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 資料庫-索引注意事項MySql資料庫索引
- MCMySQL 資料庫 索引和事務ktkMySql資料庫索引
- 資料庫事務與 MySQL 事務總結資料庫MySql
- MySQL索引事務MySql索引
- MySQL資料庫本地事務原理MySql資料庫
- MySQL資料庫6:Go與MySQL事務MySql資料庫Go
- MySQL(一):MySQL資料庫事務與鎖MySql資料庫
- 資料庫索引、事務及儲存引擎 (續資料庫索引儲存引擎
- Ubuntu安裝MySQL資料庫UbuntuMySql資料庫
- mysql資料庫全家桶(安裝與如何寫sql,如何使用)MySql資料庫
- 【MySQL】資料庫事務深入分析MySql資料庫
- MySQL資料庫學習筆記02(事務控制,資料查詢)MySql資料庫筆記
- 【資料庫學習】資料庫平臺:mysql,sql server資料庫MySqlServer
- MySQL資料庫之索引MySql資料庫索引
- mysql資料庫的索引MySql資料庫索引
- Linux下安裝Mysql資料庫LinuxMySql資料庫
- 安裝MySQL8資料庫MySql資料庫
- Mysql基礎 --- 索引+事務MySql索引
- MySQL 的索引和事務MySql索引
- 【Mysql】資料庫索引,百萬資料測試索引效果MySql資料庫索引
- 資料庫對比系列之三(PG事務與MySQL事務)資料庫MySql
- 重新學習MySQL資料庫6:淺談MySQL的中事務與鎖MySql資料庫
- Oracl資料庫+PL/SQL安裝與配置資料庫SQL
- MySQL資料庫索引簡介MySql資料庫索引
- MySQL資料庫安裝步驟-WindowsMySql資料庫Windows
- docker 安裝執行mysql資料庫DockerMySql資料庫
- 在FreeBSD中安裝MySQL資料庫MySql資料庫
- 下載和安裝MySQL資料庫MySql資料庫
- MySQL(二):快速理解MySQL資料庫索引MySql資料庫索引
- MySQL 事務、日誌、鎖、索引學習總結,MySql索引
- Mysql資料庫之多表查詢、事務、DCLMySql資料庫
- MySQL資料庫詳解(三)MySQL的事務隔離剖析MySql資料庫
- MS SQL Server資料庫事務鎖機制分析(轉)SQLServer資料庫
- CentOS7離線安裝(rpm安裝)mysql資料庫CentOSMySql資料庫
- MySQL資料庫下載及安裝教程MySql資料庫
- windows server2008安裝mysql資料庫WindowsServerMySql資料庫
- 01 MySQL資料庫安裝(Windows+Mac)MySql資料庫WindowsMac
- PostgreSQL 資料庫學習 - 0. 資料庫安裝SQL資料庫