MySQL編程怎么執(zhí)行 mysql 編程

MYSQL數(shù)據(jù)庫(kù)如何執(zhí)行SQL語(yǔ)句

如果你是在命令提示符下鍵入SQL語(yǔ)句,結(jié)尾需要加分號(hào),回車即可,如果你是在MYSQL的一個(gè)集成開(kāi)發(fā)環(huán)境下操作,將SQL語(yǔ)句鍵入頁(yè)面上方的一個(gè)框里,然后按菜單欄上的三角箭頭

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)田陽(yáng),十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108

MySQL的程序如何運(yùn)行?

你的問(wèn)題太泛泛了,“MYSQL的程序”你指的是什么?是MYSQL的 存儲(chǔ)過(guò)程??您最好是具體問(wèn)題具體問(wèn),你這樣提問(wèn)的話大家都不知道你想要什么!

mysql soure example.sql里的soure寫錯(cuò)了應(yīng)該是source!!!!example.sql是你實(shí)現(xiàn)先編輯好的文本內(nèi)容,內(nèi)容可以是創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),然后再數(shù)據(jù)庫(kù)下建立一個(gè)或多個(gè)數(shù)據(jù)表,再往表里插入一些記錄?。∪缓笤賹憘€(gè)存儲(chǔ)過(guò)程完成一些簡(jiǎn)單的功能,比如把A表里的內(nèi)容插入到B表等等(可以加內(nèi)容存在就修改不存在就插入等判斷)!!建立一個(gè).SQL文件就是為了方便??!隨便舉個(gè)例子:在D盤根目錄下用記事本建立個(gè)example.sql文件,內(nèi)容如下:

CREATE database name ;

use name;

CREATE TABLE a (

user_id int(11) DEFAULT NULL,

name char(11) DEFAULT NULL,

UNIQUE KEY USER_ID (user_id)

);

insert into a (user_id,name) values (1,'aaa'),(2,'bbb');

CREATE TABLE b (

user_id int(11) DEFAULT NULL,

name char(11) DEFAULT NULL,

UNIQUE KEY USER_ID (user_id)

);

insert into b (user_id,name) values (1,'xxx'),(3,'ccc');

DELIMITER $$

DROP PROCEDURE IF EXISTS qq$$

CREATE PROCEDURE qq()

begin

declare p_user_id varchar(6);

declare p_name varchar(6);

declare cursor_flag int default 0;

declare user_nrb cursor for select user_id,name from a;

declare continue handler for sqlstate '02000' set cursor_flag = 1;

open user_nrb;

repeat

fetch user_nrb into p_user_id,p_name;

if not cursor_flag then

if not exists (select * from b where user_id=p_user_id) then

insert into b(user_id,name)values(p_user_id,p_name);

else

update b set name=p_name where user_id=p_user_id;

end if;

end if;

until cursor_flag end repeat;

close user_nrb;

end$$

DELIMITER ;

順序是建立名為name的數(shù)據(jù)庫(kù),其下建立倆表A和B,為A表插入用戶1和2,為B表插入用戶1,3!!再建立名為QQ的存儲(chǔ)過(guò)程,功能是把a(bǔ)表的用戶導(dǎo)入到B表,如果A的用戶號(hào)再B里沒(méi)有直接插入,如果A里的用戶號(hào)已經(jīng)在B表里了那就改變B表里相應(yīng)用戶的名字!!大概是這么個(gè)過(guò)程??!在MYSQL自帶的客戶端導(dǎo)入剛才建立的example.sql文件,順序是:開(kāi)始——程序——MYSQL——MYSQL SERVER5.1——MYSQL COMMAND LINE CLIENT 窗口里輸入ROOT用戶密碼在光標(biāo)處輸入source d:\example.sql!!最后再執(zhí)行存儲(chǔ)過(guò)程,敲call qq;回車?。?!

驗(yàn)證方法是敲select * from b;回車!!可以發(fā)現(xiàn)B表由本來(lái)插入的2條記錄變成3條記錄,而且用戶1的名字也從xxx變成aaa了?。。?!

希望對(duì)你有幫助!另外最重要的是MYSQL有一些很好的圖形界面客戶端工具,不用這個(gè)DOS界面的東西,下載個(gè)sqlyog什么的軟件裝上,基本一啟動(dòng)就會(huì)用了的東西!在SQLYOG的界面直接把example.sql里的內(nèi)容復(fù)制過(guò)來(lái)粘貼后按F5鍵運(yùn)行即可!?。?/p>

MySql中Sql的執(zhí)行過(guò)程

