《MySQL是怎樣運行的:從根兒上理解 MySQL》是一本MySQL的底層運行原理的書。關(guān)于底層運行原理4個字怎么理解呢,我的理解是專注于介紹 MySQL 的 innoDB的底層存儲細節(jié),并以此為基礎(chǔ)延伸到分析MySQL 實際應(yīng)用中的特性。
藤縣網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
相比極客時間里面的《MySQL 實戰(zhàn)45講》,我覺得這本書更像電視劇《一代宗師》里面講到的里子而非面子,更聚焦于事情的本質(zhì)而非表象,所以非常推薦大家耐心閱讀。我是3.28號收到的書,在上下班的路上斷斷續(xù)續(xù)完成了閱讀(這就是上下班需要花3個小時的好處),所謂的斷斷續(xù)續(xù)就是每個點都了解了,但是沒有串成線形成面。今天剛好周六就抽了一下午加一晚上把所有的內(nèi)容從頭到位又串聯(lián)了一次,整體下來差不多花了兩周時間才消化完。
為啥對 MySQL突然來了興趣呢,緣于2021年底以來公司內(nèi)部組織了兩場分享,當時聽完分享后針對分享的PPT消化了一波,但是總感覺不得勁。雖然理解了分享中部分場景但卻無法理解背后的原理,所以斷斷續(xù)續(xù)在網(wǎng)上搜集些介紹 MySQL 的書籍就發(fā)現(xiàn)了這本書,閱讀后再重新回顧之前的分享,感覺突然開竅了。
梳理了下整個書本的內(nèi)容,按照個人的理解給出閱讀的建議,首先這部分的內(nèi)容其實挺多的,但是建議聚焦于幾條核心的線:innoDB的數(shù)據(jù)存儲,索引的設(shè)計和應(yīng)用,redo/undo 日志以及 mvcc 的原理。
關(guān)于 innoDB 的存儲,這部分建議閱讀章節(jié): 從一條記錄說起—— InnoDB 記錄結(jié)構(gòu)、盛放記錄的大盒子 —— InnoDB 數(shù)據(jù)頁結(jié)構(gòu)、 調(diào)節(jié)磁盤和CPU的矛盾 —— InnoDB 的 Buffer Pool》。這三個章節(jié)按照數(shù)據(jù)存儲由微觀到宏觀的順序進行講解:單條記錄的存儲結(jié)構(gòu)、頁維度的存儲結(jié)構(gòu)、Buffer Pool 的存儲結(jié)構(gòu)等。
索引的設(shè)計和應(yīng)用,這部分閱讀建議建立在innoDB的存儲相關(guān)章節(jié)已經(jīng)完成閱讀的基礎(chǔ)上,相關(guān)章節(jié)包括: 快速查詢的秘籍 —— B+ 樹索引、 好東西也得先學會怎么用 —— B+ 樹索引的使用。這兩個章節(jié)介紹索引的存儲結(jié)構(gòu)以及實際應(yīng)用,跟日常工作比較有強關(guān)聯(lián)性。
redo/undo 日志以及 mvcc 的原理,這部分建議閱讀章節(jié): 說過的話就一定要辦到 —— redo 日志(上)、 說過的話就一定要辦到 —— redo 日志(下)、 后悔了怎么辦 —— undo 日志 (上)、 后悔了怎么辦 —— undo 日志 (下)、 一條記錄的多幅面孔 —— 事務(wù)的隔離級別與MVCC。這幾個章節(jié)主要是為了講清楚 MVCC 的底層實現(xiàn)原理。
最后推薦對 MySQL 有興趣的同學可以買來翻翻看,收獲肯定是有的。
查詢語句:select 語句
三種能力:投影、選擇、連接
投影:在一張二維表中根據(jù)所需要的條件選出所需要的列
選擇:在二維表中根據(jù)所需的條件選擇合適的行
連接:從一張或者多張表中獲取所需要的行,并且把這個行結(jié)合在一起的查詢
SQL語句大小寫不敏感。
select語句是可以計算的
算術(shù)表達式和運算符優(yōu)先級
舉例:select ename,sal 12*sal+100 from emp
計算出年薪+100塊
NULL值是不可用,且未分配的,未知并且不適用的值,可以當成是保留值
AS其實可以省略
例如:select ename as name,sal salary from emp;
查詢出的字段會自動換成別名
例子:select ename "Name",sal*12 "Annual Salary" from emp;
級聯(lián)操作是將列或字符串和其他列串聯(lián),由兩條豎線(||)表示
select ename,job,ename || job as "Employees" from emp;
可以看出Employees就將ENAME和JOB進行結(jié)合的一個操作
在select句子中適用DISTINCT 關(guān)鍵字消除重復行
select distinct deptnp from emp;
限制選擇的行:
where關(guān)鍵字
如果where后面查的數(shù)據(jù)是字符串類型或者日期類型的要加''號
#######比較條件
舉幾個例子:
select ename,job,sal,deptno from emp where sal between 5000 and 10000;
這個是包含了5000和10000的
in的表達:
select empno,ename,mgr,deptno from emp where mgr in (7788,7782,7000);
只要mgr有括號里面的值都顯示出來。
通配符:%通配的是多個字符,_通配的是一個字符
IS NULL是查詢某個字段為空的顯示出來
and、or、not
例子:
查詢sal=2000和job的內(nèi)容是包括MAN字符串的,當同時滿足兩個條件時候才返回結(jié)果。
and就是兩邊同時為真,or的話是有一邊為真就行,not就是不等于
ASC 升序,默認升序
DESC 降序
例子:
將deptno中進行升序排列,排列出來后,在將sal進行降序排列。
單行函數(shù):就是對單行數(shù)據(jù)進行處理的函數(shù),只針對這一條數(shù)據(jù)得出一個結(jié)果
函數(shù)工作的過程
ROUND(45.926,2)是將45.926這個數(shù)字的小數(shù)點后兩位進行四舍五入操作得到45.93
TRUNC(45.926,2) 是將45.926這個數(shù)字的小數(shù)點后兩位后面的進行丟掉。
返回當前系統(tǒng)日期
經(jīng)常是不同類型之間的轉(zhuǎn)換
TO_CHAR就是將日期型數(shù)字型轉(zhuǎn)換成字符型
例子:
數(shù)字型的轉(zhuǎn)換
把字符轉(zhuǎn)換成數(shù)字:
把字符轉(zhuǎn)換成日期:
什么是分組函數(shù)?
另外的名字叫多行函數(shù),針對于多行數(shù)據(jù)進行一個匯總處理的一類函數(shù),最后會得到一個匯總的結(jié)果。
例子:
其實就是對一系列數(shù)據(jù)找最大值
基本格式:select group_function(column),... from table [where condition];
首先對一個數(shù)據(jù)進行分類匯總把每一組的數(shù)據(jù)單獨的拿出來。就是對每一列數(shù)據(jù)的相同數(shù)據(jù)進行一個分組,然后在將分組后的結(jié)果再去執(zhí)行select后面跟的一個分組函數(shù)的操作。
例子:
那下面這樣的怎么操作呢?
其實就是對分組以后的結(jié)果再次進行一個限制篩選
where和Having的區(qū)別?
where是針對于整體的一個查詢結(jié)果
Having是針對于分組后的查詢結(jié)果的一個條件限制,它是不能單獨存在的,它只能夠在group by后面
下面是它的表達式:
顯示部門的最大平均薪水是多少
select max(avg(sal))
是這樣的一個嵌套
當我們查的數(shù)據(jù)存在于多個表的時候就需要多表查詢
下面是用到的表
一個是EMP的職員表、一個是DEPT的部分表
表連接的三種方式:
從總類上來看:自連接、等值連接、外連接(又可以分為三類:左連接、右連接、全連接)
自連接:一個表自己與自己建立連接成為自連接或自身連接。
在查詢的時候多表,這兩張表是同一張表,所以在查詢前我們需要對這個表進行一個別名的重命名。
舉例:查詢出員工編號、名字及其經(jīng)理名字
MGR對應(yīng)的是經(jīng)理的ID號,這個對應(yīng)的就是另一張經(jīng)理表中的名字
表示比較連接列的值顯示出最終的一個結(jié)果,其查詢結(jié)果中列出被連接表中的所有列,包括其中的重復列。
查詢員工的姓名 工作 部門號 部門名稱
左連接就是返回左邊的匹配行,不考慮右邊的表是否有相應(yīng)的行
(+)的意思就是dept是個匹配表,左邊是一個基礎(chǔ)表,基礎(chǔ)表優(yōu)先,如果右邊這個表找不到對應(yīng)的值去匹配,會自動填空
右連接就是返回右邊的匹配行,不考慮左邊的表是否有相應(yīng)的行,如果沒有會自動填空
左表右表都不做限制,所有的記錄都顯示,不足的地方用null填充
FULL JOIN表示emp和dept做一個全連接
ON表示觸發(fā)條件 。
關(guān)于JavaWeb增刪改查的簡單總結(jié) 原創(chuàng)
2020-04-25 13:14:49
走到天涯海角
碼齡4年
關(guān)注
增刪改查中最簡單的功能是刪除,通過Id來刪除單表或者多表都是可以的。
增刪改查中最重要的功能是查詢,因為不僅僅是單表查詢、連表查詢需要用到查詢,新增前和修改前也要使用到查詢。
查詢遇到的業(yè)務(wù)比如:
1.登錄:通過查詢用戶名和密碼來找出用戶,密碼可以重復,但是用戶名必須唯一,否則沒辦法找出單個用戶。
(重要) 只要查詢的字段是唯一的,都可以通過這個字段來查詢出對應(yīng)的單個對象或者集合。
什么字段是唯一的呢?
如:用戶名必須唯一,文件名必須唯一,主鍵ID必須唯一等等,一時半會想不起來。
新增前,通過查詢獲得如:下拉框中的數(shù)據(jù)等
在新增時,通過獲取下拉框的值或者輸入框的值,就可以保存新增。
新增也會遇到循環(huán)插入的情況,如新增角色和修改角色,要循環(huán)插入數(shù)據(jù)到角色菜單關(guān)系表中。
循環(huán)插入數(shù)據(jù)的做法,我是用過兩種方法,一種方法是使用c3p0,另一種是使用mybatis的foreach標簽
修改前,通過查詢,獲得如:用戶的信息,然后放到修改輸入框,提高用戶的使用體驗。
修改時,通過隱藏區(qū)的Id,和輸入框或者下拉框中的值,來進行保存修改。
文章知識點與官方知識檔案匹配
Java技能樹首頁概覽
92024 人正在系統(tǒng)學習中
打開CSDN APP,看更多技術(shù)內(nèi)容
JavaWeb實現(xiàn)簡單對數(shù)據(jù)庫的增刪改查_向晚而生的博客_web實現(xiàn)數(shù)...
數(shù)據(jù)庫:MySQL 連接池:Druid連接池 Github倉庫地址:點我 jar包下載:點我!提取碼:y4ef 參考:Javaweb實現(xiàn)增刪改查操作操作 用JavaWeb部分知識實現(xiàn)對數(shù)據(jù)庫的增刪改查 只展示Student和Teacher的相關(guān)代碼 一、效果圖 二、數(shù)據(jù)庫實現(xiàn) 1. ...
繼續(xù)訪問
Web對數(shù)據(jù)庫的增刪改查(servlet+jsp+javaBean增刪改查)
1.開始之前的準備(servlet+jsp+javaBean增刪改查) jsp:頁面的請求和展示 在前臺主要學了jsp進行頁面的請求和展示 java后臺 mysql數(shù)據(jù)庫 學習了java如何進行數(shù)據(jù)庫增刪改查 JDBC重構(gòu)Dao Dao進行sql語句 將數(shù)據(jù)庫的獲取結(jié)果響應(yīng)到頁面上 ...
繼續(xù)訪問
最新發(fā)布 javaweb極簡登錄注冊增刪改查
javaweb極簡登錄注冊增刪改查
繼續(xù)訪問
簡單的JavaWeb項目,基本的增刪改查和分頁查詢等功能。
簡單的JavaWeb項目,劉意老師整理,擁有登錄,添加,刪除,修改,分頁查詢,刪除選中,復雜分頁查詢功能。
JavaWeb階段案例--簡易版管理圖書系統(tǒng)(增刪改查)
超詳細JavaWeb階段項目 --圖書管理系統(tǒng) -- 連接數(shù)據(jù)庫在網(wǎng)頁上實現(xiàn)圖書的增刪改查
繼續(xù)訪問
筆記--MySQL相關(guān)操作
一 登錄數(shù)據(jù)庫 1 用戶無密碼: mysql -uroot -p mysql- 2 用戶有密碼: MySQL -root -p[passwd] mysql- 二 創(chuàng)建數(shù)據(jù)庫: 查詢: mysql show databases; +--------------------+ | Database ...
繼續(xù)訪問
Javaweb--通過網(wǎng)頁實現(xiàn)對數(shù)據(jù)庫的增刪查改
文章目錄Javaweb--通過網(wǎng)頁實現(xiàn)對數(shù)據(jù)庫的增刪查改1、功能需求2、技術(shù)選型2、最終效果圖3、數(shù)據(jù)庫準備4、前端開發(fā)5、后端開發(fā) Javaweb–通過網(wǎng)頁實現(xiàn)對數(shù)據(jù)庫的增刪查改 通常在寫一些后臺管理系統(tǒng)的時候,一定會有關(guān)于數(shù)據(jù)表格的增刪查改的功能實現(xiàn)。最近也是閑來無事,做了這個小案例,希望能幫到有寫這方面需求的朋友們。 1、功能需求 ??這次以單個的員工數(shù)據(jù)表為例,實現(xiàn)以下功能需求: ??1、能夠正常從數(shù)據(jù)庫中讀取相應(yīng)數(shù)據(jù)。 ??2、設(shè)置分頁,能夠通過點擊頁碼,進行數(shù)據(jù)更新,同時支持輸入頁碼更新數(shù)據(jù)
繼續(xù)訪問
讓我們在網(wǎng)頁中實現(xiàn)數(shù)據(jù)庫的增刪改查~
目錄主要思路首先讓我們鏈接自己的數(shù)據(jù)庫 index.js對數(shù)據(jù)庫設(shè)定一些用戶規(guī)則 user.js做一個添加數(shù)據(jù)的靜態(tài)網(wǎng)頁 add.html做一個主頁面 list.html最最最主要的js代碼自我激勵 主要思路 搭建網(wǎng)站服務(wù)器,實現(xiàn)客戶端與服務(wù)器端的通信 連接數(shù)據(jù)庫, 創(chuàng)建用戶集合, 向集合中插入文檔 當用戶訪問 /list時,將所有用戶信息查詢出來 1.實現(xiàn)路由功能 1.呈現(xiàn)用戶列表頁面 1. 再點擊修改按鈕的時 將用戶ID傳遞到當前頁面 2. 從數(shù)據(jù)庫中查詢當前用戶信息 將用戶信息展示到頁面中 2.從數(shù)據(jù)
繼續(xù)訪問
JavaWeb 增刪改查快速開發(fā)總結(jié)
JavaWeb增刪改查基本都是那一套,其中最繁瑣 變動的便是圍繞SQL語句、Servlet來展開,下面是我對這些左到一個小總結(jié),希望能對您有所幫助首先項目搭建好之后就是最關(guān)鍵的SQL語句 Servlet代碼 Servlet方法 然后是前端methods()方法 刪除和批量刪除(這里用element做了個刪除提示)...
繼續(xù)訪問
Java web階段學習總結(jié)(華清遠見)
經(jīng)過web前端的學習之后,我們開啟了Java web后端的學習。學習一樣新的東西首先要了解它的原理,以及所要具備的一些條件。對于Servlet 的開發(fā)步驟一般有:新建一個Java web項目工程 -- 創(chuàng)建servlet類繼承Http Servlet,重寫service方法 -- 在web.xml中做地址映射 -- 打包 -- 部署 -- 啟動容器。這樣就可以在瀏覽器中訪問web程序。了解步驟之后就可以動手敲了。
繼續(xù)訪問
javaWeb反思與總結(jié)
javaWeb的回顧總結(jié)
繼續(xù)訪問
javaweb mysql增刪改查_超詳細的JavaWeb用戶的增刪改查實現(xiàn)總結(jié)
前言本文是基于單體架構(gòu)實現(xiàn)的角色的增刪改查的功能。前臺使用Bootstrap+Ajax+Jsp , 后端使用Spring+SpringMvc+MyBatis進行開發(fā),相信使用過這些技術(shù)的小伙伴應(yīng)該很好的理解以下的內(nèi)容,也希望看了這篇文章小伙伴們有所收獲。準備工作后端技術(shù)技術(shù)說明官網(wǎng)SpringSpring是一個輕量級控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。SpringMvcMVC框架ht...
繼續(xù)訪問
Javaee增刪改查學習心得
這是我學習完Javaee增刪改查后的一些經(jīng)驗心得,在這里記錄加深一下印象。 1、創(chuàng)建一個web項目,在左側(cè)項目區(qū)域右鍵創(chuàng)建新的web項目,如果沒找到選擇最下方other,搜索dy,點擊創(chuàng)建web項目。 2、導入相應(yīng)的jar包,oracle數(shù)據(jù)庫導入oracle的jdbc連接jar包,mysql數(shù)據(jù)庫導入mysql的jdbc連接jar包。在lib文件夾下導入。如需j導入s或css的jar包則最好新建...
繼續(xù)訪問
MySQL學習筆記(一) 下載安裝+基本增刪改查 + 事務(wù)
mysql筆記,內(nèi)容包含下載安裝,DDL,DML,DQL,DCL語法,約束,多表查詢等
繼續(xù)訪問
簡易的JavaWeb實現(xiàn)增刪查改(附數(shù)據(jù)庫)
一、概述 時隔一年,重回博客,應(yīng)許多初學的同學要求,實現(xiàn)簡單的增刪查改功能的小程序,具體請詳看下面的截圖~~~ 二、開發(fā)環(huán)境 語言:JavaWeb、JSP、CSS 數(shù)據(jù)庫:MySQL 開發(fā)工具:Eclipse 三、部分截圖展示 四、代碼片段 @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletExceptio...
繼續(xù)訪問
PHP網(wǎng)頁設(shè)計實現(xiàn)增刪改查,包含報告實訓內(nèi)容
運用PHP技術(shù)和MySQL數(shù)據(jù)庫實現(xiàn)對一個數(shù)據(jù)庫表格的操作。 實驗環(huán)境 1.DreamweaverCS6軟件2.phpStudy2018軟件(包含Web服務(wù)器Apache、數(shù)據(jù)庫服務(wù)器MySQL、PHP語言引擎) 實驗內(nèi)容安排 1.選擇學習或生活環(huán)境中的一個數(shù)據(jù)表格并構(gòu)造符合SQL格式的初始數(shù)據(jù)2.通過瀏覽器對這個數(shù)據(jù)表格進行查找、顯示、修改、增添、刪除5項操作...
繼續(xù)訪問
增刪查改
增刪查改 增刪查改在所有的語言代碼中都是最基礎(chǔ)和重要的,增刪查改在代碼中擔任著不可缺少的一部分,整個代碼項目都是靠著增刪查改?!霸鰟h查改”就如同字面意思一樣,增:新增(insert),刪:刪除(delete),查:查詢(select),改:修改(update),代碼做出來的東西大部分都是靠著“增刪查改”來運行的! 先說的就是增:新增(insert),最簡單的意思就是用原來的數(shù)據(jù)來新增一條或多條新的數(shù)據(jù),這就是新增。首先要有一個寫一個模態(tài)框才能在模...
繼續(xù)訪問
JavaWeb實現(xiàn)簡單對數(shù)據(jù)庫的增刪改查
通過JavaWeb實現(xiàn)簡單的對數(shù)據(jù)庫的增刪改查
繼續(xù)訪問
熱門推薦 java web基本增刪改查操作
這是一個結(jié)合mysql數(shù)據(jù)庫,java后端和jsp頁面的綜合案例: 聲明:學習本文時,需要有一定的基礎(chǔ),例如jsp,jquery,servlet,Java,jdbc等基礎(chǔ),如果不懂的希望從基礎(chǔ)學起,加油! 在代碼中有對應(yīng)的注釋說明,所以我就直接上代碼了 大致流程是: 首先訪問到servlet層,在servlet層里調(diào)用StudentRepository的各個方法,然后展示到j(luò)sp頁面中。所以瀏覽器訪問路徑是servlet層里StudentServlet中@WebServlet("/student")的路徑(
繼續(xù)訪問
關(guān)于Javaweb課程設(shè)計的心得體會.docx
關(guān)于Javaweb課程設(shè)計的心得體會.docx關(guān)于Javaweb課程設(shè)計的心得體會.docx關(guān)于Javaweb課程設(shè)計的心得體會.docx關(guān)于Javaweb課程設(shè)計的心得體會.docx關(guān)于Javaweb課程設(shè)計的心得體會.docx關(guān)于Javaweb課程設(shè)計的心得體會.docx關(guān)于Javaweb課程設(shè)計的心得體會.docx關(guān)于Javaweb課程設(shè)計的心得體會.docx關(guān)于Javaweb課程設(shè)計的心得體會.docx
記錄一下springboot+mybatis實現(xiàn)增刪改查的基本流程和心得
記錄一下springboot+mybatis實現(xiàn)增刪改查的基本流程和心得 springboot是一個spring家族中舉足輕重的那一個,也是在javaweb實際開發(fā)過程經(jīng)常使用到的一個框架,熟練使用springboot是在實際工作中非常重要的。(在一開始中我認為要先學會如何使用,而不是深究底層原理和代碼,畢竟一般的java開發(fā)工作中只會項目經(jīng)理只會不停給你分配增刪改查的功能任務(wù),當然,隨著開發(fā)經(jīng)驗的不斷提升,只止步于增刪改查會很難得到工作地位提升的機會) 第一步:導入pom.xml依賴 !--spr
繼續(xù)訪問
java的開發(fā)環(huán)境和運行環(huán)境,年薪60W必備
四面阿里 面試崗位是研發(fā)工程師,直接找螞蟻金服的大佬進行內(nèi)推,參與了阿里巴巴中間件部門的提前批面試,一共經(jīng)歷了四次面試,拿到了口頭offer。 一面: 自我介紹 項目中做了什么,難點呢。 Java的線程池說一下,各個參數(shù)的作用,如何進行的。 Redis講一下 分布式系統(tǒng)的全局id如何實現(xiàn)。用zookeeper如何實現(xiàn)的呢,機器號+時間戳即可。 分布式鎖的方案,redis和zookeeper那個好,如果是集群部署,高并發(fā)情況下哪個性能更好。 kafka了解么,了解哪些消息隊列。 想做業(yè)務(wù)還是研究。 然后出了
繼續(xù)訪問
web增刪改查數(shù)據(jù)庫實驗總結(jié)
java
寫評論
探索和學習MySQL中GIS相關(guān)功能和特性
這里記錄了學習和了解MySQL中GIS特性相關(guān)內(nèi)容的過程。
MySQL官方論壇中GIS的舉例
測試數(shù)據(jù)已經(jīng)導入成功,下面開始對GIS相關(guān)函數(shù)和GEOHASH進行了解和體驗;
mysql中g(shù)eometry類型的簡單使用
MySQL空間數(shù)據(jù)類型
經(jīng)緯度信息存儲在geometry格式的字段中,該字段必須非空。
MySQL8.0前按照longitude-latitude的順序存儲位置
MySQL8.0前按照longitude-latitude的順序存儲位置
MySQL8.0前按照longitude-latitude的順序存儲位置
插入數(shù)據(jù)時候可使用如下語句:
MySQL存儲geometry信息的方式采用了25bytes,相比WKB的21bytes,多了4bytes的坐標系表示,組成部分如下:
WTF字符串格式說明
select ST_GeomFromText(WTF格式字符串);
WKT(Well-known text)是一種文本標記語言,用于表示矢量幾何對象、空間參照系統(tǒng)及空間參照系統(tǒng)之間的轉(zhuǎn)換。通過WTF字符串生成geometry的方法:
點: POINT(x y)
線: LINESTRING(x1 y1, x2 y2, x3 y3...)
多邊形: POLYGON((0 0, 10 0, 10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))
多點集: MULTIPOINT(0 0, 20 20, 60 60) 或 MULTIPOINT((0 0),(5 5),(5 0))
多線集: MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
多多邊形集: MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
例如兩點一線組成的幾何集: GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
A geometry is syntactically well-formed if it satisfies conditions such as those in this (nonexhaustive) list:
Collections are not empty (except GeometryCollection)
更多內(nèi)容參見
ST_PointFromText('POINT(X Y)');
ST_LineStringFromText('LINESTRING(0 0,1 1,2 2)');
ST_PolygonFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))');
ST_GeomCollFromText();
更多內(nèi)容參見
參見
Point(x,y)
LineString((x1,y1),(x2,y2)...)
Polygon(LineString(),LineString()....)
參見
ST_AsText()
ST_AsBinary()
ST_AsWKT()
參見
ST_Dimension(geom) :返回geom的維度(-1,0,1,2)
ST_Envelope(geom) :返回geom的最小外接矩形(MBR)
ST_GeometryType(geom) :返回geom的類型
ST_IsEmpty(geom) :該函數(shù)并不能真實的判空,當geom為任何有效的幾何值時返回0,無效的幾何值返回1;
ST_IsSimple(geom) :當geom無任何異常幾何點返回1(如自相交和自切線等),否則返回0
ST_SRID(geom) :返回geom的坐標系ID
參見
ST_X(Point) :獲取Point的X值
ST_Y(Point) :獲取Point的Y值
參見
ST_StartPoint(linestrng) : 線的起點
ST_EndPoint(linestring) :返回線的最后一個點
ST_IsClosed(linestring或multilinestring) :線是否閉合(若為線,則判斷起點與終點是否一致;若為線組,則判斷組內(nèi)每個元素是否符合閉合線)
ST_Length(linestring) :返回線的長度,若入?yún)榫€集,則返回集合內(nèi)所有長度的和
ST_NumPoiints(linestring) :返回點的數(shù)量;
ST_PointN(linestring,N) :返回第N個點(從1開始)
參見
具體不在一一列舉,主要有計算多邊形面積、中心點、最小外接圓,最大內(nèi)接圓等函數(shù),列舉幾個可能會用到的:
ST_Area(Poly|mPoly) :返回雙精度的面積或面積的和
'ST_Centroid(Poly|mPoly)':返回數(shù)學上的中心點
ST_ExteriorRing(Poly) :返回外接圓
參見
ST_Buffer說明
不再列舉,主要有:ST_Buffer(不懂干啥用),ST_ConvexHull(geom)凸包,ST_Dfference(g1,g2)比較差異,ST_Intersecton(g1,g2)交叉點,ST_SymDifference(g1,g2)對稱差分,ST_Union(g1,g2)連接、合并等。
檢查geometry Objects之間的空間關(guān)系的方法。
參見
計算兩個Object之間的空間關(guān)系的函數(shù),有兩個間距離、相交、不相交,包含、相等、相切、重疊、接觸、在內(nèi)等等空間關(guān)系。下面列舉幾個可能會常用的方法:
ST_Contains(g1,g2) :g1是否完全包含g2
ST_Within(g1,g2) :g1是否包含于g2中
ST_Distance(g1,g2) :返回g1和g2之間的距離,已坐標單位計算的
ST_Equals(g1,g2) :返回g1和g2是否相等
參見
MBRContains(g1,g2) :g1的mbr是否包含g2的mbr
MBRWithin(g1,g2) :g1的mbr是否在g2的mbr內(nèi)
MBRCoveredBy(g1,g2) :g1的mbr是否被g2的mbr覆蓋
MBRCovers(g1,g2) :g1的mbr是否覆蓋g2的mbr
MBRDisjoint(g1,g2) :g1的mbr,g2的mbr是否不相交
MBRIntersects(g1,g2) :g1mbr,g2mbr是否相交
MBREqual(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBREquals(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBROverlaps(g1,g2) :g1mbr、g2mbr
其他函數(shù)請參看原文
GeoHash介紹
GeoHash Wiki百科
MySQL中自帶函數(shù) st_geohash(longtude,latitude,max_length) 或 st_geohash(point, max_length) 即可生成某一點的geohash值。
返回一個geohash字符串中的latitude或longitude
返回一個geohash解析出的point數(shù)據(jù)
官方文檔
通過geometry生成一個GeoJSON Object, select st_asgeojson(geometry,max_length,options);
通過GeoJSON生成GeoMetry對象。
ST_GeomFromGeoJSON(jsonstring, [options [, srid]])
具體使用方法參見官方文檔
官方文檔
MySQL中提供的方便空間運算的函數(shù)們
select ST_Distance_Spher(geomPoint1,geomPoint2 [, radius]);
此方法用于計算兩點或多個點之間的地球上的距離(是地球球面距離而不是直線距離),返回單位為米,
select ST_IsValid(ST_GeomFromText('LINESTRING(0 0,1 1)'))
判斷入?yún)⑹欠袷欠系乩砦恢妹枋龅母袷健7祷?(符合)或者0(不符);
例如:
返回0:
select st_isvalid(st_geomfromtext('linestring(0 0, -0.00 0, 0.0 0)')
返回1:
select st_isvalid(st_geomfromtext('linestring(0 0,1 1)')
select st_astext(st_makeenvelope(pt1, pt2));
返回兩點構(gòu)成的包絡(luò)。(此計算是基于笛卡爾坐標系而非球面)
例如:
SELECT ST_AsText ( st_makeenvelope ( st_geomfromtext ( 'point(0 0)' ), st_geomfromtext ( 'point(1 1)' ) ) );
返回結(jié)果:
POLYGON((0 0,1 0,1 1,0 1,0 0))
效果說明
JS抽稀算法
select st_simplify(geometry, max_distance);
用道格拉斯-普克算法(抽稀函數(shù))簡化geometry,并返回與原格式相同格式的結(jié)果。
例如,以下點集擬合為直線,步長0.5:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 0.5 )
返回結(jié)果:
LINESTRING(0 0, 0 1, 1 1, 2 3, 3 3)
再如,步長1.0:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 1.0 )
返回結(jié)果:
LINESTRING(0 0, 3 3)
SELECT ST_Validate(geometry);
驗證geometry是符合正確的地理位置信息格式。例如 Point(0 0) 是合格的; Linestring(0 0) 是非法的; Linestring(0 0, 1 1) 是合格的
了解了上述MySQL中關(guān)于集合對象的功能,下面來實踐一下
由上面geohash長度-精度對應(yīng)表可知,前6位表示±610米左右的誤差,這里先查詢前六位范圍之后再用上述方法精確篩選一次即可:
可將上述查詢方法封裝為MySQL函數(shù)方便和簡化程序調(diào)用.
該方法是運用了內(nèi)置的幾何關(guān)系運算函數(shù) ST_Contains 和 ST_MakeEnvelop 來實現(xiàn)的,0.5對應(yīng)大概500米左右的范圍,具體如下;
鏈接:
提取碼: jagn