Mysql培訓(xùn)經(jīng)典教程第三章_第1頁
Mysql培訓(xùn)經(jīng)典教程第三章_第2頁
Mysql培訓(xùn)經(jīng)典教程第三章_第3頁
Mysql培訓(xùn)經(jīng)典教程第三章_第4頁
Mysql培訓(xùn)經(jīng)典教程第三章_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、本章要點(diǎn): 服務(wù)器的啟動(dòng) 客戶機(jī)與服務(wù)器的連接 一些 SQL 語句的功能 一些專用客戶機(jī)的使用 在我們閱讀了前兩章,了解了 MySQL 并且安裝成功 MySQL 服務(wù)器之后,可以 開始學(xué)習(xí)這個(gè)強(qiáng)大而復(fù)雜的系統(tǒng)。 客戶機(jī)/服務(wù)器的體系結(jié)構(gòu)是 MySQL 的特點(diǎn)之一,我們首先需要熟悉 MySQL 客 戶機(jī)和服務(wù)器的使用,了解客戶機(jī)如何與服務(wù)器連接。 客戶機(jī)使用 SQL 語言與 MySQL 服務(wù)器通信。為了與 MySQL 服務(wù)器進(jìn)行通信, 必須熟練掌握 SQL。例如,在使用諸如 mysql 客戶機(jī)這樣的程序時(shí),其功能首先是 作為一種發(fā)送 SQL 語句給服務(wù)器執(zhí)行的工具。而且,如果編寫使用編程語言所提

2、供 的 MySQL 接口的程序時(shí),也必須熟悉 SQL 語言,因?yàn)樾枰l(fā)送 SQL 語句與服務(wù) 器溝通。 本章也將對大部分 SQL 語句作一個(gè)詳細(xì)的描述。本章涉及的 SQL 語句多數(shù)都是 和數(shù)據(jù)的存儲(chǔ)、檢索有關(guān),其它少量的 SQL 語句將在其它各章陸續(xù)介紹。 數(shù)數(shù)數(shù)數(shù)數(shù)數(shù)據(jù)據(jù)據(jù)據(jù)據(jù)據(jù)庫庫庫庫庫庫的的的的的的基基基基基基本本本本本本操操操操操操作作作作作作 第第第第3 3 3章章章章 3.1 MySQL 的啟動(dòng)與終止 由于 MySQL 服務(wù)器具有多種安裝分發(fā),而且能夠運(yùn)行在多種操作平臺(tái)之上,因此 它的啟動(dòng)與停止的方法也多種多樣。你可以根據(jù)實(shí)際情況使用其中的一種。在你安裝、 升級(jí)或者維護(hù)系統(tǒng)時(shí),你可

3、能需要多次啟動(dòng)和終止服務(wù)器,你需要了解啟動(dòng)和終止服務(wù) 器的方方面面。 3.1.1 直接運(yùn)行守護(hù)程序 1、你可以采用的方法 一般的,你可以有以下幾種選擇啟動(dòng) MySQL 服務(wù)器,它們的功能和用法幾乎是相 同的,所以一起在這里介紹: 直接使用 MySQL 守護(hù)程序 mysqld 啟動(dòng)數(shù)據(jù)庫系統(tǒng),尤其是 Win32 平臺(tái)上的分 發(fā),這是因?yàn)?,?Win32 平臺(tái)上沒有 mysql.server 等服務(wù)器腳本可用。 通過調(diào)用 safe_mysqld 腳本,它接受與 mysqld 相同的參數(shù),并試圖為 mysqld 決 定正確的選項(xiàng),然后選擇用那些運(yùn)行它。 2、腳本或者守護(hù)程序的存放位置 對于二進(jìn)制分發(fā)

4、的安裝,mysqld 守護(hù)程序安裝在 MySQL 安裝目錄的 bin 目錄下, 或者可在 MySQL 源代碼分發(fā)的 libexec 目錄下找到,缺省為/usr/local/libexec/。對于 rpm 分發(fā),mysqld 應(yīng)該位于 PATH 變量決定的程序搜索路徑中,因此可以直接引用。 safe_mysqld 仍舊是一個(gè)腳本,并且只存在于 Unix 平臺(tái)的分發(fā)中。safe_mysqld 腳本 安裝在 MySQL 安裝目錄的 bin 目錄下,或可在 MySQL 源代碼分發(fā)的 scripts 目錄下找 到。對于 rpm 分發(fā),該腳本應(yīng)該位于 PATH 變量決定的程序搜索路徑中,因此可以直接 引用

5、。 3、為什么要使用 safe_mysqld 腳本 safe_mysqld 接受和 mysqld 同樣的參數(shù),并試圖確定服務(wù)器程序和數(shù)據(jù)庫目錄的位 置,然后利用這些位置調(diào)用服務(wù)器。safe_mysqld 將服務(wù)器的標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到數(shù)據(jù) 庫目錄中的錯(cuò)誤文件中,并以記錄的形式存在。啟動(dòng)服務(wù)器后,safe_mysqld 還監(jiān)控服務(wù) 器,并在其死機(jī)時(shí)重新啟動(dòng)。safe_mysqld 通常用于 Unix 的 BSD 風(fēng)格的版本。 如果,你曾經(jīng)為 root 或在系統(tǒng)啟動(dòng)程序中啟動(dòng) safe_mysqld,其錯(cuò)誤日志將有 root 擁有。如果再用非特權(quán)的用戶身份調(diào)用 safe_mysqld,則可能引起“

