一、可以建立數據庫表,建立字段,設置合適的字段數據類型。html
二、什麼是主鍵,主鍵通常用什麼類型?什麼是自動增加?mysql
三、select、insert、update、delete;程序員
四、where條件;sql
五、聚合函數:Max、Min、AVG、Count數據庫
六、order by;like;group by瀏覽器
七、null是什麼?null=null嗎?null!=null嗎?如何判斷是null?服務器
八、如何獲取第3行到第9行的數據?架構
九、left join聯合查詢;併發
------------------------------------------------函數
第 0 節: 爲何這章只有一節?
SQLserver不是惟一
.net+MySQL .net+Oracle
成本和架構角度:
1.正版成本。
2.SQLServer不適合創建集羣;MySQL Oracle很方便;
3.SQLServer(大)併發性能比MySQL Oracle差。
MySQL開源免費,並且比SQLServer更適合大型網站架構
如鵬網:.net+MySQL
學習角度:(安裝簡單)
SQLServer的兼容性很麻煩(特別在win8下面);
MySQL綠色版;
一通百通:
Mysql,SQLServer學習起來區別很小,語法基本如出一轍;管理工具大同小異,ADO.net鏈接和
MySQL和鏈接SQLServer敢幾乎同樣;
後面會安排一些SQLServer(安裝配置,ado.net 鏈接SQLServer)項目
------------------------------------------------
第 1 節 數據庫簡介
有用的數據要長期的持久化保存信息
信息寫入到磁盤文件中缺點:
1.數據類型不一樣,結構不一樣
2.不利於多人的共享數據
數據庫(Database):是保存數據的倉庫中,能夠方便的把數據放進去,而且把數據根據各類須要取出來。
數據庫管理系統(Database Management System,DBMS):是對數據庫進行管理(增刪改查等)的軟件。
經常使用的DBMS有:MySQL,Oracle,DB2,MSSQLServer等。
MYSQL是免費、開源的,所以應用最普遍。
有的場所下的「數據庫」其實指是DBMS。哪一個是:「大家用的是什麼數據庫?」,「你會用什麼數據庫?」,「你把數據庫刪了?!」
SQL:一種語法或(MSSQLServer 或mysql數據庫),本身說的要標準一點。
不一樣的DBMS的用法大同小異,掌握一個了也就基本等於掌握了其餘DBMS。
------------------------------------------------
第 2 節 庫表列和系統的基本架構介紹
數據庫:一些有關係的數據的集合
表(Table):數據格式一致的相關數據的集合
列(Column)/字段(Filed):每一列數據,一種類型
服務器:數據庫服務器(MYSQL),網站服務器
小軟件直接鏈接到數據庫,網站瀏覽器會鏈接到網站服務器上,而後網站服務器鏈接到數據庫服務器上的。
------------------------------------------------
第 3 節 MYSQL服務器的管理工具的安裝
一、MYSQL官方版下載地址(不推薦初學者使用):http://www.mysql.com/downloads/
二、如鵬網版綠色免安裝版MYSQL(推薦初學者使用):http://pan.baidu.com/s/1c0m3xIw 提取碼:m9sn
綠色版MYSQL Server的安裝:
1)解壓到沒有中文、空格的文件夾下
2)雙擊mysqld.exe,若是進程中有了mysqld.exe就ok了
3)上面的方式須要每次重啓電腦都要手動運行,特別是若是運行在服務器上,那麼不能在登陸前就啓動。能夠註冊爲系統服務:以管理員身份運行命令行,cd到mysql的bin文件夾,執行「mysqld -install」;卸載服務:mysqld -remove。
如鵬綠色版MYSQL的用戶名、密碼都是:root
三、NaviCat lite
1)下載地址:http://www.cr173.com/soft/44816.html
2)其餘下載地址:百度搜索「NaviCat lite 」
鏈接服務器:地址:127.0.0.1
用戶名,密碼
端口 3306
------------------------------------------------
第 4 節 主鍵(業務主鍵和邏輯主鍵)和外鍵的概念
1.主鍵是數據行的惟一的標識。不會重複的列才能當主鍵。一個表能夠沒有主鍵,可是會很是難以處理,所以沒有特殊理由表都要設定主鍵。
主鍵(惟一性)有兩種選用策略:業務主鍵和邏輯主鍵。
業務主鍵是使用有業務意義的字段作主鍵,好比身份證號、銀行帳號等;
邏輯主鍵是使用沒有任何業務意義的字段作主鍵,徹底給程序看的,業務人員不會看的數據。由於很難保證業務主鍵不會重複(身份證號重複)、不會變化(賬號升位),所以推薦用邏輯主鍵。
建議:統一用邏輯主鍵作主鍵,確定不會重複
2.表間的關聯、外鍵(ForeignKey):指向外部表主鍵的字段
------------------------------------------------
第 5 節 建數據庫創建表的方法
一、根節點點右鍵「新建數據庫」,數據庫名字取得有意義,好比「study1」、字符集建議用"UTF-8"。複習:讀寫編碼一致就不會亂碼。
二、在study1下的「表」節點下點右鍵「新建表」,「欄位」其實指的就是列(Column)/列,翻譯的很差。Id(主鍵,潛規則的名稱,int、不容許爲空、點右鍵「主鍵」)、Name(varchar,長度爲10,不容許爲空)、Gender(bit,不容許爲空),保存爲「T_Persons」(我習慣的表命名規則T_名詞複數)
三、建表常見錯誤:列名/表名不要用可能的關鍵字、不要有空格(包括先後,一不當心輸錯試試)、不要有特殊字符
雙擊生成的表,手工插入兩條數據,注意點「提交」按鈕
四、MYSQL的存儲引擎有不少,最經常使用的是InnoDB和MyISAM,MyISAM效率較高,可是不支持事務、外鍵約束等特性,所以通常建議用InnoDB,新版本默認也是InnoDB。怎麼設:建表時「選項」→「引擎」。建好了如何看引擎:表上點右鍵「對象信息」。
------------------------------------------------
第 6 節 MYSQL經常使用數據類型
文本:
CHAR(*):最多255個字節的定長字符串,它的長度必須在建立時指定(長度不夠,空格來湊合)
VARCHAR(*):最多255個字節的可變長度字符串,它的長度必須在建立時指定
TEXT:最大長度爲64K字符的變長文本
TINYTEXT:最大長度爲255字符的變長文本
MEDUIMTEXT:最大長度爲16K字符的變長文本
LONGTEXT:最大長度爲4GB字符的變長文本
整數(考慮數據取值後選擇儘量小的類型:有符號,無符號)
tinyint:1字節。有符號值:-128 到127;無符號值:0到255
smallint:2字節。有符號值:-32768 到32767;無符號值:0到65535
mediumint:3字節。
int:4字節
bigint:8字節
小數(須要指定長度和小數點,也就是顯示寬度和小數位數):
decimal:精確存儲的小數,在內部用字符串存儲,適合金額等要求精確的類型。別名:NUMERIC
float:4字節,單精度。會近似存儲(*),效率比decimal高。
double:8字節,雙精度。會近似存儲(*),效率比decimal高。
日期時間:
DATE:4字節。範圍:1000-01-01——9999-12-31
TIME:3字節。範圍:-838:59:59——838:59:59
DATETIME:8字節。範圍:1000-01-01 00:00:00——9999-12-31 23:59:59
二進制大數據:
TITYBLOB:最大長度爲255字節
BLOB:最大長度爲64KB
MEDIUMBLOB:最大長度爲16MB
LONGBLOB:最大長度爲4GB
在開發網站系統時,將圖片,視頻等大的數據單獨的放在靜態文件服務器上的。
經過數據庫中只保存文件的路徑。
------------------------------------------------
第 7 節 SQL簡介(Select和Insert)
一、SQL語句中字符串通常用單引號。
二、SQL語句是大小寫不敏感的。
三、NavCat中找到執行SQL語句的地方「查詢」→「新建查詢」,編寫SQL後點擊【運行】執行SQL語句。
補充:若是隻想執行NavCat中編寫的一部分代碼,而不是執行所有代碼,只要選中要執行的代碼,點擊鼠標右鍵,選擇「運行已經選擇的」便可。
四、最簡單的SQL:查看一個表的所有數據:select * from T_Persons
五、簡單的插入數據的SQL語句:INSERT INTO T_Persons(Id,Name,Age,Gender) VALUES(5,'Jim',20,1)
Insert語句能夠省略表名後的列名,可是強烈不推薦
六、若是插入的行中有些字段的值不肯定,那麼Insert的時候不指定那些列便可。不「容許爲空」的列在插入時不能省略
七、自動遞增/自增(Auto Increment):字段自增能夠避免併發等問題,不要程序員代碼控制自增。用自增字段在Insert的時候不用指定值。修改表結構的方法【設計表】。
------------------------------------------------
第 8 節 自動遞增列和修改列的數據類型注意的陷阱
自動遞增/自增(Auto Increment):字段自增能夠避免併發等問題,不要程序員代碼控制自增。用自增字段在Insert的時候不用指定值。修改表結構的方法【設計表】。
修改表結構(設計表)注意
1.把「容許爲空」的改爲「不容許爲空」,須要先給舊數據默認值(可用update語句),或刪除以前沒用的數據;
2.修改列的數據類型時要注意舊數據可否兼容轉換爲新類型,修改數據長度時也是如此。
------------------------------------------------
第 9 節 Update數據更新
一、更新一個列:UPDATE T_Persons Set Age=30
二、更新多個列: UPDATE T_Persons Set Age=30,Name='tom'
三、表達式:UPDATE T_Persons Set Age=Age+1
4更新一部分數據: UPDATE T_Persons Set Age=30 where Name='tom',用where語句表示只更新Name是'tom'的行,注意SQL中等於判斷用單個=,而不是==。
五、Where中還可使用複雜的邏輯判斷UPDATE T_Persons Set Age=30 where Name='tom' or Age<25,or至關於Java中的||where (Age>20 and Age<30) or(Age=80)
六、Where中可使用的其餘邏輯運算符:or、and、not、<、>、>=、<=、!=(或<>)等
------------------------------------------------
第 10 節 Delete數據刪除
刪除表中所有數據:DELETE FROM T_Persons。
Delete 也能夠帶where子句來刪除一部分數據:DELETE FROM T_Persons WHERE Age > 20
Delete只是刪除數據,表還在。
(*)Drop table T_Persons 刪除整個表(表不在了)
is null:判斷是空值
------------------------------------------------
第 11 節 數據初始化和Select語法1
1.數據初始化
INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('DEV001','Tom',25,8300); INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('DEV002','Jerry',28,9300.80); INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('SALES001','John',23,5000); INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('SALES002','Kerry',28,6200); INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('SALES003','Stone',22,1200); INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('HR001','Jane',23,2200.88); INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('HR002','Tina',25,5200.36); INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('IT001','Smith',28,3900); INSERT INTO T_Employees(Number,Age,Salary) VALUES('IT002',27,2800);
2.數據檢索
一、簡單的數據檢索 :SELECT * FROM T_Employees
二、只檢索須要的列 :SELECT Number FROM T_Employees 、SELECT Name,Age FROM T_Employees
三、列別名:SELECT Number AS 編號,Name AS 姓名,Age AS Age111 FROM T_Employees 寫不寫AS都行
四、計算列:SELECT Number 編號,Name 姓名,Age Age111,Age+10 十年後的年齡,1+1,now() FROM T_Employees
五、使用where檢索符合條件的數據:SELECT Name FROM T_Employees WHERE Salary<5000。故事:新員工的數據檢索噩夢
六、還能夠檢索不與任何表關聯的數據:select 1+1;select now();
------------------------------------------------
第 12 節 聚合函數(數據彙總)
一、SQL聚合函數:MAX(最大值)、MIN(最小值)、AVG (平均值)、SUM (和)、COUNT(數量)
二、大於25歲的員工的最高工資 :SELECT MAX(Salary) FROM T_Employees WHERE Age>25
三、最低工資和最高工資:SELECT MIN(Salary),MAX(Salary) FROM T_Employees
四、大於25歲的員工人數:SELECT COUNT(*) FROM T_Employees WHERE Age>25
五、全體員工的工資總和平均工資:SELECT SUM(Salary),AVG (Salary) FROM T_Employees
------------------------------------------------
第 13 節 OrderBy排序
一、ORDER BY子句位於SELECT語句的末尾,它容許指定按照一個列或者多個列進行排序,還能夠指定排序方式是升序(從小到大排列,ASC)仍是降序(從大到小排列,DESC)
二、按照年齡升序排序全部員工信息的列表:SELECT * FROM T_Employees ORDER BY Age ASC
三、按照年齡從大到小排序,若是年齡相同則按照工資從大到小排序 :SELECT * FROM T_Employees ORDER BY Age DESC,Salary DESC
四、RDER BY子句要放到WHERE子句以後 :SELECT * FROM T_Employees WHERE Age>23 ORDER BY Age DESC,Salary DESC
經驗:在寫order by age ASC,ASC升序時,必須寫(明確,代碼表達意思清楚)
order by 必定在where 以後
------------------------------------------------
第 14 節 Like模糊匹配
通配符過濾使用LIKE 。
一、單字符匹配的通配符爲半角下劃線「_」,它匹配單個出現的字符。以任意字符開頭,剩餘部分爲「erry」 :SELECT * FROM T_Employees WHERE Name LIKE '_erry'
二、多字符匹配的通配符爲半角百分號「%」,它匹配任意次數(零或多個)出現的任意字符。 「k%」匹配以「k」開頭、任意長度的字符串。檢索姓名中包含字母「n」的員工信息 :SELECT * FROM T_Employees WHERE Name LIKE '%n%'
三、Like性能較差,很容易形成全表掃描,謹慎使用。後面會講數據庫優化(索引等),項目中作搜索用全文檢索。
------------------------------------------------
第 15 節 null不知道
一、數據庫中,一個列若是沒有指定值,那麼值就爲null,數據庫中的null表示「不知道」,而不是表示沒有。所以select null+1結果是null,由於「不知道」加1的結果仍是「不知道」。
二、SELECT * FROM T_Employees WHERE NAME=null ; SELECT * FROM T_Employees WHERE NAME!=null ;都沒有任何返回結果,由於數據庫也「不知道」。
三、提問:若是T_Employees表中Name列的值是null的話,那麼下面查詢結果是什麼?Select Name+"a" FROM T_Employees 。
答案:仍是null,由於null和任何的東西作任何的運算都是null,null+"a"仍是null。
select 'b'+'a' :0 select null +'a' :null
四、SQL中使用is null、is not null來進行空值判斷:
SELECT * FROM T_Employees WHERE NAME is null ;
SELECT * FROM T_Employees WHERE NAME is not null ;
------------------------------------------------
第 16 節 limit獲取部分結果集 (只有mysql 支持)
一、LIMIT關鍵字用來限制返回的結果集, LIMIT放在SELECT語句的最後位置,語法爲「LIMIT 首行行號,要返回的結果集的最大數目」 。好比下面的SQL語句將返回Name不爲空的、按照工資降序排列的從第二行開始(行號從0開始)的最多五條記錄:
SELECT * FROM T_Employees where Name is not null
ORDER BY Salary DESC
LIMIT 2,5
二、limit必定要放到全部的語句的最後。
------------------------------------------------
第 17 節 Groupby分組查詢
一、數據分組用來將數據分爲多個邏輯組,從而能夠對每一個組進行聚合運算。SQL語句中使用GROUP BY子句進行分組,使用方式爲「GROUP BY 分組字段」。分組語句通常和聚合函數一塊兒使用,GROUP BY子句負責將數據分紅邏輯組,而聚合函數則對每個組進行統計計算。
二、查看公司員工有哪些年齡段的:
SELECT Age FROM T_Employees GROUP BY Age
將Age相同的數據行放到一組,分組後的數據能夠看做一個臨時的結果集,而SELECT Age語句則取出每組的Age字段的值,這樣咱們就獲得上表的員工年齡段表了。
三、若是SELECT語句有WHERE子句,則GROUP BY子句必須放到WHERE語句的以後。
四、GROUP BY子句將檢索結果劃分爲多個組,每一個組是全部記錄的一個子集。上面的SQL例子在執行的時候數據庫系統將數據分紅了下面的分組:
五、分組後就能夠對組內的數據採用聚合函數進行統計了:
1)計算每一個分組中的員工平均工資
SELECT Age,AVG(Salary) FROM T_Employees GROUP BY Age
2)查看每一個年齡段的員工的人數:
SELECT Age,COUNT(*) FROM T_Employees GROUP BY Age
------------------------------------------------
第 18 節 left join聯合查詢
1.初始化數據
INSERT
INTO
T_Customers(Id,
Name
,Age)
VALUES
(1,
'TOM'
,21);
INSERT
INTO
T_Customers(Id,
Name
,Age)
VALUES
(2,
'MIKE'
,24);
INSERT
INTO
T_Customers(Id,
Name
,Age)
VALUES
(3,
'JACK'
,30);
INSERT
INTO
T_Customers(Id,
Name
,Age)
VALUES
(4,
'TOM'
,25);
INSERT
INTO
T_Customers(Id,
Name
,Age)
VALUES
(5,
'LINDA'
,30);
INSERT
INTO
T_OrderTypes(Id,
Name
)
VALUES
(1,
'現貨訂單'
);
INSERT
INTO
T_OrderTypes(Id,
Name
)
VALUES
(2,
'預訂訂單'
);
INSERT
INTO
T_OrderTypes(Id,
Name
)
VALUES
(3,
'預購訂單'
);
INSERT
INTO
T_OrderTypes(Id,
Name
)
VALUES
(4,
'內部'
);
INSERT
INTO
T_Orders(Id,Number,Price,CustomerId, TypeId)
VALUES
(1,
'K001'
,100,1,1);
INSERT
INTO
T_Orders(Id,Number,Price,CustomerId, TypeId)
VALUES
(2,
'K002'
,200,1,1);
INSERT
INTO
T_Orders(Id,Number,Price,CustomerId, TypeId)
VALUES
(3,
'T003'
,300,1,2);
INSERT
INTO
T_Orders(Id,Number,Price,CustomerId, TypeId)
VALUES
(4,
'N002'
,100,2,2);
INSERT
INTO
T_Orders(Id,Number,Price,CustomerId, TypeId)
VALUES
(5,
'N003'
,500,3,4);
INSERT
INTO
T_Orders(Id,Number,Price,CustomerId, TypeId)
VALUES
(6,
'T001'
,300,4,3);
INSERT
INTO
T_Orders(Id,Number,Price,CustomerId, TypeId)
VALUES
(7,
'T002'
,100,1,1);
一、查詢每張訂單的訂單號、價格、對應的客戶姓名以及客戶年齡
SELECT o.Number,o.Price,c.Name,c.Age
FROM T_Orders o
LEFT JOIN T_Customers c
ON o.CustomerId=c.Id
二、添加where語句(顯示價格>=150元的訂單)
SELECT o.Number,o.Price,o.CustomerId,
c.Name,c.Age FROM T_Orders o
LEFT JOIN T_Customers c ON o.CustomerId=c.Id
WHERE o.Price>=150
三、能夠join多張表:
SELECT o.Number 訂單號,o.Price 價格, c.Name 客戶姓名,c.Age 客戶年齡,t.Name 訂單類型 FROM T_Orders o
LEFT JOIN T_Customers c ON o.CustomerId=c.Id
LEFT JOIN T_OrderTypes t ON o.TypeId=t.Id
------------------------------------------------
第 19 節 外鍵約束(初學時加上外鍵,公司看要求)
一、若是刪除/更新T_Customers一行記錄,那麼就可能會致使T_Orders中存在CustomerId爲非法值的數據,使得程序邏輯錯誤。通常不會更新主鍵Id的值,因此談外鍵約束的時候只談「刪除T_Customers時」。
二、外鍵約束:當刪除T_Customers中一條數據的時候,如何處理T_Orders等存在指向T_Customers外鍵的行。外鍵約束創建在外鍵字段***Id的表上(t_orders)。
三、建外鍵約束的方法:新建或者修改表的時候「外鍵」→「添加外鍵」。名:自動命名便可;欄位名:CustomerId;參考表:t_customers;外欄位名:Id;刪除時、更新時:通常默認RESTRICT(CASCADE:刪除T_Customers一行時把它的訂單也刪除了;SET NULL:刪除T_Customers一行時把它的訂單CustomerId設置爲NULL;NO ACTION/RESTRICT:拒絕刪除)。
四、有的公司不習慣建外鍵,而是經過程序進行數據合法性控制,對於初學者先不建議這樣,都把外鍵加上。
外鍵在哪一個表 就改哪一個表的外鍵設置
約束策略:
刪除時 和 更新時
RESTRICT:限制主鍵表刪除(更新),不容許直接刪除父表的該值;
NO ACTION:拒絕刪除
CASCADE:級連,主鍵表刪除,對應的記錄也所有刪除
SET NULL:設置爲NULL
擴展學習:
DDL:drop table,create table alter table....
存儲過程,觸發器,結束,子查詢,除了left join 外的其餘join