MySQL的結(jié)構(gòu)
一共分四層,分別是:
1. 連接層:主要是一些客戶端和鏈接服務(wù),包含本地sock通信和大多數(shù)基于客戶端/服務(wù)端工具實(shí)現(xiàn)的類似于tcp/ip的通信. 主要完成一些類似于鏈接處理.授權(quán)認(rèn)證.及相關(guān)的安全方案.
2. 服務(wù)層(可優(yōu)化):第二層架構(gòu)主要完成大的核心服務(wù)功能,如SQL緩存的查詢,SQL的分析和優(yōu)化和內(nèi)置函數(shù)的執(zhí)行.
3. 引擎層(可優(yōu)化):它真正的負(fù)責(zé)了Mysql中數(shù)據(jù)的存儲(chǔ)和提取,服務(wù)器通過API與存儲(chǔ)引擎進(jìn)行通信,不同的存儲(chǔ)引擎具有的功能不同,這樣我們可以根據(jù)自己的實(shí)際需要進(jìn)行選取.
4. 存儲(chǔ)層:它主要是將數(shù)據(jù)存儲(chǔ)再運(yùn)行于設(shè)備的文件系統(tǒng)之上,并完成于存儲(chǔ)引擎的交互.
MySQL的常用數(shù)據(jù)庫引擎
共有十多個(gè),但常用的有兩個(gè): MyISAM和InnoDB
MyISAM: 偏讀,側(cè)重點(diǎn)是性能
InnoDB: 偏事務(wù)?????? 下面這張圖是兩者的
兩者的對(duì)比
MySQL的特點(diǎn)
1. MySQL把數(shù)據(jù)存儲(chǔ)在表格中,使用標(biāo)準(zhǔn)的結(jié)構(gòu)化查詢語言-SQL訪問數(shù)據(jù)庫
2. MySQL是完全免費(fèi)的,在網(wǎng)上可以任意下載,并且可以查看到它的源文件,進(jìn)行必要的修改
3. MySQL服務(wù)器的功能齊全,運(yùn)行速度很快,十分可靠,有很好的安全感
4. MySQL服務(wù)器在客戶機(jī),服務(wù)器嵌入系統(tǒng)中使用,是一個(gè)客戶機(jī)/服務(wù)器系統(tǒng),能夠支持多線程,支持多個(gè)不同的客戶程序和管理工具
MySQL的對(duì)象
表(table)? /? 視圖(view)? /? 索引(index)? /? 序列(squence)? /? 存儲(chǔ)函數(shù)(function)? /? 存儲(chǔ)過程(procedure)? /? 觸發(fā)器(trigger)
#{} 與 ${}的區(qū)別
在MyBatis中:
#{}:#{}使用的是,會(huì)有類型轉(zhuǎn)換,比較安全,也是官網(wǎng)推薦使用的
${}:使用字符串拼接,會(huì)有sql注入,不安全,不推薦使用
MySQL對(duì)庫表的操作
linux中進(jìn)入到MySQL的安裝目錄下,? mysql -uroot -p?? 再輸入密碼? OK,已經(jīng)進(jìn)入
select database(): 查看當(dāng)前使用的數(shù)據(jù)庫? ??? show databases:查看所有的數(shù)據(jù)庫
use database_name:切換數(shù)據(jù)庫? ? ? ? create database 數(shù)據(jù)庫名:創(chuàng)建數(shù)據(jù)庫
drop database database-name:刪除數(shù)據(jù)庫?????? show tables:查看數(shù)據(jù)庫中所有的表???
drop table table_name:刪除表? ? ? create table 表名: 創(chuàng)建表
MySQL的增(insert)
insert into user values (NULL,'x','h');? ? //不能省略可空字段
inser into user values (NULL,'x','h'),(NULL,'x','h');? ? //多插入,逗號(hào)隔開
MySQL的刪(delete)
delete from user where id=1;??? 記得價(jià)格過濾條件,不然會(huì)刪除所有..
MySQL的改(update)
updata employees set 要更改的列
MySQL的查(select)
MySQL的查詢大致可以分為5個(gè)部分: 基本的select語句? /? 過濾和排序數(shù)據(jù)? /? 多表查詢? /? 單行函數(shù)? /? 分組函數(shù)
基本的selcet語句: select id , name from employees?
過濾和排序數(shù)據(jù): select id , name from employees where id != 2 ?? =(等于)? >(大于)? >=(大于/等于)? <(小于)? <=(小于等于)? !=(不等于) ?
select id from employees where id > 5 and id < 7??? and為并且? 為字符串的話,就是字典順序來查詢
select id from employees where id in (5,6,7)????? ...?
like為模糊查詢: "%a%"? "_a%" ?? and為并且 ?? in(集合)??? \為轉(zhuǎn)義字符?? or或者?? not否?
order by排序 數(shù)值型/字符型/日期型都可以排序 ,asc為升序,desc為降序,可以多級(jí)嵌套排序
select * from employees order by id asc;?????? //升序排序? 一定要寫在where后面!!!
多表查詢
多表查詢,第一步,你得多各張表的字段及聯(lián)系足夠熟悉,本質(zhì)就是一張表放不下這么多字段.把原本同一張表的字段放到其他的表里面,兩張表之間一定又相同的唯一字段作為橋接,聯(lián)系
select id , name from employees departments where? employees.'id' = departments.'id' ?? //就是from的時(shí)候?qū)懚鄰埍砭蚈K了,然后過濾條件,也就是連接的條件, 可以優(yōu)化, 在select那里,直接寫上每一個(gè)字段是來自哪里? 如employees.name
等值連接和非等值連接: 前者就是上面演示的那種,兩者的關(guān)系是相等的,后者就是在一個(gè)區(qū)間,通常用and來表示
自連接和非自連接: 前者連接的是本身的這張表,比如查自己的上司是誰,后者連接的是其他的表
內(nèi)鏈接和外連接:前者是只查詢兩者相匹配的行,比如之上的例子就是查詢相等的
外連接:使用join和on,意思就是除了兩表中向同的數(shù)據(jù)外,還把左表中或右表中的數(shù)據(jù)也查詢出來,于是就有了左外連接,右外連接.,不支持滿連接. 使用的outer join和on函數(shù)
select e.id,d.name from emp e left outer join dep d on e.'id' = d.'id';?? 這是左外連接,因?yàn)槭莑eft outer join on ,改成右外連接就是right outer join on
單行函數(shù)
單行函數(shù)就是一個(gè)個(gè)的函數(shù),具體的函數(shù)有:? concat("11","22")? //它將兩個(gè)字符串連接起來??? sunstr("hello",1,2) //截取1到2的字符串,得到he??? length("111111") //得到這個(gè)字符串的長度?? instr("hello","e") //返回這個(gè)字符的索引?? trim("h" from "hello") //返回除去h之外的所有字符串???? replace("abcd","b","m") 將字符串中的b轉(zhuǎn)換成m,再輸出字符串
分組函數(shù)
avg(salary) //表示平均??????? sum(salary) //表示總共???????? max(salary) //最高的 ? ? ? min(salary) //最低的?? count(salary) //計(jì)數(shù)
子查詢
子查詢的本質(zhì)就是查詢的嵌套,可以嵌套很多層,也是屬于查詢也因?yàn)樽硬樵兌兊们ё內(nèi)f化
MySQL的運(yùn)行順序
運(yùn)行順序基本如下:
1. from???? 2. on???? 3. join???? 4. where???? 5. group by
6. avg,sum???? 7. select???? 8. distinct???? 9. order by???? 10. limit
MySQL中的join查詢
上圖中分別是: 左外鏈接,右外鏈接,內(nèi)連接
1. 左外連接: select * from tablea a left join table b on a.key = b.key
2. 右外連接: select * from tablea a right join table b on a.key = b.key
3. 內(nèi)連接: select * from tablea a inner join tableb b on a.key = b.key
上圖中分別是: 左鏈接,右鏈接,全連接,外連接
左連接: select * from tablea a left join tableb b on a.key = b.key where b.key is null
右連接: select * from tablea a right join tableb b on a.key = b.key where a.key is? null
全鏈接:
select * from tablea a left join tableb b on a.key = b.key union select
* from tablea a right join tableb b on a.key = b.key
外連接: select * from tablea a full outeb join tableb b on a.key = b.key where a.key is null or b.key is nul