6、Access Denied”(即, “所有權(quán)被拒絕”)的錯(cuò)誤。此時(shí)可以刪除錯(cuò)誤文件在試一次。 由于 safe_mysqld 腳本的功能,使用 safe_mysqld 腳本明顯比直接啟動(dòng) mysqld 守護(hù) 程序來得有效。 4、啟動(dòng)服務(wù)器的完整過程 對于 Unix 平臺(tái)上的分發(fā),如果你以 root 或在系統(tǒng)引導(dǎo)期間啟動(dòng) sqfe_mysqld,出錯(cuò) 日志由 root 擁有,這可能在你以后試圖用一個(gè)非特權(quán)用戶調(diào)用 safe_mysqld 時(shí)將導(dǎo)致 “permission denied”(權(quán)限拒絕)錯(cuò)誤,刪除出錯(cuò)日志再試一下。因此建議你在啟動(dòng)服 務(wù)器前,首先切換到一個(gè)專門的用戶 mysql。 具體方

7、法如下: Unix 平臺(tái) $ su mysql $ safe_mysql then /usr/local/bin/safe_mysqld then /usr/local/bin/safe_mysqld -user=mysql -datadir=/path/to/data +-+ | Database | +-+ | first | | mysql | | mytest | | test | | test1 | +-+ mysqlshow databases like my%; +-+ | Database (my%) | +-+ | mysql | | mytest | +-+ 用 mysql

8、show 程序也可以得到已有數(shù)據(jù)庫列表。 3.3.2 用 Create Dabase 創(chuàng)建數(shù)據(jù)庫 句法:CREATE DATABASE db_name 功能:CREATE DATABASE 用給定的名字創(chuàng)建一個(gè)數(shù)據(jù)庫。 如果數(shù)據(jù)庫已經(jīng)存在,發(fā)生一個(gè)錯(cuò)誤。 在 MySQL 中的數(shù)據(jù)庫實(shí)現(xiàn)成包含對應(yīng)數(shù)據(jù)庫中表的文件的目錄。因?yàn)閿?shù)據(jù)庫在初 始創(chuàng)建時(shí)沒有任何表,CREATE DATABASE 語句只是在 MySQL 數(shù)據(jù)目錄下面創(chuàng)建一 個(gè)目錄。 例如: mysqlcreate database myfirst; 然后利用 show databases 觀察效果。 3.3.3 用 DROP DATABA

9、SE 刪除數(shù)據(jù)庫 句法:DROP DATABASE IF EXISTS db_name 功能:DROP DATABASE 刪除數(shù)據(jù)庫中的所有表和數(shù)據(jù)庫。要小心地使用這個(gè)命 令! DROP DATABASE 返回從數(shù)據(jù)庫目錄被刪除的文件的數(shù)目。通常,這 3 倍于表的 數(shù)量,因?yàn)槊繌埍韺?yīng)于一個(gè)“.MYD”文件、一個(gè)“.MYI”文件和一個(gè)“.frm”文件。 在 MySQL 3.22 或以后版本中,你可以使用關(guān)鍵詞 IF EXISTS 阻止一個(gè)錯(cuò)誤的發(fā)生, 如果數(shù)據(jù)庫不存在。 3.3.4 使用 mysqladmin 工具創(chuàng)建和刪除 在命令行環(huán)境下可以使用 mysqladmin 創(chuàng)建和刪除數(shù)據(jù)庫。 創(chuàng)

10、建數(shù)據(jù)庫: shell mysqladmin create db_name 刪除數(shù)據(jù)庫: shell mysqladmin drop db_name 如果出現(xiàn)下面的錯(cuò)誤: mysqladmin: connect to server at localhost failed error: Access denied for user: rootlocalhost (Using password: YES) 表示你需要一個(gè)可以正常連接的用戶,請指定-u -p 選項(xiàng),具體方法與 3.2 節(jié)介紹相同, 在第七章中你將會(huì)學(xué)到用戶授權(quán)的知識(shí)。 3.3.5 直接在數(shù)據(jù)庫目錄中創(chuàng)建或刪除 用上述方法創(chuàng)建數(shù)據(jù)庫,

11、只是 MySQL 數(shù)據(jù)目錄下面創(chuàng)建一個(gè)與數(shù)據(jù)庫同名目錄, 同樣刪除數(shù)據(jù)庫是把這個(gè)目錄刪除。 所以,你可以直接這么做,創(chuàng)建或刪除數(shù)據(jù)庫,或者給數(shù)據(jù)庫更名。這對備份和恢 復(fù)備份有一定意義。 3.3.6 用 USE 選用數(shù)據(jù)庫 句法:USE db_name USE db_name 語句告訴 MySQL 使用 db_name 數(shù)據(jù)庫作為隨后的查詢的缺省數(shù)據(jù)庫。 數(shù)據(jù)庫保持到會(huì)話結(jié)束,或發(fā)出另外一個(gè) USE 語句: mysql USE db1; mysql SELECT count(*) FROM mytable; # selects from db1.mytable mysql USE db2; my

12、sql SELECT count(*) FROM mytable; # selects from db2.mytable 如果你不是用 USE 語句,那么上面的例子應(yīng)該寫成: mysql SELECT count(*) FROM db1.mytable; mysql SELECT count(*) FROM db2.mytable; 由于 use 也是一個(gè) mysql 客戶程序的命令,所以你可以在命令行最后不加分號(hào),客 戶程序可以得到結(jié)果。 3.3.7 總結(jié) 本節(jié)介紹了有關(guān)數(shù)據(jù)庫操作的 SQL 語句、實(shí)用程序,其中包括: SQL 語句:CREATE/DROP DATABASE,SHOW DAT

