『壹』 在寫sql語句時什麼時候需要用到自表關聯,誰能舉個完整的例子
比如公司的部門結構,
人事部門,他的下級 考勤科,數據存儲在一個表中
org_code = 考勤科, up_org_code = 人事部門
,表名是人事 表,我需要查詢人事的上下級部門關系,則需要
select B.org_code, A.org_code
from 人事表 A, 人事表 B
where A.up_org_code = b.org_code
;
結果就是 人事部門 -> 考勤科
明白了嗎?
『貳』 MGR 實踐及常見問題分析
來也科技使用 MGR (MySQL Group Replication)作為私有部署時 MySQL 的高可用架構,一年多以來,服務眾多用戶,穩定性得到了極大的保障。
本文記錄自內部分享,需要一定的 MySQL 基礎。歡迎大家在評論區討論、交流~
MySQL Group Replication(簡稱 MGR), MySQL 組復制。
MGR 是 MySQL 官方推出的一種基於 paxos 協議的狀態機復制,實現了分布式下數據的最終一致性。MySQL 組復制提供了高可用、高擴展、高可靠的 MySQL 集群解決方案。
MGR 支持兩種模式:單主、多主。其中單主模式是官方推薦的,也是在來也科技內部廣泛應用的,我們接下來的內容都是以單主模式為背景的。
可能有同學會質疑,公有雲上的高可用架構大多是主從啊,為什麼來也科技要選擇 MGR ?
那首先,我們就要知道 「主從」 和 MGR 的優缺點分別是什麼?
來也科技作為一家重心放在 ToB 的企業,我們著重考慮私有部署時,如何保證客戶環境的可用性。客戶的環境,我們看不到,更無法控制,在這樣的情況下,我敬陸們會盡量求穩。
維護主從高可用架構的應用,通常面向大規模集群運維,往往會引入復雜的交互和新的中間件。對於我們這種只需要部署一套集群的 ToB 需求,顯然是不合適的。
綜合考慮之下,我們選擇 MGR 作為私有部署時的高可用架構。
· 最少 3 個節點,最多 9 個節點
· 節點越多,容錯性越強,但交互越多,可能會影響效率
· 存儲引擎只能使用 InnoDB
· 表中必須帶有主鍵
· 一次只能加入一個節點。如果一次性添加多個節點,可能能執行成功,也可能會報錯
· 只支持 IPv4 網路
· 必須使用 row-base 格式的binlog
· MGR 模式下不支持過濾指定信息的操作
來也科技在給客戶做私有部署時,如果客戶提供 MySQL 高可用環境,那麼會直接亮局頃使用客戶的環境。
否則,部署團隊將為客戶搭建三節點的 MGR 高可用架構。整體架構圖:
如圖所示,在應用和 MGR 集群的中間層選用多節點 proxysql 做路由,配置讀寫分離和故障檢測機制,確保讀寫流量分發正確。proxysql 只要有一個節點存活,即可正常提供服務。(除非扛不住壓力!)
在這種架構下,我們可以實現:
· 如臘首果主庫發生故障 -- 自動切換
· 如果從庫發生故障 -- 將其下線
對於底層的 MGR 集群,宕機一個 mysql 實例時,不影響業務正常使用;宕機兩個 mysql 實例時,集群只可讀,不可寫(因為此時已經無法滿足 paxos 的多數投票要求)
首先,我們以一個「一波三折」的場景為例,切實感受下 MGR 是如何運作的。
假設存在一個三節點的 MGR 集群,三個節點分別部署在三台實例上。
此時,應用發起一個事務執行請求。 單主模式下,只有primary node 可以接收請求:
1. primary 接受到請求後,想組所有成員同步請求,進行事務認證。事務認證包含 3 個部分:
1-1. 沖突檢測
1-2. gtid分配器
1-3. 事務組提交信息分配器
2. 如果檢測失敗
2-1. primary:回滾
2-2. secondary:丟棄 binlog event (沖突檢測時帶來的)
3. 如果檢測成功:
3-1. primary :記 binlog, 分配 GTID
3-2. secondary:將 binlog event (沖突檢測時帶來的)信息寫入 relay log
4. secondary 應用 relay log ,執行 sql ,並記錄日誌(通常情況下,我們建議將集群內所有 node 都配置在 seed 中,即:每個節點都可能成為 donor ,所以都要記 binlog)
以上,就是事務在 MGR 中完整的執行流程。
假設,運行一段時間後,其中某個 secondary 節點因伺服器宕機原因脫離集群,且長時間未被發現。直至節前巡檢時,才被報出來。
補充說明:來也監控項目已經提上日程了,部署後,便不會存在這個風險了。
此時,售後同學重啟伺服器,啟動 mysql 實例(假設順利啟動),執行 start group_replication 操作。
這個命令會執行什麼操作呢?
本地恢復:應用自己本地 relay log 中的日誌
全局恢復:從集群中活躍的節點中任選一個作為 donor,用 recovery 線程 mp 它的binlog,來恢復自己的數據
恢復線程 requestmp 建立與 donor 的復制關系,該函數攜帶了待恢復節點的 gtid_executed 信息。
donor 端逆序遍歷 binlog 文件,通過判斷 binlog 文件的 Previous-GTIDs 來找到第一個不屬於 gtid_executed 的事務,從該事務開始進行數據復制。
命令執行過後,觀察 replication_group_members 表的數據,如果目標節點的狀態是 ONLINE,則視為集群恢復成功。
但我們假設此操作並未成功,日誌中有報錯:the master has purged binary logs containing GTIDs that the slave requires
這個錯誤的意思是:節點脫離集群時間過長,已無法通過現存節點的 binlog 直接恢復了。
重做數據。當然是重做數據!
我們需要清除這個下線節點的信息,創建一個新的實例,選擇任一正常節點進行數據全量備份,並將其應用至新實例上。
全量數據恢復完成後,執行 start group_replication 命令,開啟 MGR 同步,追平數據後,MGR 會將節點狀態置為 ONLINE,然後開始正常接收流量請求。
在傳統的主從復制中,DBA 需要在 change master 時手動設置增量同步開始的 GTID(更早版本需要指定 binlog file 和 position)。
但是部署過 MGR 的同學會發現,MGR 同步時只需要指定用戶名密碼即可。那它是怎麼找點的呢?
不同的備份方式,對應著不同的找點方式,接下來我們以 mysqlmp 為例,詳細的講解下這個過程。
mysqlmp 全量數據,使用 gtid_purged 記錄備份時已經執行過的事務:
mysqlmp --set-gtid-purged=ON --single-transaction --all-databases -uroot -p -h 127.0.0.1 > mgr.sql
查看生成的 sql 文件,可以看到開始處有相關標識:
在新節點上使用如下命令清空 GTID 信息:
STOP GROUP_REPLICATION;
reset master;
接下來,應用文件 source mgr.sql,紅框圈起來的語句會被一起執行。
完成後,開啟 MGR 同步,就會自動跳過這些標識為 purged 的事務了。
當有成員加入或退出時,組會自動調整自身結構:
· 成員的加入和退出需走 paxos 協議,由多數成員同意後方可執行成功
· 如果多數節點已經處於離線狀態了,那麼不可執行主動離組操作(投票會無法通過)。
離組分為主動離組和被動離組:
· 主動離組:
只有執行 stop replication 命令才算主動離組
相當於總數變為 n-1
無論主動離組多少成員,都不會影響投票
· 被動離組:
因故障等原因導致意外下線
總數不變
影響投票
當有多數節點被動離組後,集群不可用
1. group_replication_applier:該通道用於回放本地 relay log 中的日誌。
2. group_replication_recovery:當有節點加入 Group 時,需要用到另一個復制通道 group_replication_recovery,它是一個傳統的 Master-Slave 非同步復制通道。
MGR 常見的調優方式有三種,分別是:
並行復制
壓縮
調整 GCT
如果設置了並行復制 slave_parallel_workers,那麼這些參數也要被設置,用於確保所有的組成員按照相同的順序執行並提交事務:
slave_preserve_commit_order=1
slave_parallel_type=LOGICAL_CLOCK
壓縮語句:
STOP GROUP_REPLICATION;
SET GLOBALgroup_replication_compression_threshold = 2097152;
START GROUP_REPLICATION;
超出這個指定范圍,就不壓縮了。
官方文檔中提示:當網路帶寬成為瓶頸時,通過壓縮消息,可以提高集群整體 30% - 40% 的性能。
mysql> SET GLOBAL group_replication_poll_spin_loops= 10000;
GCT接收來自組和 MGR 插件的消息,處理與仲裁和故障檢測相關的任務,發送一些保活的通訊消息,還處理 MySQLServer 與組之間傳入和傳出的事務。GCT 會等待隊列中的傳入消息。當隊列中沒有消息時,GCT將會進行等待。
在某些情況下,通過將這個等待配置得稍微長一些(進行主動等待),可以減少操作系統執行上下文切換時從處理器中換出GCT線程的次數。
常見的安全手段有兩種:
1. 控制節點白名單。設置 group_replication_ip_whitelist 參數,不再此范圍的節點,不允許加入
2. 配置 SSL:
new_member> SET GLOBAL group_replication_recovery_use_ssl=1;
new_member> SET GLOBAL group_replication_recovery_ssl_ca= '.../cacert.pem';
new_member> SET GLOBAL group_replication_recovery_ssl_cert= '.../client-cert.pem';
new_member> SET GLOBAL group_replication_recovery_ssl_key= '.../client-key.pem';
MySQL 5.7.22 之前,可能會出現數據不一致的風險。這種情況發生在成員短暫離組,在組感知前,自己又重新加入組內的時候,官方文檔描述如下:
In this situation, the rejoining member forgets its previousstate, but if other members send it messages that are intended for itspre-crash state, this can cause issues including possible data inconsistency.
To counter this possibility, from MySQL 5.7.22, servers aregiven a unique identifier when they join a group . This enables GroupReplication to be aware of the situation where a new incarnation of the sameserver (with the same address but a new identifier) is trying to join the groupwhile its old incarnation is still listed as a member. The new incarnation isblocked from joining the group until the old incarnation can be removed by areconfiguration. If Group Replication is stopped and restarted on the server,the member becomes a new incarnation and cannot rejoin until the suspiciontimes out.
精準的定位問題是解決問題和優化系統的前提!當集群故障時,我們首先要判斷集群當前處於什麼狀態,優先恢復使用,盡可能地保留現場進行故障排查和恢復。
所有節點上執行查看集群成員信息命令:
Q: 為什麼要在所有節點上執行?
A: 因為可能會發生網路分區,出現若干節點互聯,分成若干集群的情況。集群一旦分裂,互相感知不到對方存在。
以三個節點為例,常見分裂拓撲圖:
如果大多數節點存活(n=2f + 1 ) 且在同一個 group 中提供服務,我們認為,這仍是一個可用集群。
即:同一個 group 中 node 數大於 f ,且狀態都是 ONLINE 的情況下,認定集群可用。
此時,優先使用可用集群提供服務,並進行後續問題排查。
主節點提供讀寫服務,從節點提供只讀服務。
無論是應用直連,還是通過代理層(proxy 等)進行連接,當務之急都是確認主節點是誰。
命令:select MEMBER_HOST, MEMBER_PORT,MEMBER_STATE from performance_schema.replication_group_members m inner join performance_schema.global_status g on m.MEMBER_ID=g.VARIABLE_VALUE and VARIABLE_NAME = 'group_replication_primary_member';
知曉誰是主節點,誰是從節點後,應用或者代理,就可以進行相應的配置。
錯誤日誌!錯誤日誌!錯誤日誌!
有故障,第一時間查看錯誤日誌。錯誤日誌存放位置:
打開日誌文件,查看錯誤信息。
注意: 錯誤信息,不僅要在出故障的實例上查看。因為 MGR 是」大多數原則「,所以每一個實例上的錯誤信息,都可能不是完全的。
比如實例意外 down 掉,此時故障實例本身就可能來不及記錄錯誤日誌。
除了實例級別的錯誤日誌外,MGR 視圖還可能自己記錄最後的錯誤信息,通常日誌中會有相關提示。比如,日誌中存在:
[ERROR] Plugin group_replication reported: 'For details please check performance_schema.replication_connection_status table and error log messages of Slave I/O for channel group_replication_recovery.'
常見錯誤:[GCS]Connection attempt from IP address 192.168.9.208 refused
出現場景:MGR 白名單設置不正確
解決辦法:查看該實例所在的網段,是否在 MGR 的白名單中
命令:show global variables like 'group_replication_ip_whitelist';
通常我們建議直接設置成全網段訪問,由其他層(region、安全組等)控制連通性。
不排除私有部署的客戶對於安全性要求極高,要求設置指定網段訪問,那麼此時,就要查看一下實例是否存在於這個白名單中。
注意:MGR 中的節點,每個白名單配置都可能不一樣(強烈不建議!建議配置成一致的!),所以,要把集群中所有的節點都查一遍,避免出現後續問題。
常見錯誤:This member has more executed transactions than those present in the group.
出現場景:
1. 有應用直連,往裡寫數據
2. 有人誤在從庫上直接操作
3. 錯誤的恢復手段:這個最為常見
解決辦法:
1. 查看哪些數據被錯誤應用,進行相應處理
2. 找到最後同步的 GTID 位點
3. reset master
4. 設置最後 gtid_purged 為要繼續同步的 GTID 位點
常見錯誤:Member was expelled from the group e to network failures, changing member status to ERROR
出現場景:網路延遲
解決方法:等待網路恢復正常後,重新加入集群即可
常見錯誤:the master has purged binary logs containing GTIDs that the slave requires
出現場景:從庫脫離群組時間太長,無法通過已有的 binlog 進行恢復了
解決方法:重做數據(mysqlmp 或 xtrabackup)後,加入群組
select TABLE_SCHEMA, TABLE_NAME from information_schema.tables where TABLE_SCHEMA not in ('information_schema','mysql', 'performance_schema', 'test', 'sys') and TABLE_NAME not in (select table_name from information_schema.TABLE_CONSTRAINTS where TABLE_SCHEMA not in ('information_schema','mysql', 'performance_schema', 'test', 'sys') and CONSTRAINT_TYPE = 'PRIMARY KEY');
select TABLE_SCHEMA, TABLE_NAME from information_schema.tables where TABLE_SCHEMA not in ('information_schema','mysql', 'performance_schema', 'test', 'sys') and engine <> 'InnoDB';
本文作者、編輯:劉桐烔
歡迎大家點贊、在看、關注~
『叄』 SQL查詢語句
SQL查詢語句大全
SQL語句無論是種類還是數量都是繁多的,很多語句也是經常要用到的,SQL查詢語句就是一個典型的例子,無論是高級查詢還是低級查詢,SQL查詢語句的需求是最頻繁的。那麼SQL查詢語句有哪些?下面跟我一起來看看吧!
一、簡單查詢語句
1. 查看錶結構
SQL>DESC emp;
2. 查詢所有列
SQL>SELECT * FROM emp;
3. 查詢指定列
SQL>SELECT empmo, ename, mgr FROM emp;
SQL>SELECT DISTINCT mgr FROM emp; 只顯示結果不同的項
4. 查詢指定行
SQL>SELECT * FROM emp WHERE job='CLERK';
5. 使用算術表達式
SQL>SELECT ename, sal*13+nvl(comm,0) FROM emp;
nvl(comm,1)的意思是,如果comm中有值,則nvl(comm,1)=comm; comm中無值,則nvl(comm,1)=0。
SQL>SELECT ename, sal*13+nvl(comm,0) year_sal FROM emp; (year_sal為別名,可按別名排序)
SQL>SELECT * FROM emp WHERE hiredate>'01-1月-82';
6. 使用like操作符(%,_)
%表示一個或多個字元,_表示一個字元,[charlist]表示字元列中的任何單一字元,[^charlist]或者[!charlist]不在字元列中的任何單一字元。
SQL>SELECT * FROM emp WHERE ename like 'S__T%';
7. 在where條件中使用In
SQL>SELECT * FROM emp WHERE job IN ('CLERK','ANALYST');
8. 查詢欄位內容為空/非空的語句
SQL>SELECT * FROM emp WHERE mgr IS/IS NOT NULL;
9. 使用邏輯操作符號
SQL>SELECT * FROM emp WHERE (sal>500 or job='MANAGE') and ename like 'J%';
10. 將查詢結果按欄位的值進行排序
SQL>SELECT * FROM emp ORDER BY deptno, sal DESC; (按部門升序,並按薪酬降序)
二、復雜查詢
1. 數據分組(max,min,avg,sum,count)
SQL>SELECT MAX(sal),MIN(age),AVG(sal),SUM(sal) from emp;
SQL>SELECT * FROM emp where sal=(SELECT MAX(sal) from emp));
SQL>SELEC COUNT(*) FROM emp;
2. group by(用於對查詢結果的分組統計) 和 having子句(用於限制分組顯示結果)
SQL>SELECT deptno,MAX(sal),AVG(sal) FROM emp GROUP BY deptno;
SQL>SELECT deptno, job, AVG(sal),MIN(sal) FROM emp group by deptno,job having AVG(sal)<2000;
對於數據分組的總結:
a. 分組函數只能出現在選擇列表、having、order by子句中(不能出現在where中)
b. 如果select語句中同時包含有group by, having, order by,那麼它們的順序是group by, having, order by。
c. 在選擇列中如果有列、表達式和分組函數,那麼這些列和表達式必須出現在group by子句中,否則就是會出錯。
使用group by不是使用having的前提條件。
3. 多表查詢
SQL>SELECT e.name,e.sal,d.dname FROM emp e, dept d WHERE e.deptno=d.deptno order by d.deptno;
SQL>SELECT e.ename,e.sal,s.grade FROM emp e,salgrade s WHER e.sal BETWEEN s.losal AND s.hisal;
4. 自連接(指同一張表的連接查詢)
SQL>SELECT er.ename, ee.ename mgr_name from emp er, emp ee where er.mgr=ee.empno;
5. 子查詢(嵌入到其他sql語句中的select語句,也叫嵌套查詢)
5.1 單行子查詢
SQL>SELECT ename FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH');查詢表中與smith同部門的人員名字。因為返回結果只有一行,所以用「=」連接子查詢語句
5.2 多行子查詢
SQL>SELECT ename,job,sal,deptno from emp WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno=10);查詢表中與部門號為10的工作相同的員工的姓名、工作、薪水、部門號。因為返回結果有多行,所以用「IN」連接子查詢語句。
in與exists的區別: exists() 後面的子查詢被稱做相關子查詢,它是不返回列表的值的。只是返回一個ture或false的結果,其運行方式是先運行主查詢一次,再去子查詢里查詢與其對 應的結果。如果是ture則輸出,反之則不輸出。再根據主查詢中的每一行去子查詢里去查詢。in()後面的子查詢,是返回結果集的,換句話說執行次序和 exists()不一樣。子查詢先產生結果集,然後主查詢再去結果集里去找符合要求的欄位列表去。符合要求的輸出,反之則不輸出。
5.3 使用ALL
SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ALL (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MAX(sal) FROM emp WHERE deptno=30);查詢工資比部門號為30號的所有員工工資都高的員工的姓名、薪水和部門號。以上兩個語句在功能上是一樣的,但執行效率上,函數會高 得多。
5.4 使用ANY
SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MIN(sal) FROM emp WHERE deptno=30);查詢工資比部門號為30號的任意一個員工工資高(只要比某一員工工資高即可)的員工的姓名、薪水和部門號。以上兩個語句在功能上是 一樣的,但執行效率上,函數會高得多。
5.5 多列子查詢
SQL>SELECT * FROM emp WHERE (job, deptno)=(SELECT job, deptno FROM emp WHERE ename='SMITH');
5.6 在from子句中使用子查詢
SQL>SELECT emp.deptno,emp.ename,emp.sal,t_avgsal.avgsal FROM emp,(SELECT emp.deptno,avg(emp.sal) avgsal FROM emp GROUP BY emp.deptno) t_avgsal where emp.deptno=t_avgsal.deptno AND emp.sal>t_avgsal.avgsal ORDER BY emp.deptno;
5.7 分頁查詢
資料庫的每行數據都有一個對應的行號,稱為rownum.
SQL>SELECT a2.* FROM (SELECT a1.*, ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal) a1 WHERE ROWNUM<=10) a2="" where="" rn="">=6;
指定查詢列、查詢結果排序等,都只需要修改最里層的子查詢即可。
5.8 用查詢結果創建新表
SQL>CREATE TABLE mytable (id,name,sal,job,deptno) AS SELECT empno,ename,sal,job,deptno FROM emp;
5.9 合並查詢(union 並集, intersect 交集, union all 並集+交集, minus差集)
SQL>SELECT ename, sal, job FROM emp WHERE sal>2500 UNION(INTERSECT/UNION ALL/MINUS) SELECT ename, sal, job FROM emp WHERE job='MANAGER';
合並查詢的執行效率遠高於and,or等邏輯查詢。
5.10 使用子查詢插入數據
SQL>CREATE TABLE myEmp(empID number(4), name varchar2(20), sal number(6), job varchar2(10), dept number(2)); 先建一張空表;
SQL>INSERT INTO myEmp(empID, name, sal, job, dept) SELECT empno, ename, sal, job, deptno FROM emp WHERE deptno=10; 再將emp表中部門號為10的數據插入到新表myEmp中,實現數據的批量查詢。
5.11 使用了查詢更新表中的數據
SQL>UPDATE emp SET(job, sal, comm)=(SELECT job, sal, comm FROM emp where ename='SMITH') WHERE ename='SCOTT';
簡介
SQL語言1974年由Boyce和Chamberlin提出,並首先在IBM公司研製的關系資料庫系統SystemR上實現。由於它具有功能豐富、使用方便靈活、語言簡潔易學等突出的優點,深受計算機工業界和計算機用戶的歡迎。1980年10月,經美國國家標准局(ANSI)的資料庫委員會X3H2批准,將SQL作為關系資料庫語言的美國標准,同年公布了標准SQL,此後不久,國際標准化組織(ISO)也作出了同樣的決定。
SQL從功能上可以分為3部分:數據定義、數據操縱和數據控制。
SQL的核心部分相當於關系代數,但又具有關系代數所沒有的許多特點,如聚集、資料庫更新等。它是一個綜合的、通用的、功能極強的關系資料庫語言。其特點是:
1、數據描述、操縱、控制等功能一體化。
2、兩種使用方式,統一的語法結構。SQL有兩種使用方式。一是聯機交互使用,這種方式下的SQL實際上是作為自含型語言使用的。另一種方式是嵌入到某種高級程序設計語言(如C語言等)中去使用。前一種方式適合於非計算機專業人員使用,後一種方式適合於專業計算機人員使用。盡管使用方式不向,但所用語言的語法結構基本上是一致的。
3、高度非過程化。SQL是一種第四代語言(4GL),用戶只需要提出「干什麼」,無須具體指明「怎麼干」,像存取路徑選擇和具體處理操作等均由系統自動完成。
4、語言簡潔,易學易用。盡管SQL的'功能很強,但語言十分簡潔,核心功能只用了9個動詞。SQL的語法接近英語口語,所以,用戶很容易學習和使用。
功能
SQL具有數據定義、數據操縱、和數據控制的功能。
1、SQL數據定義功能:能夠定義資料庫的三級模式結構,即外模式、全局模式和內模式結構。在SQL中,外模式又叫做視圖(View),全局模式簡稱模式(Schema),內模式由系統根據資料庫模式自動實現,一般無需用戶過問。
2、SQL數據操縱功能:包括對基本表和視圖的數據插入、刪除和修改,特別是具有很強的數據查詢功能。
3、SQL的數據控制功能:主要是對用戶的訪問許可權加以控制,以保證系統的安全性。
語句結構
結構化查詢語言包含6個部分:
1、數據查詢語言(DQL: Data Query Language):其語句,也稱為「數據檢索語句」,用以從表中獲得數據,確定數據怎樣在應用程序給出。保留字SELECT是DQL(也是所有SQL)用得最多的動詞,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其它類型的SQL語句一起使用。
2、數據操作語言(DML:Data Manipulation Language):其語句包括動詞INSERT、UPDATE和DELETE。它們分別用於添加、修改和刪除。
3、事務控制語言(TCL):它的語句能確保被DML語句影響的表的所有行及時得以更新。包括COMMIT(提交)命令、SAVEPOINT(保存點)命令、ROLLBACK(回滾)命令。
4、數據控制語言(DCL):它的語句通過GRANT或REVOKE實現許可權控制,確定單個用戶和用戶組對資料庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對表單個列的訪問。
5、數據定義語言(DDL):其語句包括動詞CREATE,ALTER和DROP。在資料庫中創建新表或修改、刪除表(CREATE TABLE 或 DROP TABLE);為表加入索引等。
6、指針控制語言(CCL):它的語句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用於對一個或多個表單獨行的操作。
語言特點
SQL風格統一
SQL可以獨立完成資料庫生命周期中的全部活動,包括定義關系模式、錄入數據、建立資料庫、査詢、更新、維護、資料庫重構、資料庫安全性控制等一系列操作,這就為資料庫應用系統開發提供了良好的環境,在資料庫投入運行後,還可根據需要隨時逐步修改模式,且不影響資料庫的運行,從而使系統具有良好的可擴充性。
高度非過程化
非關系數據模型的數據操縱語言是面向過程的語言,用其完成用戶請求時,必須指定存取路徑。而用SQL進行數據操作,用戶只需提出「做什麼」,而不必指明「怎麼做」,因此用戶無須了解存取路徑,存取路徑的選擇以及SQL語句的操作過程由系統自動完成。這不但大大減輕了用戶負擔,而且有利於提高數據獨立性。
面向集合的操作方式
SQL採用集合操作方式,不僅查找結果可以是元組的集合,而且一次插入、刪除、更新操作的對象也可以是元組的集合。
以同一種語法結構提供兩種使用方式
SQL既是自含式語言,又是嵌入式語言。作為自含式語言,它能夠獨立地用於聯機交互的使用方式,用戶可以在終端鍵盤上直接輸入SQL命令對資料庫進行操作。作為嵌入式語言,SQL語句能夠嵌入到高級語言(如C、C#、JAVA)程序中,供程序員設計程序時使用。而在兩種不同的使用方式下,SQL的語法結構基本上是一致的。這種以統一的語法結構提供兩種不同的操作方式,為用戶提供了極大的靈活性與方便性。
語言簡潔,易學易用
SQL功能極強,但由於設計巧妙,語言十分簡潔,完成數據定義、數據操縱、數據控制的核心功能只用了9個動詞:CREATE、ALTER、DROP、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE。且SQL語言語法簡單,接近英語口語,因此容易學習,也容易使用。
;『肆』 SQL建表問題.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dept]
(
deptno VARCHAR(2) NOT NULL ,
dname VARCHAR(10) NOT NULL ,
loc VARCHAR(10) NOT NULL ,
CONSTRAINT PK_dept PRIMARY KEY CLUSTERED ( deptno ASC )
WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 70 ) ON [FG_EP]
)
ON [FG_EP]
GO
CREATE TABLE emp
(
empno CHAR(4) NOT NULL ,
ename VARCHAR(10) NOT NULL ,
job VARCHAR(10) NOT NULL ,
mgr CHAR(4) NOT NULL ,
hiredate DATETIME NOT NULL ,
sal SMALLMONEY NOT NULL ,
comm SMALLMONEY NOT NULL ,
deptno VARCHAR(2) NOT NULL ,
CONSTRAINT PK_emp PRIMARY KEY CLUSTERED ( empno ASC ) ,
CONSTRAINT CK_sal CHECK ( sal > 0 )
)
ON [FG_EP]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE emp WITH CHECK ADD CONSTRAINT FK_deptno FOREIGN KEY(deptno)
REFERENCES [dept] (deptno)
GO
ALTER TABLE emp CHECK CONSTRAINT FK_deptno
GO
『伍』 資料庫基礎-SQL查詢語句8條,幫忙寫下。
1
select deptno,max(salary) from dbo.emp
2
select b.ename,a.dname,b.salary
from dbo.dept a inner join dbo.emp b on a.deptno=b.deptno
3
select b.ename,a.dname,b.salary
from dbo.dept a left join dbo.emp b on a.deptno=b.deptno
4
select b.ename,b.salary
from dbo.dept a inner join dbo.emp b on a.deptno=b.deptno and a.dname='開發部'
5
select a.ename,a.salary,b.ename,b.salary
from dbo.emp a left join dbo.emp b on a.mgr=b.empno
6
select esex,count(*) from dbo.emp group by esex
7
select * from dbo.emp where deptno between 2 and 4 union all
select * from dbo.emp where empno between 2 and 8
8
select empno,ename,deptno,salary into newemp from dbo.emp
『陸』 1. MGR簡介 | 深入淺出MGR
MGR是MySQL Group Replication的縮寫,即MySQL組復制。
在以往,我們一般是利用MySQL的主從復制或半同步復制來提供高可用解決方案,但這存在以下幾個比較嚴重的問題:
因為上述幾個明顯的缺點,因此MySQL推出了全新的高可用解決方案 -- 組復制,這是本系列文章要著重介紹的新特性。
MGR是MySQL 5.7.17開始引入的,但隨著5.7版本逐漸退出歷史舞台(MySQL 5.7已於2020年10月起不再做大的功能更新,只有修修補補以及針對安全更新),更多MGR相關特性都只在MySQL 8.0上才有。
因此,如果線上還有基於MySQL 5.7版本的MGR環境的話,建議盡快升級、遷移到MySQL 8.0版本。進一步提醒,推薦MySQL 8.0.22及之後的版本,整體會更穩定可靠,也有些很不錯的新功能(不只是MGR方面的)。
MGR具備以下幾個特點:
MGR可以選擇單主(Single-Primary)模式
如上圖所示,一開始S1節點是Primary角色,提供讀寫服務。當它發生故障時,剩下的S2-S5節點會再投票選舉出S2作為新的Primary角色提供讀寫服務,而S1節點再達到一定超時閾值後,就會被踢出。
亦可選擇多主(Multi-Primary)模式(再次 強烈建議選用單主模式 )
如上圖所示,一開始S1-S5所有節點都是Primary角色,都可以提供讀寫服務,任何一個節點發生故障時,只需要把指向這個節點的流量切換下就行。
上述兩種架構模式下,應用端通過MySQL Router連接後端在MGR服務,當後端節點發生切換時,Router會自動感知,對應用端來說幾乎是透明的,影響很小,架構上也更靈活。
首先來個MGR的技術架構圖:
MGR是以Plugin方式嵌入MySQL,部署更靈活方便。
事務從Server層通過鉤子(hook)進入MGR API介面層,再分發到各組件層,在組件層完成事務Capture/Apply/Recover,通過復制協議層(Replication Protocol Logics)傳輸事務,最後經由GCS協調事務在各節點的最終一致性。
MGR節點間由組通信系統(GCS)提供支持,它提供了故障檢測機制、組成員角色管理,以及安全且有序的消息傳遞,這些機制可確保在各節點間一致地復制數據。這項技術的核心是Paxos演算法的實現,在MySQL里稱之為XCom,由它充當MGR的通信引擎。
對於要提交的事務,組中的多數派節點必須就全局事務序列中前念行給定的事務順序達成一致。各節點做出決定提交或中止事務的選擇,但所有節點都要做出相同的決定。如果發生網路分區,導致節點間無法達成一致決定,則在網路恢復前,MGR無法工作。
MGR支持單主和多主兩種模式,在單主模式下,各節點會自動選定主節點,只有該主節點能同時讀寫,而其他(從)節點只能只讀。在多主模式下,所有節點都可以進行讀寫。
相對於MariaDB Galera Cluster(以高雀及基於此技術的Percona XtraDB Cluster,下面為了書寫方便,都統稱為PXC),個人慧嘩認為MGR具備以下幾個優勢:
相對於傳統主從復制(Replication),我認為MGR的優勢有以下幾點:
以上是我根據MySQL、MariaDB、Percona的資料整理得到的觀點,不一定準確和全面,有不完善的地方還請留言指正。
本節主要介紹了什麼是MGR,MGR的技術架構概要,以及MGR相對PXC的幾個技術優勢。
MGR是MySQL四部戰略走的關鍵一環,依靠MGR和MySQL Shell、MySQL Router已實現了讀節點擴展,以及寫節點擴展(MGR多主模式),下一步預計實現sharding,讓我們拭目以待。
相信MGR也是MySQL未來幾年的重頭戲,建議跟緊方向,不要錯過這班列車。
因個人水平有限,專欄中難免存在錯漏之處,請勿直接復制文檔中的命令、方法直接應用於線上生產環境。請讀者們務必先充分理解並在測試環境驗證通過後方可正式實施,避免造成生產環境的破壞或損害。
Enjoy GreatSQL :)
『柒』 SQL這道題怎麼做
SELECT ename, mgr FROM emp WHERE mgr<>''
『捌』 用SQL如何列出所有員工的姓名及其直接上級的姓名
select Table1.ename Table2.ename from emp Table1,emp Table2 where Table1.mgr=Table2 .empno 追問: 嗯是的呢 回答: 上面的不能運行嗎?我在Sql Server裡面測試過了沒問題的。 提問者 的感言: 嗯可以了 你這個意思我大概明白了 也算比較好懂 麻煩你了 2009-08-24其他回答(4) 熱心問友 2009-08-24差不多 追問: 可是不能出結果啊 高手幫忙看看 回答: 查詢上級表中是否存在員工的名稱么 補充: 欄位沒問題么 追問: 當然有的 可是不知道如何查詢簡單的就是select mgr,ename from emp可是規定要用子查詢來寫還是不能太熟練的掌握 麻煩指點指點 回答: 我是說你的員工姓名的欄位在 上級表中是否存在或是 關聯 主外鍵關系 ? 追問: 不存在的 回答: 什麼不存在的啊 ...附耳細說6級2009-08-24不對select ename (select *** from *** where ****** ) mgr from emp derek9級2009-08-24 select emp.ename,emp1.ename as mgrename
from emp left outer join (select empno from mgr) emp1
on emp.mgr=emp1.empno 補充: 忘了取ename,改成
select emp.ename,emp1.ename as mgrename
from emp left outer join (select empno,ename from mgr) emp1
on emp.mgr=emp1.empno
考慮有的emp可能沒有上級
『玖』 sql 自身連接查詢問題
我在這給你個例子(參照oracle資料庫中scott用戶中emp表),你自己看一下,如果不懂你再問
select
w.ename||'的上司是'兄春睜||m.ename
from
emp
m,emp
w
where
m.empno=w.mgr
and
w.ename='SMITH'
;
empno是員工編號
mgr員森和工對應上羨歲司編號
ename員工名稱
『拾』 sql中查出兩個日期之間的數據
查出兩個日期之間的數據的sql示例:
select * from table_name where date>'2010-1-1' and data<'2010-5-1';
其中table_name是表名,date是日期欄位,and符號表示且,連接兩個日期表示既滿足大於2010-1-1又滿足小於2010-5-1,在兩個之間的數據。
(10)mgrsql擴展閱讀
常用查詢sql語句介紹:
1、查看錶結構
SQL>DESC emp;
2、 查詢所有列
SQL>SELECT * FROM emp;
3、查詢指定列
SQL>SELECT empmo, ename, mgr FROM emp;
SQL>SELECT DISTINCT mgr FROM emp; 只顯示結果不同的項
4、 查詢指定行
SQL>SELECT * FROM emp WHERE job='CLERK';
5、使用算術表達式
SQL>SELECT ename, sal*13+nvl(comm,0) FROM emp;