目錄
⼀、數據庫基本概念
數據庫是存放數據的倉庫。它的存儲空間很⼤,可以存放百萬條、千萬條、上億條數據。但是數據庫並不是隨意地將數據進⾏存放,是有⼀定的規則的,否則查詢的效率會很低。
常⻅的數據庫:
- Oracle - ⽬前世界上使⽤最爲⼴泛的數據庫管理系統,作爲⼀個通⽤的數據庫系統,它具有完整的數據管理功能;作爲⼀個關係數據庫,它是⼀個完備關係的產品;作爲分佈式數據庫,它實現了分佈式處理的功能。在Oracle最新的12c版本中,還引⼊了多承租⽅架構,使⽤該架構可輕鬆部署和管理數據庫雲。
- DB2 - IBM公司開發的、主要運⾏於Unix(包括IBM⾃家的AIX)、 Linux、以及Windows服務器版等系統的關係數據庫產品。 DB2歷史悠久且被認爲是最早使⽤SQL的數據庫產品,它擁有較爲強⼤的商業智能功能。
- SQL Server - 由Microsoft開發和推⼴的關係型數據庫產品,最初適⽤於中⼩企業的數據管理,但是近年來它的應⽤範圍有所擴展,部分⼤企業甚⾄是跨國公司也開始基於它來構建⾃⼰的數據管理系統。
- MySQL - MySQL是開放源代碼的,任何⼈都可以在GPL(General PublicLicense)的許可下下載並根據個性化的需要對其進⾏修改。 MySQL因爲其速度、可靠性和適應性⽽備受關注。
- PostgreSQL - 在BSD許可證下發⾏的開放源代碼的關係數據庫產品。
MySQL簡介
MySQL最早是由瑞典的MySQL AB公司開發的⼀個開放源碼的關係數據庫管理系統,該公司於2008年被昇陽微系統公司(Sun Microsystems)收購。在2009年,甲⻣⽂公司(Oracle)收購昇陽微系統公司,因此在這之後MySQL成爲了Oracle旗下產品。
MySQL在過去由於性能⾼、成本低、可靠性好,已經成爲最流⾏的開源數據庫,因此被⼴泛地應⽤於中⼩型⽹站開發。隨着MySQL的不斷成熟,它也逐漸被應⽤於更多⼤規模⽹站和應⽤,⽐如維基百科、⾕歌(Google)、臉書(Facebook)、淘寶⽹等⽹站都使⽤了MySQL來提供數據持久化服務。
甲⻣⽂公司收購後昇陽微系統公司,⼤幅調漲MySQL商業版的售價,且甲⻣⽂公司不再⽀持另⼀個⾃由軟件項⽬OpenSolaris的發展,因此導致⾃由軟件社區對於Oracle是否還會持續⽀持MySQL社區版(MySQL的各個發⾏版本中唯⼀免費的版本)有所擔憂, MySQL的創始⼈⻨克爾·維德紐斯以MySQL爲基礎,成⽴分⽀計劃MariaDB(以他⼥⼉的名字命名的數據庫)。有許多原來使⽤MySQL數據庫的公司(例如:維基百科)已經陸續完成了從MySQL數據庫到MariaDB數據庫的遷移。
mysql的安裝
linux下
windows下安裝
參考https://blog.csdn.net/qq_41080850/article/details/97495643
在實際開發中,爲了⽅便⽤戶操作,可以選擇圖形化的客戶端⼯具來連接MySQL
服務器,包括:
MySQL Workbench(官⽅提供的⼯具)
Navicat for MySQL(界⾯簡單優雅,功能直觀強⼤)
SQLyog for MySQL(強⼤的MySQL數據庫管理員⼯具)
⼆、 SQL
基本可分爲:
數據定義語⾔DDL (create、 drop)
數據操作語⾔DML(insert、 delete、 update)
數據查詢語⾔DQL(select、 where、 group by、 order by 、 limit)
數據控制語⾔DCL(grant、 revoke)
事務處理語⾔TPL(commit、 rollback)
三、操作數據庫
- 連接mysql數據庫的命令
數據庫操作命令
注意:
每條命令結束必須使⽤; 或者 \g 結束
退出mysql使⽤命令quit或exit
四、數據庫表
- 創建表
- 刪除表
drop table 表名;
- 複製表結構
create table 表名 like 其他表名
- 查看錶結構
desc 表名;
- 查看建表語句
show create table 表名;
- 修改表
#修改字段類型
alter table 表名 modify 字段名 類型 [限制]
#增加字段
alter table 表名 add [column] 字段名 類型 [限制];
#刪除字段
alter table 表名 drop [column] 字段名;
修改字段名和類型
alter table 表名 change [column] 舊字段名 新字段名 類型 [限制];
#修改表名
alter table 表名 rename 新表名
alter table 表名 [engine=myisam] [default charset=utf8];
# 可以通過first、 after指定插⼊位置
alter table student add sno varchar(3) not null after sid; //在sid列後插⼊
alter table student add sid int primary key auto_increment first;//在第⼀列插⼊
- 字段限制
primary key 不允許空值,唯⼀
not null ⾮空
unique 唯⼀
default 缺省,默認值
例子:
五、數據類型
數值型
- 整型 能⽤整型儘量使⽤整型。包括int、 smallint tinyint
- int(3) 或者 tinyint(2) :3或者2不會去限制你所存儲數據的⻓度 ,只有在配合zerofill 零填充的時候 纔有意義
- 浮點數 double 、 decimal
字符型
注意:
(1) char 和 varchar 的區別:
- char的執⾏效率⾼於varchar , varchar 相對於 char 節省存儲空間
- 如果使⽤char 傳⼊的數據的⻓度 ⼩於指定的⻓度的時候 存儲的實際⻓度不夠的會拿空格來填充
- 如果使⽤ varchar 傳⼊的數據的⻓度 ⼩於指定的⻓度的時候 存儲的實際⻓度 爲傳進來的數據的⻓度
⽇期時間型
枚舉enum
集合set
六、數據操作
1. insert
2.update
update 表名 set 字段1=值1,字段2=值2... where 條件 #不加where修改的是所有的記錄
3. delete
七、數據查詢
基本結構: select 字段名列表 from 表名
1 基礎查詢
2 條件查詢(where)
- 關係運算
關係運算符: > 、 >=、 <、 <=、 =、 !=、 <>、 between and
select username,password from user where uid <10
select username,password from user where uid != 10
select username,password from user where uid between 10 and 20
- 邏輯運算
邏輯運算符: and 、 or、 not
select username,password from user where uid < 100 and uid > 20;
select username,password from user where uid > 100 or uid < 20;
- 集合運算
集合運算符: in、 not in
select username,password form user where uid in (2,3,4)
select username,password form user where uid not in (2,3,4)
- 判空
判空運算: is null、 is not null
select username,password from user where username is null
字符串的模糊查詢(like)
通配符 _代表⼀個字符, %代表任意⻓度字符串
select * from user where username like '王_';
select * from user where username like '王%';
3. 排序(order by)
asc 升序(默認)、 desc 降序、
select * from user order by age asc;
select * from user order by age desc;
//"#多字段排序"
select name,age from php_user_history order by age desc,name;
//"#如果在第⼀列上有相同的值,在具有相同的age的記錄上再按name升序排列"
4.限制結果集(limit)
limit n #取前n條記錄
limit offset,n #從第offset條開始取,取n條
select * from php_user_history limit 3;
select * from php_user_history limit 4,2;
//注意結果集中記錄從0開始數數, offset相對於0開始
//實現分⻚必須的技術點
limit (page-1)*num,num
5.集合函數
- count統計結果集中記錄數
- max 最⼤值
- min 最⼩值
- avg 平均值,只針對數值類型統計
- sum 求和,只針對數值類型統計
- 注意,集合函數不能直接使⽤在where後⾯的條件⾥,但可以在⼦查詢中
select count(*) num from user;
select count(distinct age) num from user; //去除重複記錄
select * from student where sno = max(sno);//錯誤
6.分組(group by)
將結果集分組統計,規則:
- 出現了groub by的查詢語句, select後⾯的字段只能是集合函數和group by後⾯有的字段,不要跟其它字段
- 對分組進⾏過濾,可以使⽤having
select uid, count(*) num from php_forum group by uid;
select uid,title, count(*) num from forum group by uid having count(*) >=2;
having和where的區別:
where針對原始表進⾏過濾
having 是針對分組進⾏過濾
查詢⼩結:
- 整體順序不能顛倒
- []表示可選,可以有也可以沒有
- select 字段 from 表名 [where 條件][group by ] [having][order by ] [limit]
⼋ 存儲引擎
可以使⽤show engines命令查看數據庫引擎
show engines \G
下⾯的表格對MySQL⼏種常⽤的數據引擎進⾏了簡單的對⽐。
通過上⾯的⽐較我們可以瞭解到, InnoDB是唯⼀能夠⽀持外鍵、事務以及⾏鎖的存儲引擎,所以我們之前說它更適合互聯⽹應⽤,⽽且它也是較新的MySQL版本中默認使⽤的存儲引擎。
myisam和innodb的區別:
- myisam查詢速度快,不⽀持事務、不⽀持外鍵、⽀持表鎖
- innodb增刪改效率⾼,⽀持事務、⽀持外鍵,⽀持⾏鎖