13、ABASES,USE 程序 mysqladmin 直接創(chuàng)建或刪除數(shù)據(jù)庫的目錄 3.4 有關(guān)數(shù)據(jù)表的操作 用 MySQL,目前(版本 3.23)你可以在三種基本數(shù)據(jù)庫表格式間選擇。當(dāng)你創(chuàng)建一 張表時(shí),你可以告訴 MySQL 它應(yīng)該對于表使用哪個(gè)表類型。MySQL 將總是創(chuàng)建一個(gè). frm 文件保存表和列定義。視表類型而定,索引和數(shù)據(jù)將在其他文件中存儲(chǔ)。 你能用 ALTER TABLE 語句在不同類型的表之間變換。見 7.8 ALTER TABLE 語法。 MyISAM 在 MySQL 3.23 中,MyISAM 是缺省表格類型,它是基于 ISAM 代碼并且有很多有 用的擴(kuò)展。索引存儲(chǔ)在一個(gè)有.M

14、YI(MYindex)擴(kuò)展名的文件并且數(shù)據(jù)存儲(chǔ)在有. MYD(MYData)擴(kuò)展名的文件中。你能用 myisamchk 實(shí)用程序檢查/修復(fù) MyISAM 表。 ISAM 你也可以使用放棄的 ISAM。這將在不久消失,因?yàn)?MyISAM 是同一個(gè)東西的更好 實(shí)現(xiàn)。ISAM 使用一個(gè) B-tree 索引,這個(gè)索引存儲(chǔ)在一個(gè)有.ISM 擴(kuò)展名的文件中并且數(shù) 據(jù)存儲(chǔ)在有.ISD 擴(kuò)展名的文件中,你可用 isamchk 實(shí)用程序檢查/修復(fù) ISAM 表。ISAM 表不是跨 OS/平臺(tái)二進(jìn)制可移植的。 HEAP HEAP 表格使用一個(gè)雜湊(hashed)索引并且存儲(chǔ)在內(nèi)存中。這使他們更快,但是 如果 My

15、SQL 崩潰,你將失去所有存儲(chǔ)的數(shù)據(jù)。HEAP 作為臨時(shí)表很可用! 3.4.1 用 SHOW/ DESCRIBE 語句顯示數(shù)據(jù)表的信息 句法: SHOW TABLES FROM db_name LIKE wild or SHOW COLUMNS FROM tbl_name FROM db_name LIKE wild or SHOW INDEX FROM tbl_name FROM db_name or SHOW TABLE STATUS FROM db_name LIKE wild DESCRIBE | DESC tbl_name col_name | wild 你能使用db_name.tb

16、l_name作為tbl_name FROM db_name句法的另一種選擇。 SHOW TABLES 列出在一個(gè)給定的數(shù)據(jù)庫中的表。你也可以用 mysqlshow db_name 命令得到這張表。 注意:如果一個(gè)用戶沒有一個(gè)表的任何權(quán)限,表將不在 SHOW TABLES 或 mysqlshow db_name 中的輸出中顯示。 SHOW COLUMNS 列出在一個(gè)給定表中的列。如果列類型不同于你期望的是基 于 CREATE TABLE 語句的那樣,注意,MySQL 有時(shí)改變列類型。 DESCRIBE 語句提供了類似 SHOW COLUMNS 的信息。DESCRIBE 提供關(guān)于 一張表的列的信息

17、。col_name 可以是一個(gè)列名字或包含 SQL 的“%”和“_” 通配符的一個(gè)字符串。這個(gè)語句為了與 Oracle 兼容而提供的。 SHOW TABLE STATUS(在版本 3.23 引入)運(yùn)行類似 SHOW STATUS,但是提 供每個(gè)表的更多信息。你也可以使用 mysqlshow -status db_name 命令得到這張 表。 SHOW FIELDS 是 SHOW COLUMNS 一個(gè)同義詞,SHOW KEYS 是 SHOW INDEX 一個(gè)同義詞。 你也可以用 mysqlshow db_name tbl_name 或 mysqlshow -k db_name tbl_name

18、列 出一張表的列或索引。 SHOW INDEX 以非常相似于 ODBC 的 SQLStatistics 調(diào)用的格式返回索引信息。 3.4.2 使用 mysqlshow 工具得到信息 下面簡單介紹一下 mysqlshow 實(shí)用程序的用法,在得到數(shù)據(jù)庫和表的信息上,使用 起來非常方便。 得到已有數(shù)據(jù)庫的列表: shell mysqlshow 列出某數(shù)據(jù)庫 db_name 中已有的表: shell mysqlshow db_name 列出某數(shù)據(jù)庫表 db_name.tbl_name 的結(jié)構(gòu)信息: shellmysqlshow db_name tbl_name 列出一張表的索引: shell mysq

19、lshow k db_name tbl_name 3.4.3 用 CREATE TABLE 語句創(chuàng)建數(shù)據(jù)表 用 CREATE TABLE 語句創(chuàng)建表。此語句的完整語法是相當(dāng)復(fù)雜的,因?yàn)榇嬖谀?么多的可選子句,但在實(shí)際中此語句的應(yīng)用相當(dāng)簡單。如我們在第 1 章中使用的所有 CREATE TABLE 語句都不那么復(fù)雜。 有意思的是,大多數(shù)復(fù)雜東西都是一些子句,這些子句 MySQL 在分析后扔掉。參 閱附錄 1 可以看到這些復(fù)雜的東西。 1、CREATE TABLE 語句的基本語法 CREATE TABLE tbl_name(create_definition,.) TYPE =table_type