如果查詢緩存沒(méi)有命中,那么SQL請(qǐng)求會(huì)進(jìn)入分析器,分析器是用來(lái)分辨SQL語(yǔ)句的執(zhí)行目的,其執(zhí)行過(guò)程大致分為兩步:

表1 語(yǔ)法分析關(guān)鍵字然后再通過(guò)語(yǔ)法規(guī)則解析,判斷輸入的SQL 語(yǔ)句是否滿足MySQL語(yǔ)法,并且生成圖5的語(yǔ)法樹(shù)。由SQL語(yǔ)句生成的四個(gè)單詞中,識(shí)別出兩個(gè)關(guān)鍵字,分別是select 和from。根據(jù)MySQL的語(yǔ)法Select 和 from之間對(duì)應(yīng)的是fields 字段,下面應(yīng)該掛接username;在from后面跟隨的是Tables字段,其下掛接的是userinfo。

優(yōu)化器的作用是對(duì)SQL進(jìn)行優(yōu)化,生成最有的執(zhí)行方案。如圖6所示,前面提到的SQL解析器通過(guò)語(yǔ)法分析和語(yǔ)法規(guī)則生成了SQL語(yǔ)法樹(shù)。這個(gè)語(yǔ)法樹(shù)作為優(yōu)化器的輸入,而優(yōu)化器(黃色的部分)包含了邏輯變換和代價(jià)優(yōu)化兩部分的內(nèi)容。在優(yōu)化完成以后會(huì)生成SQL執(zhí)行計(jì)劃作為整個(gè)優(yōu)化過(guò)程的輸出,交給執(zhí)行器在存儲(chǔ)引擎上執(zhí)行。

所處的位置如上圖所示,這節(jié)的重點(diǎn)在優(yōu)化器中的邏輯變換和代價(jià)優(yōu)化上。

邏輯變換也就是在關(guān)系代數(shù)基礎(chǔ)上進(jìn)行變換,其目的是為了化簡(jiǎn),同時(shí)保證SQL變化前后的結(jié)果一致,也就是邏輯變化并不會(huì)帶來(lái)結(jié)果集的變化。其主要包括以下幾個(gè)方面:

這樣講概念或許有些抽象,通過(guò)圖7 來(lái)看看邏輯變化如何在SQL中執(zhí)行的吧。

如圖7所示,從上往下共有4個(gè)步驟:

1. 針對(duì)存在的SQL語(yǔ)句,首先通過(guò)“否定消除”,去掉條件判斷中的“NOT”。語(yǔ)句由原來(lái)的“or”轉(zhuǎn)換成“and”,并且大于小于符號(hào)進(jìn)行變號(hào)。藍(lán)色部分為修改前的SQL,紅色是修改以后的SQL。2. 等值傳遞,這一步很好理解分別降”t2.a=9” 和”t2.b=5”分別替換掉SQL中對(duì)應(yīng)的值。3. 接下來(lái)就是常量表達(dá)式計(jì)算,將“5+7”計(jì)算得到“12”。4. 最后是常量表達(dá)式計(jì)算后的化簡(jiǎn),將”9=10”化簡(jiǎn)為”true”帶入到最終的SQL表達(dá)式中完成優(yōu)化。

代價(jià)優(yōu)化是用來(lái)確定每個(gè)表,根據(jù)條件是否應(yīng)用索引,應(yīng)用哪個(gè)索引和確定多表連接的順序等問(wèn)題。為了完成代價(jià)優(yōu)化,需要找到一個(gè)代價(jià)最小的方案。因此,優(yōu)化器是通過(guò)基于代價(jià)的計(jì)算方法來(lái)決定如何執(zhí)行查詢的(Cost-based Optimization)。簡(jiǎn)化的過(guò)程如下:

這里將配置操作的代價(jià)分為MySQL 服務(wù)層和MySQL 引擎層,MySQL 服務(wù)層主要是定義CPU的代價(jià),而MySQL 引擎層主要定義IO代價(jià)。MySQL 5.7 引入了兩個(gè)系統(tǒng)表mysql.server_cost和mysql.engine_cost來(lái)分別配置這兩個(gè)層的代價(jià)。如下:MySQL 服務(wù)層代價(jià)保存在表server_cost中,其具體內(nèi)容如下:

由上可以看出創(chuàng)建臨時(shí)表的代價(jià)是很高的,尤其是內(nèi)部的myisam或innodb臨時(shí)表。MySQL 引擎層代價(jià)保存在表engine_cost中,其具體內(nèi)容如下:

