MySQL學習基礎篇

本文目錄

1 數據庫相關概念html

  1.啥是數據庫python

  2.數據庫的分類mysql

  3.關係型數據庫的特色sql

  4.關係型數據庫的經常使用術語數據庫

2 認識MySQL編程

3 數據庫的安裝windows

4 數據庫操做安全

  1.顯示數據庫服務器

  2.建立數據庫session

  3.使用數據庫

  4.用戶管理

  5.受權管理

5 MySQL數據類型

  1.數值型

  2.字符串類型

  3.時間日期類型

  4.特殊的NULL類型

6 數據表操做

  1.建立表

  2.刪除表

  3.清空表

  4.修改表

7 表的增刪改查

  1.增長

  2.刪除

  3.修改

  4.基本查詢

  5.高級查詢

  6.鏈接查詢

8 子查詢

9 存儲引擎和字符集

  1.存儲引擎

  2.字符集

 

 

數據庫相關概念

一、啥是數據庫

  • 簡單理解
所謂的數據庫,其實就是有點相似於excel表格,主要就是用來管理數據,對數據進行增刪改查的。因此某種程度上來講,excel也能夠當作一個簡單的數庫,只不過是在文件中對數據的讀寫速度相對較慢,因此如今咱們使用數據庫管理系統來管理和存儲大量的數據
  • 官方定義
數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫

 

二、數據庫的分類

  • 關係型數據庫,如 MySQL,Oracle,SqlServer等
  • 非關係型數據庫,如 Redis,Mongodb,Memcache等

 

三、關係型數據庫的特色

  • 數據以表格的形式出現
  • 每行爲各類記錄的數據
  • 每列爲記錄名稱所對應的數據域
  • 許多的行和列組成一張表單
  • 若干的表單組成database

 

四、關係型數據庫的經常使用術語

  • 數據庫: 數據庫是一些關聯表的集合。
  • 數據表: 在一個數據庫中的表看起來像一個簡單的電子表格。
  • 列: 一列(數據元素) 包含了相同的數據, 例如郵政編碼的數據。
  • 行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
  • 冗餘:存儲兩倍數據,冗餘可使系統速度更快。(在查詢時可能常常須要在多個表之間進行鏈接查詢;而進行鏈接操做會下降查詢速度。例如,學生的信息存儲在student表中,院系信息存儲在department表中。經過student表中的dept_id字段與department表創建關聯關係。若是要查詢一個學生所在系的名稱,必須從student表中查找學生所在院系的編號(dept_id),而後根據這個編號去department查找系的名稱。若是常常須要進行這個操做時,鏈接查詢會浪費不少的時間。所以能夠在student表中增長一個冗餘字段dept_name,該字段用來存儲學生所在院系的名稱。這樣就不用每次都進行鏈接操做了。)
  • 主鍵:主鍵是惟一的。一個數據表中只能包含一個主鍵。你可使用主鍵來查詢數據。
  • 外鍵:外鍵用於關聯兩個表。
  • 複合鍵:複合鍵(組合鍵)將多個列做爲一個索引鍵,通常用於複合索引。
  • 索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。相似於書籍的目錄。

 

認識數據庫

Mysql是最流行的關係型數據庫管理系統,在WEB應用方面MySQL是最好的RDBMS(Relational Database Management System:關係數據庫管理系統)應用軟件之一。由瑞典MySQL AB公司開發,目前屬於Oracle公司

 

MySQL的特色:

  • MySQL是開源的,因此你不須要支付額外的費用。
  • MySQL使用標準的SQL數據語言形式。
  • MySQL能夠容許於多個系統上,而且支持多種語言。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
  • MySQL對PHP有很好的支持,PHP是目前最流行的Web開發語言。
  • MySQL支持大型數據庫,支持5000萬條記錄的數據,32位系統表文件最大可支持4GB,64位系統支持最大的表文件爲8TB。
  • MySQL是能夠定製的,採用了GPL協議,你能夠修改源碼來開發本身的Mysql系統

 

數據庫的安裝

  • windows版本

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

將MySQL服務製做成windows服務

上一步解決了一些問題,但不夠完全,由於在執行【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
  • Linux版本

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,將數據讀取到內存中,從而當即生效

 

MySQL數據類型

先學習一個簡單的建表語句

create table 表名 (
    列1 [列屬性 是否爲null 默認值],
    列2 [列屬性 是否爲null 默認值],
    .....
    列n [列屬性 是否爲null 默認值]
)engine = 存儲引擎  charset = 字符集  

一、數值型

補充:

  • unsigned表示爲無符號
  • float(M,D) 浮點型
  • decimal(M,D) 定點型 比float更加的精準
  • M: 精度(總位數)D: 標度(小數位)

二、字符串類型

三、時間日期類型

四、特殊的NULL類型

  • NULL 不是假,也不是真,而是」空」
  • NULL 的判斷只能用is null,is not null
  • NULL 影響查詢速度,通常避免使值爲NULL

 

數據表操做

一、建立表

create table 表名 (
    列1 [列屬性 是否爲null 默認值],
    列2 [列屬性 是否爲null 默認值],
    .....
    列n [列屬性 是否爲null 默認值]
)engine = 存儲引擎  charset = 字符集

  

對上述建表語句的解釋

  • 是否爲null
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 表

  

五、高級查詢

  • where條件查詢

條件爲真,則該行取出

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字符集間的轉換

  • character_set_client => utf8 (客戶端告訴轉換器發送過來的是utf8格式的編碼)
  • character_set_connection => utf8(將客戶端傳送過來的數據轉換成utf8格式)
  • character_set_results => utf8 (告訴客戶端結果數據的編碼是utf8)
    注:以上三個字符集可使用set names utf8來統一進行設置

 

那爲何會出現亂碼?

咱們首先來看一下常常用的字符集的詳細信息

  • latin字符集

latin.jpg

  • gbk字符集

gbk.jpg

  • utf8字符集

utf8.jpg

 

對比以上三幅圖能夠知道,每種字符集中,用於存儲一個字符的最大的字節數目都不一樣,utf8最大,latin最
小。因此在通過字符集轉換器的時候,若是處理不當,會形成數據丟失

 

好比:咱們將character_set_connection的值改成lantin的時候
latin1.png

從客戶端發送過來的utf8數據,會被轉成lantin1格式,由於utf8格式的數據佔用的字符數較多,從而會形成數據丟失

results.png

  • 如何避免以上的狀況?
其實很是的簡單,就是數據在通過上面三層轉換的時候,只要有一個數據的格式和它兩個不同的話,都會出現亂碼,所以咱們須要確保三者的字符集是一致的
  • 設置字符集的兩種方法
*使用set names utf8來統一設置,上文已說過
*這種形式的設置只會在當前窗口有效,當窗口關閉後從新打開 CMD 客戶端的時候又會出現亂碼問題;那麼,如何進行一個一勞永逸的設置呢?在 MySQL 的安裝目錄下有一個 my.ini 配置文件,經過修改這個配置文件能夠一勞永逸的解決亂碼問題。在這個配置文件中 [mysql] 與客戶端配置相關,[mysqld] 與服務器配置相關。默認配置以下:
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8

  修改完成後,service mysql restart重啓mysql服務就生效

相關文章
相關標籤/搜索