20、 create_definition: col_name type NOT NULL | NULL DEFAULT default_value AUTO_INCREMENTPRIMARY KEY 在 MySQL3.22 或以后版本中,表名可以被指定為 db_name.tbl_name,不管有沒有 當(dāng)前的數(shù)據(jù)庫都可以。 例如,創(chuàng)建一個(gè)訪問者留言表: shell mysql u root p mysql create database mytest; mysql CREATETABLEguestbook - ( - visitor VARCHAR(40), - comments TEXT, - e

21、ntrydate DATETIME -); 如果一切正常,祝賀你,你已經(jīng)建立了你的第一個(gè)表! 你所創(chuàng)建的表名為 guestbook,你可以使用這個(gè)表來存儲(chǔ)來字你站點(diǎn)訪問者的信息。 你是用 REEATE TABLE 語句創(chuàng)建的這個(gè)表,這個(gè)語句有兩部分:第一部份指定表的名 子;第二部份是括在括號(hào)中的各字段的名稱和屬性,相互之間用逗號(hào)隔開。 表 guestbook 有三個(gè)字段:visitor,comments 和 entrydate。visitor 字段存儲(chǔ)訪問者的 名字,comments 字段存儲(chǔ)訪問者對你站點(diǎn)的意見,entrydate 字段存儲(chǔ)訪問者訪問你站點(diǎn) 的日期和時(shí)間。 注意每個(gè)字段名后面

22、都跟有一個(gè)專門的表達(dá)式。例如,字段名 comments 后面跟有 表達(dá)式 TEXT。這個(gè)表達(dá)式指定了字段的數(shù)據(jù)類型。數(shù)據(jù)類型決定了一個(gè)字段可以存儲(chǔ) 什么樣的數(shù)據(jù)。因?yàn)樽侄?comments 包含文本信息,其數(shù)據(jù)類型定義為文本型。 2、如何指定表的類型 你也可以在創(chuàng)建表時(shí)指定表的類型,如果不指定表的類型,在 3.22 及以前版本中缺 省為 ISAM 表,在 3.23 版本中缺省為 MyISAM 表。你應(yīng)該盡量使用 MyISAM 表。指定 表的類型經(jīng)常用于創(chuàng)建一個(gè) HEAP 表: mysql CREATE TABLE fast(id int,articles TEXT) TYPE=HEAP; 3、

23、隱含的列說明的改變 在某些情況下,MySQL 隱含地改變在一個(gè) CREATE TABLE 語句給出的一個(gè)列說 明。(這也可能在 ALTER TABLE。) 長度小于 4 的 VARCHAR 被改變?yōu)?CHAR。 如果在一個(gè)表中的任何列有可變長度,結(jié)果是整個(gè)行是變長的。因此, 如果一 張表包含任何變長的列(VARCHAR、TEXT 或 BLOB),所有大于 3 個(gè)字符的 CHAR 列被改變?yōu)?VARCHAR 列。這在任何方面都不影響你如何使用列;在 MySQL 中,VARCHAR 只是存儲(chǔ)字符的一個(gè)不同方法。MySQL 實(shí)施這種改變, 是因?yàn)樗?jié)省空間并且使表操作更快捷。 TIMESTAMP 的

24、顯示尺寸必須是偶數(shù)且在 2 14 的范圍內(nèi)。如果你指定 0 顯 示尺寸或比 14 大,尺寸被強(qiáng)制為 14。從 113 范圍內(nèi)的奇數(shù)值尺寸被強(qiáng)制為 下一個(gè)更大的偶數(shù)。 你不能在一個(gè) TIMESTAMP 列里面存儲(chǔ)一個(gè)文字 NULL;將它設(shè)為 NULL 將設(shè) 置為當(dāng)前的日期和時(shí)間。因?yàn)?TIMESTAMP 列表現(xiàn)就是這樣,NULL 和 NOT NULL 屬性不以一般的方式運(yùn)用并且如果你指定他們,將被忽略。DESCRIBE tbl_name 總是報(bào)告該 TIMESTAMP 列可能賦予了 NULL 值。 如果你想要知道 MySQL 是否使用了除你指定的以外的一種列類型,在創(chuàng)建或改變 你的表之后,發(fā)出一

25、個(gè) DESCRIBE tbl_name 語句即可。 3.4.4 利用 SELECT 的結(jié)果創(chuàng)建表 關(guān)系數(shù)據(jù)庫的一個(gè)重要概念是,任何數(shù)據(jù)都表示為行和列組成的表,而每條 SELECT 語句的結(jié)果也都是一個(gè)行和列組成的表。在許多情況下,來自 SELECT 的 “表”僅是一個(gè)隨著您的工作在顯示屏上滾動(dòng)的行和列的圖像。在 MySQL 3.23 以前, 如果想將 SELECT 的結(jié)果保存在一個(gè)表中以便以后的查詢使用,必須進(jìn)行特殊的安排: 1) 運(yùn)行 DESCRIBE 或 SHOW COLUMNS 查詢以確定想從中獲取信息的表中的列 類型。 2) 創(chuàng)建一個(gè)表,明確地指定剛才查看到的列的名稱和類型。 3) 在

