1 數據庫相關概念html
1.啥是數據庫python
2.數據庫的分類mysql
3.關係型數據庫的特色sql
2 認識MySQL編程
3 數據庫的安裝windows
4 數據庫操做安全
1.顯示數據庫服務器
2.建立數據庫session
6 數據表操做
7 表的增刪改查
8 子查詢
9 存儲引擎和字符集
所謂的數據庫,其實就是有點相似於excel表格,主要就是用來管理數據,對數據進行增刪改查的。因此某種程度上來講,excel也能夠當作一個簡單的數庫,只不過是在文件中對數據的讀寫速度相對較慢,因此如今咱們使用數據庫管理系統來管理和存儲大量的數據
數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫
Mysql是最流行的關係型數據庫管理系統,在WEB應用方面MySQL是最好的RDBMS(Relational Database Management System:關係數據庫管理系統)應用軟件之一。由瑞典MySQL AB公司開發,目前屬於Oracle公司
MySQL的特色:
1)下載
http://dev.mysql.com/downloads/mysql/
2)解壓
若是想要讓MySQL安裝在指定目錄,那麼就將解壓後的文件夾移動到指定目錄,如:C:\mysql-5.7.16-winx64
3)服務端初始化
MySQL解壓後的 bin 目錄下有一大堆的可執行文件,執行以下命令初始化數據
cd c:\mysql-5.7.16-winx64\bin mysqld --initialize-insecure
4)啓動MySQL服務器
因爲初始化時使用的【mysqld –initialize-insecure】命令,其默認未給root帳戶設置密碼
# 進入可執行文件目錄 cd c:\mysql-5.7.16-winx64\bin # 鏈接MySQL服務器 mysql -u root -p # 提示請輸入密碼,直接回車
登陸成功後,會出現如下的顯示
到此爲止,MySQL服務端已經安裝成功而且客戶端已經能夠鏈接上,之後再操做MySQL時,只須要重複上述四、5步驟便可。可是,在四、5步驟中重複的進入可執行文件目錄比較繁瑣,如想往後操做簡便,能夠作以下操做:
將MySQL可執行文件添加到環境變量中,從而執行執行命令便可
右鍵計算機】--》【屬性】--》【高級系統設置】--》【高級】--》【環境變量】--》【在第二個內容框中找到 變量名爲Path 的一行,雙擊】 --> 【將MySQL的bin目錄路徑追加到變值值中,用 ; 分割】
如:
C:\Program Files (x86)\Parallels\Parallels Tools\Applications;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Python27;C:\Python35;C:\mysql-5.7.16-winx64\bin
如此一來,之後再啓動服務並鏈接時,僅需:
# 啓動MySQL服務,在終端輸入 mysqld # 鏈接MySQL服務,在終端輸入: mysql -u root -p
上一步解決了一些問題,但不夠完全,由於在執行【mysqd】啓動MySQL服務器時,當前終端會被hang住,那麼作一下設置便可解決此問題:
# 製做MySQL的Windows服務,在終端執行此命令: "c:\mysql-5.7.16-winx64\bin\mysqld" --install # 移除MySQL的Windows服務,在終端執行此命令: "c:\mysql-5.7.16-winx64\bin\mysqld" --remove
註冊成服務以後,之後再啓動和關閉MySQL服務時,僅需執行以下命令:
# 啓動MySQL服務 net start mysql # 關閉MySQL服務 net stop mysql
yum包安裝和源碼安裝兩種方式,推薦使用yum包的方式進行安裝
源碼安裝:http://www.cnblogs.com/shangzekai/p/4374489.html
yum安裝:
yum install mysql-server service mysqld start mysql -h host -u user -p
SHOW DATABASES;
# utf-8 CREATE DATABASE 數據庫名稱 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
USE db_name;
顯示當前使用的數據庫中全部表:SHOW TABLES;
建立用戶 create user '用戶名'@'IP地址' identified by '密碼'; 刪除用戶 drop user '用戶名'@'IP地址'; 修改用戶 rename user '用戶名'@'IP地址'; to '新用戶名'@'IP地址';; 修改密碼 set password for '用戶名'@'IP地址' = Password('新密碼') PS:用戶權限相關數據保存在mysql數據庫的user表中,因此也能夠直接對其進行操做(不建議)
show grants for '用戶'@'IP地址' -- 查看權限 grant 權限 on 數據庫.表 to '用戶'@'IP地址' -- 受權 revoke 權限 on 數據庫.表 from '用戶'@'IP地址' -- 取消權限
數據庫名.* 數據庫中的全部 數據庫名.表 指定數據庫中的某張表 數據庫名.存儲過程 指定數據庫中的存儲過程 *.* 全部數據庫
用戶名@IP地址 用戶只能在改IP下才能訪問 用戶名@192.168.1.% 用戶只能在改IP段下才能訪問(通配符%表示任意) 用戶名@% 用戶能夠再任意IP下訪問(默認IP地址爲%)
常見的例子:
grant all privileges on db1.tb1 TO '用戶名'@'IP' grant select on db1.* TO '用戶名'@'IP' grant select,insert on *.* TO '用戶名'@'IP' revoke select on db1.tb1 from '用戶名'@'IP'
操做完成以後,不會當即生效,要想當即生效,能夠以下操做
flush privileges,將數據讀取到內存中,從而當即生效
先學習一個簡單的建表語句
create table 表名 ( 列1 [列屬性 是否爲null 默認值], 列2 [列屬性 是否爲null 默認值], ..... 列n [列屬性 是否爲null 默認值] )engine = 存儲引擎 charset = 字符集
補充:
create table 表名 ( 列1 [列屬性 是否爲null 默認值], 列2 [列屬性 是否爲null 默認值], ..... 列n [列屬性 是否爲null 默認值] )engine = 存儲引擎 charset = 字符集
對上述建表語句的解釋
not null - 不可空 null - 可空
建立列時能夠指定默認值,當插入數據時若是未主動設置,則自動添加默認值
create table tb1( id int not null defalut 2, num int not null )
若是爲某列設置自增列,插入數據時無需設置此列,默認將自增(表中只能有一個自增列)
create table tb1( nid int not null auto_increment primary key, num int null ) 或 create table tb1( nid int not null auto_increment, num int null, index(nid) )
注意:
對於自增列,必須是索引(含主鍵)
對於自增能夠設置步長和起始值
show session variables like 'auto_inc%'; set session auto_increment_increment = 2; set session auto_increment_offset = 10; shwo global variables like 'auto_inc%'; set global auto_increment_increment = 2; set global auto_increment_offset = 10;
一種特殊的惟一索引,不容許有空值,若是主鍵使用單個列,則它的值必須惟一,若是是多列,則其組合必須惟一
create table tb1( nid int not null auto_increment primary key, num int null ) 或 create table tb1( nid int not null, num int not null, primary key(nid,num) )
creat table color( nid int not null primary key, name char(16) not null ) create table fruit( nid int not null primary key, smt char(32) null , color_id int not null, constraint fk_cc foreign key (color_id) references color(nid) )
drop table 表名
delete from 表名 truncate table 表名
添加列:alter table 表名 add 列名 類型 刪除列:alter table 表名 drop column 列名 修改列: alter table 表名 modify column 列名 類型; -- 類型 alter table 表名 change 原列名 新列名 類型; -- 列名,類型 添加主鍵: alter table 表名 add primary key(列名); 刪除主鍵: alter table 表名 drop primary key; alter table 表名 modify 列名 int, drop primary key; 添加外鍵:alter table 從表 add constraint 外鍵名稱(形如:FK_從表_主表) foreign key 從表(外鍵字段) references 主表(主鍵字段); 刪除外鍵:alter table 表名 drop foreign key 外鍵名稱
insert into 表 (列名,列名...) values (值,值,值...) insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) insert into 表 (列名,列名...) select (列名,列名...) from 表
註釋:列名能夠不寫,若是不寫,則默認插入全部列的數據
delete from 表 delete from 表 where id=1 and name='yb'
update 表 set name = 'yb' update 表 set name = 'yb' where id>1
select * from 表
條件爲真,則該行取出
select * from 表 where id > 1 select nid,name,gender from 表 where id > 1
注意:where以後能夠跟的運算符類型以下
select * from 表 where id > 1 and name != 'yb' and num = 12; select * from 表 where id between 5 and 16; select * from 表 where id in (11,22,33) select * from 表 where id not in (11,22,33) select * from 表 where id in (select nid from 表)
select * from 表 where name like 'y%' - y開頭的全部(多個字符串) select * from 表 where name like 'y_' - y開頭的全部(一個字符)
limit [偏移量], 取出條目 分頁應用中最爲典型,如第1頁取1-20條,第2頁取21-40條
select * from 表 limit 5; - 前5行 select * from 表 limit 4,5; - 從第4行開始的5行 select * from 表 limit 5 offset 4 - 從第4行開始的5行(不推薦)
對欄目的商品按價格由高到低或由低到高排序
各類排序場合,如取熱點新聞,發帖狀元等
默認是升序排列
select * from 表 order by 列 asc - 根據 「列」 從小到大排列 select * from 表 order by 列 desc - 根據 「列」 從大到小排列
把行按某個字段進行分組
見於統計場合,如按欄目計算帖子數,統計每一個人的平均成績等
select num from 表 group by num select num,nid from 表 group by num,nid select num,nid from 表 where nid > 10 group by num,nid order by nid desc select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid select num from 表 group by num having max(id) > 10 特別的:group by 必須在where以後,order by以前
having和where的異同點:
1). having與where相似,可篩選數據
2). where針對表中的列發揮做用,查詢數據
3). having針對查詢結果中的列發揮做用,篩選數據
注意:上述查詢條件寫的時候的順序
group by > order by > limit
select name,sum(score) from 表 where id > 10 group by score order by age desc limit 2, 10
從2張或多張表中,取出有關聯的數據
取文章及所在欄目名稱,取我的信息及所發佈的文章等
左鏈接
右鏈接
內鏈接
A表全部顯示,若是B中無對應關係,則值爲null
select A.num, A.name, B.name from A left join B on A.nid = B.nid
B表全部顯示,若是B中無對應關係,則值爲null
select A.num, A.name, B.name from A right join B on A.nid = B.nid
內鏈接是左右鏈接的交集
select A.num, A.name, B.name from A inner join B on A.nid = B.nid
子查詢就是在原有的查詢語句中,嵌入新的查詢,來獲得咱們想要的結果集。
where型子查詢
把內層sql語句查詢的結果做爲外層sql查詢的條件
select * from tableName where colName = (select colName from tbName where ....) 或 {where colName in (select colName from tbName where ..)}
查詢出某大欄目下的全部商品
設有張馬虎,李當心兩人,都是地鐵口的自行車管理員.天天都有不少人來存取自行車
張馬虎的管理方式是:來存本身存,不記錄存的是什麼車,取時交5毛,也不檢查取的是不是本身的車.
李當心呢,則在存取本身車時,記錄存車人的特徵與自行車的特徵,當人來取車,還要當心核一下,人與車的特徵是否對應
其實存儲引擎和上述的狀況都是同樣的
數據庫對一樣的數據,有着不一樣的存儲方式和管理方式
在mysql中,稱爲存儲引擎
存儲引擎的選擇
1). 文章,新聞等安全性要求不高的,選myisam
2). 訂單,資金,帳單,火車票等對安全性要求高的,選用innodb
3). 對於臨時中轉表,能夠用memory型 ,速度最快
MySQL在5.6版本以上,默認的存儲引擎就是innodb
字符集是一套符號和編碼的規則,不管是在 oracle 數據庫仍是在 mysql 數據庫,都存在字符集的選擇問題,並且若是在數據庫建立階段沒有正確選擇字符集,那麼可能在後期須要更換字符集,而字符集的更換是代價比較高的操做,也存在必定的風險,因此,咱們推薦在應用開始階段,就按照需求正確的選擇合適的字符集,避免後期沒必要要的調整
在mysql客戶端與mysql服務端之間,存在着一個字符集轉換器,來看一下mysql字符集間的轉換
那爲何會出現亂碼?
咱們首先來看一下常常用的字符集的詳細信息
對比以上三幅圖能夠知道,每種字符集中,用於存儲一個字符的最大的字節數目都不一樣,utf8最大,latin最
小。因此在通過字符集轉換器的時候,若是處理不當,會形成數據丟失
好比:咱們將character_set_connection的值改成lantin的時候
從客戶端發送過來的utf8數據,會被轉成lantin1格式,由於utf8格式的數據佔用的字符數較多,從而會形成數據丟失
其實很是的簡單,就是數據在通過上面三層轉換的時候,只要有一個數據的格式和它兩個不同的話,都會出現亂碼,所以咱們須要確保三者的字符集是一致的
*使用set names utf8來統一設置,上文已說過 *這種形式的設置只會在當前窗口有效,當窗口關閉後從新打開 CMD 客戶端的時候又會出現亂碼問題;那麼,如何進行一個一勞永逸的設置呢?在 MySQL 的安裝目錄下有一個 my.ini 配置文件,經過修改這個配置文件能夠一勞永逸的解決亂碼問題。在這個配置文件中 [mysql] 與客戶端配置相關,[mysqld] 與服務器配置相關。默認配置以下:
[mysql] default-character-set=utf8 [mysqld] character-set-server=utf8
修改完成後,service mysql restart重啓mysql服務就生效