目前io_block_read_cost和memory_block_read_cost默認(rèn)值均為1,實(shí)際生產(chǎn)中建議酌情調(diào)大memory_block_read_cost,特別是對(duì)普通硬盤的場(chǎng)景。MySQL會(huì)根據(jù)SQL查詢生成的查詢計(jì)劃中對(duì)應(yīng)的操作從上面兩張代價(jià)表中查找對(duì)應(yīng)的代價(jià)值,并且進(jìn)行累加形成最終執(zhí)行SQL計(jì)劃的代價(jià)。再將多種可能的執(zhí)行計(jì)劃進(jìn)行比較,選取最小代價(jià)的計(jì)劃執(zhí)行。

當(dāng)分析器生成查詢計(jì)劃,并且經(jīng)過(guò)優(yōu)化器以后,就到了執(zhí)行器。執(zhí)行器會(huì)選擇執(zhí)行計(jì)劃開(kāi)始執(zhí)行,但在執(zhí)行之前會(huì)校驗(yàn)請(qǐng)求用戶是否擁有查詢的權(quán)限,如果沒(méi)有權(quán)限,就會(huì)返回錯(cuò)誤信息,否則將會(huì)去調(diào)用MySQL引擎層的接口,執(zhí)行對(duì)應(yīng)的SQL語(yǔ)句并且返回結(jié)果。例如SQL:“SELECT * FROM userinfo WHERE username = 'Tom';“假設(shè) “username“ 字段沒(méi)有設(shè)置索引,就會(huì)調(diào)用存儲(chǔ)引擎從第一條開(kāi)始查,如果碰到了用戶名字是” Tom“, 就將結(jié)果集返回,沒(méi)有查找到就查看下一行,重復(fù)上一步的操作,直到讀完整個(gè)表或者找到對(duì)應(yīng)的記錄。需要注意SQL語(yǔ)句的執(zhí)行順序并不是按照書(shū)寫順序來(lái)的,順序的定義會(huì)在分析器中做好,一般是按照如下順序:

如果命中的記錄比較多,應(yīng)用會(huì)從MySql Server一批批獲取數(shù)據(jù)

本文從MySQL中SQL語(yǔ)句的執(zhí)行過(guò)程作為切入點(diǎn),首先介紹了查詢請(qǐng)求的執(zhí)行流程,其中將MySQL的處理分為MySQL Server層和MySQL存儲(chǔ)引擎層。通過(guò)介紹SQL語(yǔ)句的流轉(zhuǎn),引出了后面要介紹的5大組件,他們分別是:連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器。后面的內(nèi)容中對(duì)每個(gè)組件進(jìn)行了詳細(xì)的介紹。連接器,負(fù)責(zé)身份認(rèn)證和權(quán)限鑒別;查詢緩存,將查詢的結(jié)果集進(jìn)行緩存,提高查詢效率;分析器,對(duì)SQL語(yǔ)句執(zhí)行語(yǔ)法分析和語(yǔ)法規(guī)則,生成語(yǔ)法樹(shù)和執(zhí)行計(jì)劃;優(yōu)化器,包括邏輯變換和代價(jià)優(yōu)化;執(zhí)行器,在檢查用戶權(quán)限以后對(duì)數(shù)據(jù)進(jìn)行逐條查詢,整個(gè)過(guò)程遵守SQL語(yǔ)句的執(zhí)行順序。

mysql 怎么執(zhí)行sql文件

右鍵以文本文件的形式打開(kāi),里面是記錄著可以在mysql里面執(zhí)行的代碼。

要執(zhí)行sql文件里面的代碼,需要打開(kāi)mysql數(shù)據(jù)庫(kù)去執(zhí)行,新手推薦用軟件的形式執(zhí)行此sql,軟件如navicat,sqlyog等。

打開(kāi)軟件并且配置連接數(shù)據(jù)庫(kù)的信息后打開(kāi),然后創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),之后右鍵數(shù)據(jù)庫(kù)選中執(zhí)行sql,接著選擇要執(zhí)行的sql文件,按提示一步一步走下去即可。

老手推薦使用cmd指令來(lái)執(zhí)行sql,因?yàn)樗俣缺容^快,首先也是連接上數(shù)據(jù)庫(kù),創(chuàng)建并選擇好數(shù)據(jù)庫(kù):

mysqluse 數(shù)據(jù)庫(kù)名;

mysqlset names utf8; --設(shè)置傳輸編碼,避免中文亂碼

mysqlsource d:/xxx.sql; -- source 文件路徑

就這么簡(jiǎn)單, 然后就等著sql執(zhí)行完畢即可.

分享名稱:MySQL編程怎么執(zhí)行 mysql 編程
URL分享:http://bm7419.com/article12/ddegigc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、網(wǎng)站制作、域名注冊(cè)Google、靜態(tài)網(wǎng)站商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)