26、創(chuàng)建了該表后,發(fā)布一條 INSERT . SELECT 查詢,檢索出結(jié)果并將它們插 入所創(chuàng)建的表中。 在 MySQL 3.23 中,全都作了改動(dòng)。CREATE TABLE . SELECT 語句消除了這些 浪費(fèi)時(shí)間的東西,使得能利用 SELECT 查詢的結(jié)果直接得出一個(gè)新表。只需一步就可 以完成任務(wù),不必知道或指定所檢索的列的數(shù)據(jù)類型。這使得很容易創(chuàng)建一個(gè)完全用所 喜歡的數(shù)據(jù)填充的表,并且為進(jìn)一步查詢作了準(zhǔn)備。 如果你在 CREATE 語句后指定一個(gè) SELECT,MySQL 將為在 SELECT 中所有的單 元?jiǎng)?chuàng)鍵新字段。例如: mysql CREATE TABLE test - (a in

27、t not null auto_increment,primary key (a), key(b) - SELECT b,c from test2; 這將創(chuàng)建一個(gè)有 3 個(gè)列(a,b,c)的表,其中 b,c 列的數(shù)據(jù)來自表 test2。注意如果 在拷貝數(shù)據(jù)進(jìn)表時(shí)發(fā)生任何錯(cuò)誤,表將自動(dòng)被刪除。 可以通過選擇一個(gè)表的全部內(nèi)容(無 WHERE 子句)來拷貝一個(gè)表,或利用一個(gè)總 是失敗的 WHERE 子句來創(chuàng)建一個(gè)空表,如: mysql CREATE TABLE test SELECT * from test2; mysql CREATE TABLE test SELECT * from test2

28、where 0; 如果希望利用 LOAD DATA 將一個(gè)數(shù)據(jù)文件裝入原來的文件中,而不敢肯定是否 具有指定的正確數(shù)據(jù)格式時(shí),創(chuàng)建空拷貝很有用。您并不希望在第一次未得到正確的選 項(xiàng)時(shí)以原來表中畸形的記錄而告終。利用原表的空拷貝允許對特定的列和行分隔符用 LOAD DATA 的選項(xiàng)進(jìn)行試驗(yàn),直到對輸入數(shù)據(jù)的解釋滿意時(shí)為止。在滿意之后,就可 以將數(shù)據(jù)裝入原表了。 可結(jié)合使用 CREATE TEMPORARY TABLE 與 SELECT 來創(chuàng)建一個(gè)臨時(shí)表作為 它自身的拷貝,如: 這允許修改 my_tbl 的內(nèi)容而不影響原來的內(nèi)容。在希望試驗(yàn)對某些修改表內(nèi)容的 查詢,而又不想更改原表內(nèi)容時(shí),這樣做很

29、有用。為了使用利用原表名的預(yù)先編寫的腳 本,不需要為引用不同的表而編輯這些腳本;只需在腳本的起始處增加 CREATE TEMPORARY TABLE 語句即可。相應(yīng)的腳本將創(chuàng)建一個(gè)臨時(shí)拷貝,并對此拷貝進(jìn)行操 作,當(dāng)腳本結(jié)束時(shí)服務(wù)器會(huì)自動(dòng)刪除這個(gè)拷貝。 要?jiǎng)?chuàng)建一個(gè)作為自身的空拷貝的表,可以與 CREATE TEMPORARY . SELECT 一 起使用 WHERE 0 子句,例如: 但創(chuàng)建空表時(shí)有幾點(diǎn)要注意。在創(chuàng)建一個(gè)通過選擇數(shù)據(jù)填充的表時(shí),其列名來自所 選擇的列名。如果某個(gè)列作為表達(dá)式的結(jié)果計(jì)算,則該列的“名稱”為表達(dá)式的文本。 表達(dá)式不是合法的列名,可在 mysql 中運(yùn)行下列查詢了解這一

30、點(diǎn): 為了正常工作,可為該列提供一個(gè)合法的別稱: 如果選擇了來自不同表的具有相同名稱的列,將會(huì)出現(xiàn)一定的困難。假定表 t1 和 t2 兩者都具有列 c,而您希望創(chuàng)建一個(gè)來自兩個(gè)表中行的所有組合的表。那么可以提供 別名指定新表中惟一性的列名,如: 通過選擇數(shù)據(jù)進(jìn)行填充來創(chuàng)建一個(gè)表并會(huì)自動(dòng)拷貝原表的索引。 3.4.5 用 ALTER TABLE 語句修改表的結(jié)構(gòu) 有時(shí)你可能需要改變一下現(xiàn)有表的結(jié)構(gòu),那么 Alter Table 語句將是你的合適選擇。 增加列 alter table tbl_name add col_name type 例如,給表增加一列 weight mysqlalter tab

31、le pet add weight int; 刪除列 alter table tbl_name drop col_name 例如,刪除列 weight: mysqlalter table pet drop weight; 改變列 alter table tbl_name modify col_name type 例如,改變 weight 的類型: mysql alter table pet modify weight samllint; 另一種方法是: alter table tbl_name change old_col_name col_name type 例如: mysql alter

32、table pet change weight weight samllint; 給列更名 mysqlalter table pet change weight wei; 給表更名 alter table tbl_name rename new_tbl 例如,把 pet 表更名為 animal mysqlalter table pet rename animal; 改變表的類型 另外,可以為列增加或刪除索引等屬性,不再詳述,請參閱附錄。 3.4.6 用 DROP TABLE 語句刪除數(shù)據(jù)表 DROP TABLE IF EXISTS tbl_name , tbl_name,. DROP TABL

33、E 刪除一個(gè)或多個(gè)數(shù)據(jù)庫表。所有表中的數(shù)據(jù)和表定義均被刪除,故 小心使用這個(gè)命令! 在 MySQL 3.22 或以后版本,你可以使用關(guān)鍵詞 IF EXISTS 類避免不存在表的一個(gè) 錯(cuò)誤發(fā)生。 例如: mysqlUSE mytest; mysqlDROP TABLE guestbook; 或者,也可以同時(shí)指定數(shù)據(jù)庫和表: mysqlDROP TABLE mytest. guestbook; 3.4.7 總結(jié) 本節(jié)講述了有關(guān)表的大部分操作,現(xiàn)在將所述內(nèi)容總結(jié)如下: MySQL 的表的三種類型 如何創(chuàng)建表、刪除表 如何改變表的結(jié)構(gòu)、名字 如何使用 mysqlshow 實(shí)用程序 3.5 向數(shù)據(jù)表插入

34、行記錄 3.5.1 使用 INSERT 語句插入新數(shù)據(jù) 語法:INSERT INTO tbl_name (col_name,.) VALUES (pression,.), INSERT INTO tbl_name SET col_name=expression, . 讓我們開始利用 INSERT 語句來增加記錄,這是一個(gè) SQL 語句,需要為它指定 希望插入數(shù)據(jù)行的表或?qū)⒅蛋葱蟹湃氲谋怼NSERT 語句具有幾種形式: 可指定所有列的值: 例如: shell mysql u root p mysql use mytest; mysql insert into worker values(“to

35、m”,”); “INTO”一詞自 MySQL 3.22.5 以來是可選的。(這一點(diǎn)對其他形式的 INSERT 語句也成立。)VALUES 表必須包含表中每列的值,并且按表中列的存放次序給出。 (一般,這就是創(chuàng)建表時(shí)列的定義次序。如果不能肯定的話,可使用 DESCRIBE tbl_name 來查看這個(gè)次序。) 使用多個(gè)值表,可以一次提供多行數(shù)據(jù)。 Mysqlinsert into worker values(tom,),(paul,); 有多個(gè)值表的 INSERT . VALUES 的形式在 MySQL 3.22.5 或以后版本中支持。 可以給出要賦值的那個(gè)列,然后再列出值。這對于希望建立只有幾

36、個(gè)列需要初始設(shè) 置的記錄是很有用的。 例如: mysqlinsert into worker (name) values (tom); 自 MySQL 3.22.5 以來,這種形式的 INSERT 也允許多個(gè)值表: mysqlinsert into worker (name) values (tom), (paul); 在列的列表中未給出名稱的列都將賦予缺省值。 自 MySQL 3.22 .10 以來,可以 col_name = value 的形式給出列和值。 例如: mysqlinsert into worker set name=tom; 在 SET 子句中未命名的行都賦予一個(gè)缺省值。 使

37、用這種形式的 INSERT 語句不能插入多行。 一個(gè) expression 可以引用在一個(gè)值表先前設(shè)置的任何列。例如,你能這樣: mysql INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2); 但不能這樣: mysql INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15); 3.5.2 使用 INSERTSELECT 語句插入從其他表選擇的行 當(dāng)我們在上一節(jié)學(xué)習(xí)創(chuàng)建表時(shí),知道可以使用 select 從其它表來直接創(chuàng)建表,甚至 可以同時(shí)復(fù)制數(shù)據(jù)記錄。如果你已經(jīng)擁有了一個(gè)表,你同樣可以從 selec

38、t 語句的配合中 獲益。 從其它表中錄入數(shù)據(jù),例如: mysqlinsert into tbl_name1(col1,col2) select col3,col4 from tbl_name2; 你也可以略去目的表的列列表,如果你每一列都有數(shù)據(jù)錄入。 mysqlinsert into tbl_name1 select col3,col4 from tbl_name2; INSERT INTO . SELECT 語句滿足下列條件: 查詢不能包含一個(gè) ORDER BY 子句。 INSERT 語句的目的表不能出現(xiàn)在 SELECT 查詢部分的 FROM 子句,因?yàn)檫@在 ANSI SQL 中被禁止讓從你

39、正在插入的表中 SELECT。(問題是 SELECT 將可 能發(fā)現(xiàn)在同一個(gè)運(yùn)行期間內(nèi)先前被插入的記錄。當(dāng)使用子選擇子句時(shí),情況能 很容易混淆) 3.5.3 使用 replace、replaceselect 語句插入 REPLACE 功能與 INSERT 完全一樣,除了如果在表中的一個(gè)老記錄具有在一個(gè)唯 一索引上的新記錄有相同的值,在新記錄被插入之前,老記錄被刪除。對于這種情況, insert 語句的表現(xiàn)是產(chǎn)生一個(gè)錯(cuò)誤。 REPLACE 語句也可以褐 SELECT 相配合,所以上兩小節(jié)的內(nèi)容完全適合 REPALCE.。 應(yīng)該注意的是,由于 REPLACE 語句可能改變原有的記錄,因此使用時(shí)要小心

40、。 3.5.4 使用 LOAD 語句批量錄入數(shù)據(jù) 本章的前面討論如何使用 SQL 向一個(gè)表中插入數(shù)據(jù)。但是,如果你需要向一個(gè)表 中添加許多條記錄,使用 SQL 語句輸入數(shù)據(jù)是很不方便的。幸運(yùn)的是,MySQL 提供了 一些方法用于批量錄入數(shù)據(jù),使得向表中添加數(shù)據(jù)變得容易了。本節(jié)以及下一節(jié),將介 紹這些方法。本節(jié)將介紹 SQL 語言級(jí)的解決方法。 1、基本語法 語法:LOAD DATA LOCAL INFILE file_name.txt REPLACE | IGNORE INTO TABLE tbl_name LOAD DATA INFILE 語句從一個(gè)文本文件中以很高的速度讀入一個(gè)表中。如果指

41、 定 LOCAL 關(guān)鍵詞,從客戶主機(jī)讀文件。如果 LOCAL 沒指定,文件必須位于服務(wù)器上。 (LOCAL 在 MySQL3.22.6 或以后版本中可用。) 為了安全原因,當(dāng)讀取位于服務(wù)器上的文本文件時(shí),文件必須處于數(shù)據(jù)庫目錄或可 被所有人讀取。另外,為了對服務(wù)器上文件使用 LOAD DATA INFILE,在服務(wù)器主機(jī) 上你必須有 file 的權(quán)限。見第七章 數(shù)據(jù)庫安全。 REPLACE 和 IGNORE 關(guān)鍵詞控制對現(xiàn)有的唯一鍵記錄的重復(fù)的處理。如果你指定 REPLACE,新行將代替有相同的唯一鍵值的現(xiàn)有行。如果你指定 IGNORE,跳過有唯 一鍵的現(xiàn)有行的重復(fù)行的輸入。如果你不指定任何一

42、個(gè)選項(xiàng),當(dāng)找到重復(fù)鍵鍵時(shí),出現(xiàn) 一個(gè)錯(cuò)誤,并且文本文件的余下部分被忽略時(shí)。 如果你使用 LOCAL 關(guān)鍵詞從一個(gè)本地文件裝載數(shù)據(jù),服務(wù)器沒有辦法在操作的當(dāng) 中停止文件的傳輸,因此缺省的行為好像 IGNORE 被指定一樣。 2、文件的搜尋原則 當(dāng)在服務(wù)器主機(jī)上尋找文件時(shí),服務(wù)器使用下列規(guī)則: 如果給出一個(gè)絕對路徑名,服務(wù)器使用該路徑名。 如果給出一個(gè)有一個(gè)或多個(gè)前置部件的相對路徑名,服務(wù)器相對服務(wù)器的數(shù)據(jù) 目錄搜索文件。 如果給出一個(gè)沒有前置部件的一個(gè)文件名,服務(wù)器在當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)庫目錄 尋找文件。 注意這些規(guī)則意味著一個(gè)像“./myfile.txt”給出的文件是從服務(wù)器的數(shù)據(jù)目錄讀取, 而作

43、為“myfile.txt”給出的一個(gè)文件是從當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)庫目錄下讀取。也要注意, 對于下列哪些語句,對 db1 文件從數(shù)據(jù)庫目錄讀取,而不是 db2: mysql USE db1; mysql LOAD DATA INFILE ./data.txt INTO TABLE db2.my_table; 3、FIELDS 和 LINES 子句的語法 如果你指定一個(gè) FIELDS 子句,它的每一個(gè)子句(TERMINATED BY, OPTIONALLY ENCLOSED BY 和 ESCAPED BY)也是可選的,除了你必須至少指定他 們之一。 如果你不指定一個(gè) FIELDS 子句,缺省值與如果你

44、這樣寫的相同: FIELDS TERMINATED BY t ENCLOSED BY ESCAPED BY 如果你不指定一個(gè) LINES 子句,缺省值與如果你這樣寫的相同: LINES TERMINATED BY n 換句話說,缺省值導(dǎo)致讀取輸入時(shí),LOAD DATA INFILE 表現(xiàn)如下: 在換行符處尋找行邊界 在定位符處將行分進(jìn)字段 不要期望字段由任何引號(hào)字符封裝 將由“”開頭的定位符、換行符或“”解釋是字段值的部分字面字符 LOAD DATA INFILE 能被用來讀取從外部來源獲得的文件。例如,以 dBASE 格式 的文件將有由逗號(hào)分隔并用雙引號(hào)包圍的字段。如果文件中的行由換行符終止

45、,下面顯 示的命令說明你將用來裝載文件的字段和行處理選項(xiàng): mysql LOAD DATA INFILE data.txt INTO TABLE tbl_name FIELDS TERMINATED BY , ENCLOSED BY LINES TERMINATED BY n; 任何字段或行處理選項(xiàng)可以指定一個(gè)空字符串()。如果不是空,F(xiàn)IELDS OPTIONALLY ENCLOSED BY 和 FIELDS ESCAPED BY 值必須是一個(gè)單個(gè)字符。 FIELDS TERMINATED BY 和 LINES TERMINATED BY 值可以是超過一個(gè)字符。例如, 寫入由回車換行符對(C

46、R+LF)終止的行,或讀取包含這樣行的一個(gè)文件,指定一個(gè) LINES TERMINATED BY rn子句。 FIELDS OPTIONALLY ENCLOSED BY 控制字段的包圍字符。對于輸出(SELECT . INTO OUTFILE),如果你省略 OPTIONALLY,所有的字段由 ENCLOSED BY 字符包 圍。對于這樣的輸出的一個(gè)例子(使用一個(gè)逗號(hào)作為字段分隔符)顯示在下面: 1,a string,100.20 2,a string containing a , comma,102.20 3,a string containing a quote,102.20 4,a str

47、ing containing a , quote and comma,102.20 如果你指定 OPTIONALLY,ENCLOSED BY 字符僅被用于包圍 CHAR 和 VARCHAR 字段: 1,a string,100.20 2,a string containing a , comma,102.20 3,a string containing a quote,102.20 4,a string containing a , quote and comma,102.20 注意,一個(gè)字段值中的 ENCLOSED BY 字符的出現(xiàn)通過用 ESCAPED BY 字符作為 其前綴來轉(zhuǎn)義。也要注

48、意,如果你指定一個(gè)空 ESCAPED BY 值,可能產(chǎn)生不能被 LOAD DATA INFILE 正確讀出的輸出。例如,如果轉(zhuǎn)義字符為空,上面顯示的輸出顯 示如下。注意到在第四行的第二個(gè)字段包含跟隨引號(hào)的一個(gè)逗號(hào),它(錯(cuò)誤地)好象要終 止字段: 1,a string,100.20 2,a string containing a , comma,102.20 3,a string containing a quote,102.20 4,a string containing a , quote and comma,102.20 FIELDS ESCAPED BY 控制如何寫入或讀出特殊字符。如果

49、 FIELDS ESCAPED BY 字符不是空的,它被用于前綴在輸出上的下列字符: FIELDS ESCAPED BY 字符 FIELDS OPTIONALLY ENCLOSED BY 字符 FIELDS TERMINATED BY 和 LINES TERMINATED BY 值的第一個(gè)字符 ASCII 0(實(shí)際上將后續(xù)轉(zhuǎn)義字符寫成 ASCII0,而不是一個(gè)零值字節(jié)) 如果 FIELDS ESCAPED BY 字符是空的,沒有字符被轉(zhuǎn)義。指定一個(gè)空轉(zhuǎn)義字符可 能不是一個(gè)好主意,特別是如果在你數(shù)據(jù)中的字段值包含剛才給出的表中的任何字符。 對于輸入,如果 FIELDS ESCAPED BY 字符

50、不是空的,該字符的出現(xiàn)被剝?nèi)ゲ⑶液?續(xù)字符在字面上作為字段值的一個(gè)部分。例外是一個(gè)轉(zhuǎn)義的“0”或“N”(即,0 或 N,如果轉(zhuǎn)義字符是“”)。這些序列被解釋為 ASCII 0(一個(gè)零值字節(jié))和 NULL。見 下面關(guān)于 NULL 處理的規(guī)則。 3.5.5 總結(jié) 為數(shù)據(jù)庫裝載數(shù)據(jù)是管理員的重要職責(zé)之一,正因?yàn)橹匾?MySQL 提供的方 法也是非常繁多。其中主要的在本節(jié)已經(jīng)列舉: 1、 使用 INSERT、REPLACE 語句 2、 使用 INSERT/REPLACESELECT 語句 3、 使用 LOAD DATA INFILE 語句 4、 使用實(shí)用程序 mysqlimport(將在第五章介

51、紹) 3.6 查詢數(shù)據(jù)表中的記錄 除非最終檢索它們并利用它們來做點(diǎn)事情,否則將記錄放入數(shù)據(jù)庫沒什么好處。這 就是 SELECT 語句的用途,即幫助取出數(shù)據(jù)。SELECT 大概是 SQL 語言中最常用的 語句,而且怎樣使用它也最為講究;用它來選擇記錄可能相當(dāng)復(fù)雜,可能會(huì)涉及許多表 中列之間的比較。本節(jié)介紹 Select 語句關(guān)于查詢的最基本功能。 SELECT 語句的語法如下: SELECT selection_list選擇哪些列 FROM table_list從何處選擇行 WHERE primary_constraint 行必須滿足什么條件 GROUP BY grouping_columns怎

52、樣對結(jié)果分組 HAVING secondary_constraint行必須滿足的第二條件 ORDER BY sorting_columns 怎樣對結(jié)果排序 LIMIT count結(jié)果限定 注意:所有使用的關(guān)鍵詞必須精確地以上面的順序給出。例如,一個(gè) HAVING 子句 必須跟在 GROUP BY 子句之后和 ORDER BY 子句之前。 除了詞“SELECT”和說明希望檢索什么的 column_list 部分外,語法中的每樣?xùn)| 西都是可選的。有的數(shù)據(jù)庫還需要 FROM 子句。MySQL 有所不同,它允許對表達(dá)式 求值而不引用任何表。 3.6.1 普通查詢 SELECT 最簡單的形式是從一張表中

53、檢索每樣?xùn)|西: mysql SELECT * FROM pet; 其結(jié)果為: +-+-+-+-+-+-+ | name | owner | species | sex | birth | death | +-+-+-+-+-+-+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Chirpy | Gwen | bird | f | 1998-09-1

54、1 | NULL | | Fang | Benny | dog | m | 1990-08-27 | NULL | | Bowser | Diane | dog | m | 1990-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +-+-+-+-+-+-+ 查詢特定行: 你能從你的表中只

55、選擇特定的行。例如,如果你想要驗(yàn)證你對 Bowser 的出生日期 所做的改變,像這樣精選 Bowser 的記錄: mysql SELECT * FROM pet WHERE name = Bowser; 其結(jié)果為: +-+-+-+-+-+-+ | name | owner | species | sex | birth | death | +-+-+-+-+-+-+ | Bowser | Diane | dog | m | 1990-08-31 | 1995-07-29 | +-+-+-+-+-+-+ 你可以對照前一個(gè)例子來驗(yàn)證。 查詢特定列 如果你不想要看到你的表的整個(gè)行,就命名你感興趣的列

56、,用逗號(hào)分開。例如,如 果你想要知道你的動(dòng)物什么時(shí)候出生的,精選 name 和 birth 列: mysql SELECT name, birth FROM pet where owner=Gwen; 其結(jié)果為: +-+-+ | name | birth | +-+-+ | Claws | 1994-03-17 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | +-+-+ 進(jìn)行表達(dá)式計(jì)算 前面的多數(shù)查詢通過從表中檢索值已經(jīng)產(chǎn)生了輸出結(jié)果。MySQL 還允許作為一個(gè) 公式的結(jié)果來計(jì)算輸出列的值。表達(dá)式可以簡單也可以復(fù)雜。下面的查詢求一個(gè)簡單表 達(dá)式的值(常量)以及一個(gè)涉及幾個(gè)算術(shù)運(yùn)算符和兩個(gè)函

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論