第一篇:Mysql數(shù)據(jù)庫學(xué)習(xí)心得
Mysql數(shù)據(jù)庫學(xué)習(xí)心得(1)
由于工作中需要使用mysql,筆者通過網(wǎng)上學(xué)習(xí),動(dòng)手實(shí)踐,終于從一個(gè)“數(shù)據(jù)庫菜鳥”變成了能熟練操作mysql的“準(zhǔn)大蝦”了,:)。現(xiàn)將學(xué)習(xí)心得整理如下。
MySQL是完全網(wǎng)絡(luò)化的跨平臺(tái)關(guān)系型數(shù)據(jù)庫系統(tǒng),一個(gè)真正的多用戶、多線程SQL數(shù)據(jù)庫服務(wù)器,同時(shí)是具有客戶機(jī)/服務(wù)器體系結(jié)構(gòu)的分布式數(shù)據(jù)庫管理系統(tǒng)。它具有功能強(qiáng)、使
用簡(jiǎn)便、管理方便、運(yùn)行速度快、安全可靠性強(qiáng)等優(yōu)點(diǎn),用戶可利用許多語言編寫訪問MySQL數(shù)據(jù)庫的程序,對(duì)于中、小型應(yīng)用系統(tǒng)是非常理想的。除了支持標(biāo)準(zhǔn)的ANSI SQL語句,更重要的是,它還支持多種平臺(tái),而在Unix系統(tǒng)上該軟件支持多線程運(yùn)行方式,從而能獲得相當(dāng)好的性能。對(duì)于不使用Unix的用戶,它可以在Windows NT系統(tǒng)上以系統(tǒng)服務(wù)方式運(yùn)行,或者在Windows 95/98系統(tǒng)上以普通進(jìn)程方式運(yùn)行。而在Unix/Linux系統(tǒng)上,MySQL支持多線程運(yùn)行方式,從而能獲得相當(dāng)好的性能,而且它是屬于開放源代碼軟。
MySQL是以一個(gè)客戶機(jī)/服務(wù)器結(jié)構(gòu)的實(shí)現(xiàn),它由一個(gè)服務(wù)器守護(hù)程序mysqld和很多不同的客戶程序和庫組成,MySQL的執(zhí)行性能非常高,運(yùn)行速度非常快,并非常容易使用,是一個(gè)非常棒的數(shù)據(jù)庫。MySQL的官方發(fā)音是“My Ess Que Ell”(不是MY-SEQUEL)。
一.獲得MySQL
首先必須下載MySQL。Mysql的官方網(wǎng)站是:www.tmdps.cnf copy為c:my.cnf,并把c:mysqlibgwinb19.dll copy到winntsystem32。
3。啟動(dòng)mysql的方法是:
c:mysqlinmysqld-shareware--install
net start mysql
這么簡(jiǎn)單,就可以啟動(dòng)了。
4。更改超級(jí)用戶(root)的密碼:
C:mysqlinmysql mysql
mysql> UPDATE user SET password=PASSWORD('your password')swheresuser='root';
mysql> QUIT
C:mysqlinmysqladmin reload
使用命令C:mysqlinmysqlshow去看看檢測(cè)一下。在這里應(yīng)該顯示:
+-----------+
| Databases |
+-----------+
| mysql |
| test |
+-----------+
看到這些信息這一步就證明沒問題了
再來:
C:mysqlinmysqlshow--user=root--password=your password mysql
在這里應(yīng)該顯示:
Database: mysql
+--------------+
| Tables |
+--------------+
| columns_priv |
| db |
| host |
| tables_priv |
| user |
+--------------+
一切搞定!
5。C:mysqlinmysqladmin version status proc
應(yīng)該可以看到這些版本信息的:
mysqladmin Ver 8.0 Distrib 3.22.32, for Win95/Win98 on i586
TCX Datakonsult AB, by Monty
Server version 3.22.32-shareware-debug
Protocol version 10
Connection localhost via TCP/IP
TCP port 3306
Uptime: 1 hour 29 min 30 sec
Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K Max memory
used: 16490K
Uptime: 5370 Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K
Max memory used: 16490K
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+----+---------+------+-------+------------------+
| 35 | ODBC | localhost | | Query | 0 | | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
接著,用show databases命令可以將安裝的數(shù)據(jù)庫列出來:
mysql> show databases;
你就可以看到:
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+ rows in set(0.00 sec)
如果一切正常的話,那說明MySQL可以完全工作了!如果要退出程序,輸入:exit
mysql> exit;
Bye
Mysql數(shù)據(jù)庫學(xué)習(xí)心得(3)------------------
三.Mysql常識(shí)
(一)字段類型
1.INT[(M)]
正常大小整數(shù)類型
2.DOUBLE[(M,D)] [ZEROFILL]
正常大小(雙精密)浮點(diǎn)數(shù)字類型
3.DATE
日期類型。支持的范圍是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式來顯示DATE值,但是允許你使用字符串或數(shù)字把值賦給
DATE列
4.CHAR(M)
定長(zhǎng)字符串類型,當(dāng)存儲(chǔ)時(shí),總是是用空格填滿右邊到指定的長(zhǎng)度
5.BLOB TEXT
BLOB或TEXT類型,最大長(zhǎng)度為65535(2^16-1)個(gè)字符。
6.VARCHAR
變長(zhǎng)字符串類型,最常用的類型。
(二)基本操作
1:顯示數(shù)據(jù)庫
mysql>SHOW DATABASES;
2:當(dāng)前選擇的數(shù)據(jù)庫,mysql> SELECT DATABASE();
+------------+
| DATABASE()|
+------------+
| test |
+------------+
3.當(dāng)前數(shù)據(jù)庫包含的表信息:
mysql> SHOW TABLES;
+---------------------+
| Tables in test |
+---------------------+
| mytable1 |
| mytable2 |
+---------------------+
4.獲取表結(jié)構(gòu)
mysql> desc mytable1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| s1 | varchar(20)| YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5.創(chuàng)建表
表是數(shù)據(jù)庫的最基本元素之一,表與表之間可以相互獨(dú)立,也可以相互關(guān)聯(lián)。創(chuàng)建表的基本語法如下:
create table table_name
(column_name datatype {identity |null|not null},…)
其中參數(shù)table_name和column_name必須滿足用戶數(shù)據(jù)庫中的識(shí)別器(identifier)的要求,參數(shù)datatype是一個(gè)標(biāo)準(zhǔn)的SQL類型或由用戶數(shù)
據(jù)庫提供的類型。用戶要使用non-null從句為各字段輸入數(shù)據(jù)。
create table還有一些其他選項(xiàng),如創(chuàng)建臨時(shí)表和使用select子句從其他的表中讀取某些字段組成新表等。還有,在創(chuàng)建表是可用PRIMARY
KEY、KEY、INDEX等標(biāo)識(shí)符設(shè)定某些字段為主鍵或索引等。書寫上要注意:在一對(duì)圓括號(hào)里的列出完整的字段清單。字段名間用逗號(hào)隔開
。字段名間的逗號(hào)后要加一個(gè)空格。最后一個(gè)字段名后不用逗號(hào)。所有的SQL陳述都以分號(hào)“;”結(jié)束。
例:
mysql>CREATE TABLE guest(name varchar(10),sex varchar(2),age int(3),career varchar(10));
6.創(chuàng)建索引
索引用于對(duì)數(shù)據(jù)庫的查詢。一般數(shù)據(jù)庫建有多種索引方案,每種方案都精于某一特定的查詢類。索引可以加速對(duì)數(shù)據(jù)庫的查詢過程。創(chuàng)建
索引的基本語法如下:
create index index_name
on table_name(col_name[(length)],...)
例:
mysql> CREATE INDEX number ON guest(number(10));
7.執(zhí)行查詢
查詢是使用最多的SQL命令。查詢數(shù)據(jù)庫需要憑借結(jié)構(gòu)、索引和字段類型等因素。大多數(shù)數(shù)據(jù)庫含有一個(gè)優(yōu)化器(optimizer),把用戶的查
詢語句轉(zhuǎn)換成可選的形式,以提高查詢效率。
值得注意的是MySQL不支持SQL92標(biāo)準(zhǔn)的嵌套的where子句,即它只支持一個(gè)where子句。其基本語法如下:
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]
其中where從句是定義選擇標(biāo)準(zhǔn)的地方,where_definition可以有不同的格式,但都遵循下面的形式:
字段名操作表達(dá)式
字段名操作字段名
在第一種形式下,標(biāo)準(zhǔn)把字段的值與表達(dá)式進(jìn)行比較;在第二種形式下,把兩個(gè)字段的值進(jìn)行比較。根據(jù)所比較的數(shù)據(jù)類型,search_condition中的操作可能選以下幾種:
=檢查是否相等
!=檢查是否不等
>(或>=)檢查左邊值是否大于(或大于等于)右邊值
<(或<=)檢查左邊值是否小于(或小于等于)右邊值
[not] between檢查左邊值是否在某個(gè)范圍內(nèi)
[not] in檢查左邊是否某個(gè)特定集的成員
[not] like檢查左邊是否為右邊的子串
is [not] null檢查左邊是否為空值
在這里,可以用通配符_代表任何一個(gè)字符,%代表任何字符串。使用關(guān)鍵字、和可以生成復(fù)雜的詞,它們運(yùn)行檢查時(shí)使用
布爾表達(dá)式的多重標(biāo)準(zhǔn)集。
例:
mysql> select t1.name, t2.salary from employee AS t1, info AS t2swherest1.name = t2.name;
mysql> select college, region, seed from tournament
ORDER BY region, seed;
mysql> select col_name from tbl_nameswherescol_name > 0;
8.改變表結(jié)構(gòu)
在數(shù)據(jù)庫的使用過程中,有時(shí)需要改變它的表結(jié)構(gòu),包括改變字段名,甚至改變不同數(shù)據(jù)庫字段間的關(guān)系。可以實(shí)現(xiàn)上述改變的命令是
alter,其基本語法如下:
alter table table_name alter_spec [, alter_spec...]
例:
mysql> alter table dbname add column userid int(11)not null primary key auto_increment;
這樣,就在表dbname中添加了一個(gè)字段userid,類型為int(11)。
9.修改表中數(shù)據(jù)
在使用數(shù)據(jù)庫過程中,往往要修改其表中的數(shù)據(jù),比如往表中添加新數(shù)據(jù),刪除表中原有數(shù)據(jù),或?qū)Ρ碇性袛?shù)據(jù)進(jìn)行更改。它們的基本
語法如下:
數(shù)據(jù)添加:
insert [into] table_name [(column(s))]
values(expression(s))
例:
mysql>insertsintosmydatabase values('php','mysql','asp','sqlserver','jsp','oracle');Mysql數(shù)據(jù)庫學(xué)習(xí)心得(4)------------------
10.表的數(shù)據(jù)更新
(1)一次修改一個(gè)字段,再次注意語法。文本需要加引號(hào)但數(shù)字不要。
mysql>update table01 set field03='new info'swheresfield01=1;
Query OK, 1 row affected(0.00 sec)
(2)一次改變多個(gè)字段,記住在每一個(gè)更新的字段間用逗號(hào)隔開。
mysql>update table01 set field04=19991022, field05=062218swheresfield01=1;
Query OK, 1 row affected(0.00 sec)
(3)一次更新多個(gè)數(shù)據(jù)
mysql>update table01 set field05=152901swheresfield04>19990101;
Query OK, 3 rows affected(0.00 sec)
11.刪除數(shù)據(jù)
mysql>delete from table01swheresfield01=3;
Query OK, 1 row affected(0.00 sec)
12.導(dǎo)入數(shù)據(jù)庫表
(1)創(chuàng)建.sql文件
(2)先產(chǎn)生一個(gè)庫如auction.c:mysqlin>mysqladmin-u root-p creat auction,會(huì)提示輸入密碼,然后成功創(chuàng)建。
(3)導(dǎo)入auction.sql文件
c:mysqlin>mysql-u root-p auction < auction.sql。
通過以上操作,就可以創(chuàng)建了一個(gè)數(shù)據(jù)庫auction以及其中的一個(gè)表auction。
13.mysql數(shù)據(jù)庫的授權(quán)
mysql>grant select,insert,delete,create,drop
on *.*(或test.*/user.*/..)
to用戶名@localhost
identified by '密碼';
如:新建一個(gè)用戶帳號(hào)以便可以訪問數(shù)據(jù)庫,需要進(jìn)行如下操作:
mysql> grant usage
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected(0.15 sec)
此后就創(chuàng)建了一個(gè)新用戶叫:testuser,這個(gè)用戶只能從localhost連接到數(shù)據(jù)庫并可以連接到test數(shù)據(jù)庫。下一步,我們必須指定
testuser這個(gè)用戶可以執(zhí)行哪些操作:
mysql> GRANT select, insert, delete,update
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected(0.00 sec)
此操作使testuser能夠在每一個(gè)test數(shù)據(jù)庫中的表執(zhí)行SELECT,INSERT和DELETE以及UPDATE查詢操作。現(xiàn)在我們結(jié)束操作并退出MySQL客戶
程序:
mysql> exit
Bye
14.授權(quán)MySQL用戶密碼
MySQL數(shù)據(jù)庫的默認(rèn)用戶名為“root”(MS SQL Server的sa相似),密碼默認(rèn)為空。在DOS提示符(注 意,不是mysql提示符)下輸入
c:mysqlin>“mysqladmin-u root-p password newpassword
回車后會(huì)提示你輸入原來的密碼,由于原來密碼為空,直接回車,root用戶的密碼便改為”newpassword“了。
Mysql數(shù)據(jù)庫學(xué)習(xí)心得(5)------------------
四.安裝phpMyAdmin
MySQL圖形界面管理器phpMyAdmin是一套以php3寫成,針對(duì)MySQL數(shù)據(jù)庫系統(tǒng)的Web管理界面。它可以很方便地以圖形化界面,來對(duì)MySQL數(shù)據(jù)庫里的字段、數(shù)據(jù)進(jìn)行增加、刪除等的動(dòng)作,更可以做數(shù)據(jù)庫本身的增刪管理;phpMyAdmin可以管理整個(gè)MySQL服務(wù)器(需要超級(jí)用戶),也可以管理單個(gè)數(shù)據(jù)庫。另外,您也可以通過使用這個(gè)圖形化界面來學(xué)習(xí)SQL正確的語法,直至熟練掌握。那要等到你看過MySQL手冊(cè)中相關(guān)的部分。你可以到http://www.phpwizard.net/phpMyAdmin/去下載最新的版本。
首先,將phpMyAdmin軟件包解到一個(gè)目錄下。
1.修改文檔config.inc.php3。
將原來的設(shè)定:
§cfgServers[1]['host'] = '';// MySQL hostname
§cfgServers[1]['port'] = '';// MySQL port-leave blank fordefault port
§cfgServers[1]['adv_auth'] = false;// Use advanced authentication?
§cfgServers[1]['stduser'] = '';// MySQL standard user(only needed with advanced auth)
§cfgServers[1]['stdpass'] = '';// MySQL standard password(only needed with advanced auth)
§cfgServers[1]['user'] = '';// MySQL user(only needed withbasic auth)
§cfgServers[1]['password'] = '';// MySQL password(only needed with basic auth)
§cfgServers[1]['only_db'] = '';// If set to a db-name, only this db is accessible
§cfgServers[1]['verbose'] = '';// Verbose name for this host-leave blank to show the hostname
:
:
require(”english.inc.php3“);
修改成:
§cfgServers[1]['host'] = 'MySQL Server的hostname';//填入您的MySQL Server的主機(jī)名稱
§cfgServers[1]['port'] = '';//填入連結(jié)MySQL的port,不填則以預(yù)設(shè)的port進(jìn)行連結(jié)
§cfgServers[1]['adv_auth'] = true;//改成true則進(jìn)入phpMyAdmin必須先身份認(rèn)證
§cfgServers[1]['stduser'] = 'root';// MySQL使用者的帳號(hào)
§cfgServers[1]['stdpass'] = '密碼';// MySQL使用者的密碼
§cfgServers[1]['user'] = 'root';// MySQL管理帳號(hào)
§cfgServers[1]['password'] = '密碼';// MySQL管理密碼
§cfgServers[1]['only_db'] = '';//指定管理的資庫名稱,不填則可以管理整個(gè)Server
§cfgServers[1]['verbose'] = '';//指定MySQL的名稱,不填則使用系統(tǒng)本身的hostname
:
:
require(”chinese_gb.inc.php3");//將語言改成中文
說明:
(1)因本管理接口,可以以一個(gè)接口,管理多個(gè)MySQL Server,所以可以在config.inc.php3中找到
§cfgServers[1]...§cfgServers[1]...§cfgServers[1]...:
§cfgServers[2]...§cfgServers[2]...§cfgServers[2]...其中[1]代表第一個(gè)MySQL Server,[2]代表第二個(gè)MySQL Server,您要管理的MySQL Server超過三臺(tái)以上,您可以依照同樣的?述,增加[4].....下去!
(2)若您的MySQL Server與http Server是同一臺(tái),則§cfgServers[1]['host'] =可直接填入localhost。
最后,打開流覽器,輸入你的網(wǎng)址/phpMyAdmin之后您會(huì)看到一個(gè)密碼驗(yàn)證的小窗口,輸入您的MySQL管理帳號(hào)及密碼,即可成功地看到phpMyAdmin的管理畫面。通過phpmyadmin,你就可以圖形化的、方便的管理你的所有數(shù)據(jù)庫了。
五.小結(jié)
通過以上的學(xué)習(xí)和操作,終于可以自由操作mysql數(shù)據(jù)庫了,也可以輕車熟路的使用php或者asp調(diào)用mysql了。最后,筆者要特別感謝開發(fā)了mysql并且免費(fèi)貢獻(xiàn)的天才以及在網(wǎng)上提供mysql使用說明的大蝦們。
第二篇:mysql數(shù)據(jù)庫常用語句
mysql數(shù)據(jù)庫常用語句
SQL分類:
DDL—數(shù)據(jù)定義語言(CREATE,ALTER,DROP,DECLARE)DML—數(shù)據(jù)操縱語言(SELECT,DELETE,UPDATE,INSERT)DCL—數(shù)據(jù)控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,簡(jiǎn)要介紹基礎(chǔ)語句:
1、說明:創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE database-name
2、說明:刪除數(shù)據(jù)庫 drop database dbname
3、說明:備份sql server---創(chuàng)建 備份數(shù)據(jù)的 device USE master EXEC sp_addumpdevice ?disk?, ?testBack?, ?c:mssql7backupMyNwind_1.dat?---開始 備份
BACKUP DATABASE pubs TO testBack
4、說明:創(chuàng)建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根據(jù)已有的表創(chuàng)建新表:
A:create table tab_new like tab_old(使用舊表創(chuàng)建新表)B:create table tab_new as select col1,col2… from tab_old definition only
5、說明:
刪除新表:drop table tabname
6、說明:
增加一個(gè)列:Alter table tabname add column col type 注:列增加后將不能刪除。DB2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長(zhǎng)度。
7、說明:
添加主鍵:Alter table tabname add primary key(col)說明:
刪除主鍵:Alter table tabname drop primary key(col)
8、說明:
創(chuàng)建索引:create [unique] index idxname on tabname(col….)刪除索引:drop index idxname 注:索引是不可更改的,想更改必須刪除重新建。
9、說明:
創(chuàng)建視圖:create view viewname as select statement 刪除視圖:drop view viewname
10、說明:幾個(gè)簡(jiǎn)單的基本的sql語句 選擇:select * from table1 where 范圍
插入:insert into table1(field1,field2)values(value1,value2)刪除:delete from table1 where 范圍
更新:update table1 set field1=value1 where 范圍 查找:select * from table1 where field1 like ?%value1%?---like的語法很精妙,查資料!排序:select * from table1 order by field1,field2 [desc] 總數(shù):select count * as totalcount from table1 求和:select sum(field1)as sumvalue from table1平均:select avg(field1)as avgvalue from table1 最大:select max(field1)as maxvalue from table1 最小:select min(field1)as minvalue from table1
11、說明:幾個(gè)高級(jí)查詢運(yùn)算詞 A: UNION 運(yùn)算符
UNION 運(yùn)算符通過組合其他兩個(gè)結(jié)果表(例如 TABLE1 和 TABLE2)并消去表中任何重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 UNION 一起使用時(shí)(即 UNION ALL),不消除重復(fù)行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。B: EXCEPT 運(yùn)算符
EXCEPT 運(yùn)算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 EXCEPT 一起使用時(shí)(EXCEPT ALL),不消除重復(fù)行。C: INTERSECT 運(yùn)算符
INTERSECT 運(yùn)算符通過只包括 TABLE1 和 TABLE2 中都有的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 INTERSECT 一起使用時(shí)(INTERSECT ALL),不消除重復(fù)行。
注:使用運(yùn)算詞的幾個(gè)查詢結(jié)果行必須是一致的。
12、說明:使用外連接 A、left outer join:
左外連接(左連接):結(jié)果集幾包括連接表的匹配行,也包括左連接表的所有行。SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right outer join:
右外連接(右連接):結(jié)果集既包括連接表的匹配連接行,也包括右連接表的所有行。C:full outer join:
全外連接:不僅包括符號(hào)連接表的匹配行,還包括兩個(gè)連接表中的所有記錄。
其次,大家來看一些不錯(cuò)的sql語句
1、說明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a 新表名:b)(Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、說明:拷貝表(拷貝數(shù)據(jù),源表名:a 目標(biāo)表名:b)(Access可用)insert into b(a, b, c)select d,e,f from b;
3、說明:跨數(shù)據(jù)庫之間表的拷貝(具體數(shù)據(jù)使用絕對(duì)路徑)(Access可用)insert into b(a, b, c)select d,e,f from b in ?具體數(shù)據(jù)庫? where 條件 例子:..from b in ?“&Server.MapPath(”.“)&”data.mdb“ &”? where..4、說明:子查詢(表名1:a 表名2:b)select a,b,c from a where a IN(select d from b)或者: select a,b,c from a where a IN(1,2,3)
5、說明:顯示文章、提交人和最后回復(fù)時(shí)間
select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b
6、說明:外連接查詢(表名1:a 表名2:b)select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、說明:在線視圖查詢(表名1:a)select * from(SELECT a,b,c FROM a)T where t.a > 1;
8、說明:between的用法,between限制查詢數(shù)據(jù)范圍時(shí)包括了邊界值,not between不包括 select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 數(shù)值1 and 數(shù)值2
9、說明:in 的使用方法
select * from table1 where a [not] in(?值1?,?值2?,?值4?,?值6?)
10、說明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息
delete from table1 where not exists(select * from table2 where table1.field1=table2.field1)
11、說明:四表聯(lián)查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where.....12、說明:日程安排提前五分鐘提醒
SQL: select * from 日程安排 where datediff(?minute?,f開始時(shí)間,getdate())>5
13、說明:一條sql 語句搞定數(shù)據(jù)庫分頁
select top 10 b.* from(select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段
14、說明:前10條記錄
select top 10 * form table1 where 范圍
15、說明:選擇在每一組b值相同的數(shù)據(jù)中對(duì)應(yīng)的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產(chǎn)品分析,按科目成績(jī)排名,等等.)select a,b,c from tablename ta where a=(select max(a)from tablename tb where tb.b=ta.b)
16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表
(select a from tableA)except(select a from tableB)except(select a from tableC)
17、說明:隨機(jī)取出10條數(shù)據(jù)
select top 10 * from tablename order by newid()
18、說明:隨機(jī)選擇記錄 select newid()
19、說明:刪除重復(fù)記錄
Delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)20、說明:列出數(shù)據(jù)庫里所有的表名 select name from sysobjects where type=?U?
21、說明:列出表里的所有的
select name from syscolumns where id=object_id(?TableName?)
22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實(shí)現(xiàn)多重選擇,類似select 中的case。
select type,sum(case vender when ?A? then pcs else 0 end),sum(case vender when ?C? then pcs else 0 end),sum(case vender when ?B? then pcs else 0 end)FROM tablename group by type 顯示結(jié)果:
type
vender pcs 電腦
A 電腦
A 光盤
B 光盤
A 手機(jī)
B 手機(jī)
C
23、說明:初始化表table1 TRUNCATE TABLE table1
24、說明:選擇從10到15的記錄
select top 5 * from(select top 15 * from table order by id asc)table_別名 order by id desc 隨機(jī)選擇數(shù)據(jù)庫記錄的方法(使用Randomize函數(shù),通過SQL語句實(shí)現(xiàn))
對(duì)存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù)來說,隨機(jī)數(shù)特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP“找個(gè)隨機(jī)數(shù)”然后打印出來。實(shí)際上常見的解決方案是建立如下所示的循環(huán): Randomize RNumber = Int(Rnd*499)+1 While Not objRec.EOF If objRec(“ID”)= RNumber THEN...這里是執(zhí)行腳本...end if objRec.MoveNext Wend
這很容易理解。首先,你取出1到500范圍之內(nèi)的一個(gè)隨機(jī)數(shù)(假設(shè)500就是數(shù)據(jù)庫內(nèi)記錄的總數(shù))。然后,你遍歷每一記錄來測(cè)試ID 的值、檢查其是否匹配RNumber。滿足條件的話就執(zhí)行由THEN 關(guān)鍵字開始的那一塊代碼。假如你的RNumber 等于495,那么要循環(huán)一遍數(shù)據(jù)庫花的時(shí)間可就長(zhǎng)了。雖然500這個(gè)數(shù)字看起來大了些,但相比更為穩(wěn)固的企業(yè)解決方案這還是個(gè)小型數(shù)據(jù)庫了,后者通常在一 個(gè)數(shù)據(jù)庫內(nèi)就包含了成千上萬條記錄。這時(shí)候不就死定了?
采用SQL,你就可以很快地找出準(zhǔn)確的記錄并且打開一個(gè)只包含該記錄的recordset,如下所示: Randomize RNumber = Int(Rnd*499)+ 1
SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber
set objRec = ObjConn.Execute(SQL)Response.WriteRNumber & “ = ” & objRec(“ID”)& “ ” & objRec(“c_email”)
不必寫出RNumber 和ID,你只需要檢查匹配情況即可。只要你對(duì)以上代碼的工作滿意,你自可按需操作“隨機(jī)”記錄。Recordset沒有包含其他內(nèi)容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時(shí)間。
再談隨機(jī)數(shù)
現(xiàn)在你下定決心要榨干Random 函數(shù)的最后一滴油,那么你可能會(huì)一次取出多條隨機(jī)記錄或者想采用一定隨機(jī)范圍內(nèi)的記錄。把上面的標(biāo)準(zhǔn)Random 示例擴(kuò)展一下就可以用SQL應(yīng)對(duì)上面兩種情況了。
為了取出幾條隨機(jī)選擇的記錄并存放在同一recordset內(nèi),你可以存儲(chǔ)三個(gè)隨機(jī)數(shù),然后查詢數(shù)據(jù)庫獲得匹配這些數(shù)字的記錄:
SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber & “ OR ID = ” & RNumber2 & “ OR ID = ” & RNumber3
假如你想選出10條記錄(也許是每次頁面裝載時(shí)的10條鏈接的列表),你可以用BETWEEN 或者數(shù)學(xué)等式選出第一條記錄和適當(dāng)數(shù)量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 SELECT 語句只顯示一種可能(這里的ID 是自動(dòng)生成的號(hào)碼):
SQL = “SELECT * FROM Customers WHERE ID BETWEEN ” & RNumber & “ AND ” & RNumber & “+ 9”
注意:以上代碼的執(zhí)行目的不是檢查數(shù)據(jù)庫內(nèi)是否有9條并發(fā)記錄。
隨機(jī)讀取若干條記錄,測(cè)試過
Access語法:SELECT top 10 * From 表名 ORDER BY Rnd(id)Sql server:select top n * from 表名 order by newid()mysql select * From 表名 Order By rand()Limit n
Access左連接語法(最近開發(fā)要用左連接,Access幫助什么都沒有,網(wǎng)上沒有Access的SQL說明,只有自己測(cè)試, 現(xiàn)在記下以備后查)
語法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where...使用SQL語句 用...代替過長(zhǎng)的字符串顯示
語法:
SQL數(shù)據(jù)庫:select case when len(field)>10 then left(field,10)+?...? else field end as news_name,news_id from tablename
Access數(shù)據(jù)庫:SELECT iif(len(field)>2,left(field,2)+?...?,field)FROM tablename;
Conn.Execute說明
Execute方法
該方法用于執(zhí)行SQL語句。根據(jù)SQL語句執(zhí)行后是否返回記錄集,該方法的使用格式分為以下兩種:
1.執(zhí)行SQL查詢語句時(shí),將返回查詢得到的記錄集。用法為:
Set 對(duì)象變量名=連接對(duì)象.Execute(“SQL 查詢語言”)
Execute方法調(diào)用后,會(huì)自動(dòng)創(chuàng)建記錄集對(duì)象,并將查詢結(jié)果存儲(chǔ)在該記錄對(duì)象中,通過Set方法,將記錄集賦給指定的對(duì)象保存,以后對(duì)象變量就代表了該記錄集對(duì)象。
2.執(zhí)行SQL的操作性語言時(shí),沒有記錄集的返回。此時(shí)用法為:
連接對(duì)象.Execute “SQL 操作性語句” [, RecordAffected][, Option] ·RecordAffected 為可選項(xiàng),此出可放置一個(gè)變量,SQL語句執(zhí)行后,所生效的記錄數(shù)會(huì)自動(dòng)保存到該變量中。通過訪問該變量,就可知道SQL語句隊(duì)多少條記錄進(jìn)行了操作。
·Option 可選項(xiàng),該參數(shù)的取值通常為adCMDText,它用于告訴ADO,應(yīng)該將Execute方法之后的第一個(gè)字符解釋為命令文本。通過指定該參數(shù),可使執(zhí)行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法
這三個(gè)方法是連接對(duì)象提供的用于事務(wù)處理的方法。BeginTrans用于開始一個(gè)事物;RollbackTrans用于回滾事務(wù);CommitTrans用于提交所有的事務(wù)處理結(jié)果,即確認(rèn)事務(wù)的處理。
事務(wù)處理可以將一組操作視為一個(gè)整體,只有全部語句都成功執(zhí)行后,事務(wù)處理才算成功;若其中有一個(gè)語句執(zhí)行失敗,則整個(gè)處理就算失敗,并恢復(fù)到處里前的狀態(tài)。
BeginTrans和CommitTrans用于標(biāo)記事務(wù)的開始和結(jié)束,在這兩個(gè)之間的語句,就是作為事務(wù)處理的語句。判斷事務(wù)處理是否成功,可通過 連接對(duì)象的Error集合來實(shí)現(xiàn),若Error集合的成員個(gè)數(shù)不為0,則說明有錯(cuò)誤發(fā)生,事務(wù)處理失敗。Error集合中的每一個(gè)Error對(duì)象,代表一 個(gè)錯(cuò)誤信息。
第三篇:MySQL學(xué)習(xí)心得
MySQL學(xué)習(xí)心得
第一章
一、數(shù)據(jù)庫管理系統(tǒng)(DBMS)是操作和管理數(shù)據(jù)庫的大型軟件,它按一定的數(shù)據(jù)模型組織數(shù)據(jù)。
例如:Oracle、SQL Server、MySQL、Access。
二、數(shù)據(jù)庫應(yīng)用系統(tǒng)在數(shù)據(jù)庫管理系統(tǒng)(DBMS)支持下建立的計(jì)算機(jī)應(yīng)用系統(tǒng),簡(jiǎn)寫:DBAS。
例如:.net Java。
三、字符集從大到小排序:utf8--gbk--gb2312。
四、mysql的特點(diǎn):
適用于中小型網(wǎng)站中,體積小、速度快、總體擁有成本低,尤其是有開放源碼這一特點(diǎn)。
五、目前Internet上滸的網(wǎng)站構(gòu)架方式是LAMP(Linux+apache+mysql+php)即使用Linux作為操作系統(tǒng),Apache作為Web服務(wù)器,MySQL作為數(shù)據(jù)庫,PHP作為服務(wù)器端腳本解釋器,由于4個(gè)軟件都是遵循GPL的開放源碼軟件,因此使用這種方式不用花一分錢就可以建立起一個(gè)穩(wěn)定、免費(fèi)的網(wǎng)站系統(tǒng)。
第二章
一、安裝過程中遇到的問題及解決方法:
安裝過程中沒有完成時(shí)計(jì)算機(jī)關(guān)機(jī)。(沒有刪除完文件)安裝完成時(shí)找不到所配置的路徑。(可以從配置文件中找到)
安裝完成后無法正常使用。(在計(jì)算機(jī)管理中重新啟動(dòng)MySQL服務(wù))安裝到一半時(shí)沒有出現(xiàn)下一步。(誤把配置文件刪除了)安裝到最后一步時(shí)start service錯(cuò)誤。到控制面板里面先把mysql刪除.到c盤C:Program Files目錄下把mysql目錄刪除.如果在其他盤還有設(shè)置目錄也要?jiǎng)h除.空目錄也要?jiǎng)h除 到regedit把注冊(cè)表
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications/MySQL HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications/MySQL 有的話,全部刪除!(技巧:用F3循環(huán)查找“mysql”)如果任務(wù)管理器里有關(guān)mysql內(nèi)容也刪除 把防火墻關(guān)了
重新裝mysql(這里我沒有重啟計(jì)算機(jī))
重裝時(shí)候有必要的話,重啟計(jì)算機(jī),停用IIS,和刪除temp里的臨時(shí)文件.實(shí)在不行的話,配置mysql時(shí)候,把mysql服務(wù)換個(gè)服務(wù)名.使用時(shí)輸入中文會(huì)出錯(cuò)。(在配置時(shí)在“Character Set”選框中將latinl修改為gb2312;也可以在配置文件中修改)
二、啟動(dòng)服務(wù)器的方法: ① 方法1:
在 “計(jì)算機(jī)管理”中的“服務(wù)”項(xiàng)目中啟動(dòng)與停止。② 方法2: 使用命令(net start mysql和net stop mysql)
三、連接MySQL 格式: mysql-h主機(jī)地址-u用戶名 -p用戶密碼
①先在打開DOS窗口,然后進(jìn)入目錄 mysqlbin(如果設(shè)置了環(huán)境變量,則直接輸入命令即可。)②鍵入命令mysql-uroot-proot ③接回車即可進(jìn)入到MYSQL中了 MYSQL的提示符是:mysql> 注明:直接打開Mysql command line client
四、MySQL注釋符有三種: ①#...②“--...” ③
五、忘記密碼重新更改密碼
先停止mysql服務(wù),修改D:MySQLMySQL Server 5.0 目錄下的my.ini文件,在[mysqld]下添加skip-grant-tables 啟動(dòng)mysql服務(wù)后就可以以空密碼登錄,之后別忘記修改root密碼
use mysql update user set password=password('hanaixia')where user='root';(分號(hào)不能少)password('hanaixia')此處必須用函數(shù)設(shè)置。
修改密碼后需要重新啟動(dòng)服務(wù)或者使用 flush privileges;語句,用于從mysql數(shù)據(jù)庫中的授權(quán)表重新載入權(quán)限。
把 skip-grant-tables 這一句刪掉再重啟mysql服務(wù)。
第四篇:mysql數(shù)據(jù)庫要點(diǎn)總結(jié)
查詢(R)Selec子句
書寫順序
Select distinct:要返回的列或表達(dá)式 From:從中檢索數(shù)據(jù)的表 Where:行級(jí)過濾/分組前過濾 group by:分組說明
having:組級(jí)過濾/分組后過濾 order by:輸出排序順序desc/asc limit start, count:要檢索的行數(shù) limit 3,4 從第3行開始的連續(xù)4行
SELECT order_num,sum(quantity*item_price)ordertotal FROM orderitems WHEREorder_numBETWEEN20005AND 20009GROUP BY order_num HAVINGsum(quantity*item_price)>=50ORDER BYordertotalDESCLIMIT4;執(zhí)行順序
From表名->inner/left/right/ join on->where->group by->select distinct *->having->order by->limit start, count 插入Insert into(C)INSERT INTO students(name)values(‘楊過’),(‘小龍女’);更新(U)Update UPDATE customers SETcust_email = ‘elmer@fudd.com’WHEREcust_id = 10005;刪除(D)Delete DELETE FROM customers WHEREcust_id = 10006;Truncate刪除原來的表并重新創(chuàng)建一個(gè)表,刪除標(biāo)的全部?jī)?nèi)容時(shí)效率高。
操作表
創(chuàng)建CREATE TABLE customers(Cust_idint not null auto_increment primary key,Cust_name char(50)not null,Cust_addresschar(50)null)engine = innoDB;更新ALTER TABLE刪除DROP TABLEcustomers2;重命名RENAME TABLE customers2 TO customers;操作數(shù)據(jù)庫
創(chuàng)建CREATE DATABASE xxx charset = utf8;刪除DROP DATABASEXXX;切換USE XXX;查看SHOW DATABASES;關(guān)聯(lián)查詢
INNER/LEFT/RIGHTJOIN ON SELECT students.name,subjects.title,scores.scoreFROM scores INNER JOIN students ONscores.stuid = students.id INNER JOIN subjects ONscores.subid = subjects.id;
第五篇:我的MYSQL學(xué)習(xí)心得
我的MYSQL學(xué)習(xí)心得
(十一)視圖
我的MYSQL學(xué)習(xí)心得
(一)簡(jiǎn)單語法 我的MYSQL學(xué)習(xí)心得
(二)數(shù)據(jù)類型寬度 我的MYSQL學(xué)習(xí)心得
(三)查看字段長(zhǎng)度
我的MYSQL學(xué)習(xí)心得
(四)數(shù)據(jù)類型 我的MYSQL學(xué)習(xí)心得
(五)運(yùn)算符 我的MYSQL學(xué)習(xí)心得
(六)函數(shù) 我的MYSQL學(xué)習(xí)心得
(七)查詢
我的MYSQL學(xué)習(xí)心得
(八)插入 更新 刪除 我的MYSQL學(xué)習(xí)心得
(九)索引
我的MYSQL學(xué)習(xí)心得
(十)自定義存儲(chǔ)過程和函數(shù) 我的MYSQL學(xué)習(xí)心得
(十二)觸發(fā)器 我的MYSQL學(xué)習(xí)心得
(十三)權(quán)限管理 我的MYSQL學(xué)習(xí)心得
(十四)備份和恢復(fù) 我的MYSQL學(xué)習(xí)心得
(十五)日志 我的MYSQL學(xué)習(xí)心得(十六)優(yōu)化 我的MYSQL學(xué)習(xí)心得(十七)復(fù)制
這一篇《我的MYSQL學(xué)習(xí)心得
(十一)》將會(huì)講解MYSQL的視圖 使用視圖的理由是什么?
1、安全性:一般是這樣做的:創(chuàng)建一個(gè)視圖,定義好該視圖所操作的數(shù)據(jù)。
之后將用戶權(quán)限與視圖綁定,這樣的方式是使用到了一個(gè)特性:grant語句可以針對(duì)視圖進(jìn)行授予權(quán)限。
2、查詢性能提高
3、有靈活性的功能需求后,需要改動(dòng)表的結(jié)構(gòu)而導(dǎo)致工作量比較大,那么可以使用虛擬表的形式達(dá)到少修改的效果。這是在實(shí)際開發(fā)中比較有用的
4、復(fù)雜的查詢需求,可以進(jìn)行問題分解,然后將創(chuàng)建多個(gè)視圖獲取數(shù)據(jù)。將視圖聯(lián)合起來就能得到需要的結(jié)果了。
創(chuàng)建視圖 創(chuàng)建視圖的語法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 其中,CREATE:表示新建視圖; REPLACE:表示替換已有視圖 ALGORITHM :表示視圖選擇算法 view_name :視圖名 column_list:屬性列
select_statement:表示select語句
[WITH [CASCADED | LOCAL] CHECK OPTION]參數(shù)表示視圖在更新時(shí)保證在視圖的權(quán)限范圍之內(nèi)
可選的ALGORITHM子句是對(duì)標(biāo)準(zhǔn)SQL的MySQL擴(kuò)展。
ALGORITHM可取三個(gè)值:MERGE、TEMPTABLE或UNDEFINED。
如果沒有ALGORITHM子句,默認(rèn)算法是UNDEFINED(未定義的)。算法會(huì)影響MySQL處理視圖的方式。
對(duì)于MERGE,會(huì)將引用視圖的語句的文本與視圖定義合并起來,使得視圖定義的某一部分取代語句的對(duì)應(yīng)部分。
對(duì)于TEMPTABLE,視圖的結(jié)果將被置于臨時(shí)表中,然后使用它執(zhí)行語句。
對(duì)于UNDEFINED,MySQL自己選擇所要使用的算法。如果可能,它傾向于MERGE而不是TEMPTABLE,這是因?yàn)镸ERGE通常更有效,而且如果使用了臨時(shí)表,視圖是不可更新的。
LOCAL和CASCADED為可選參數(shù),決定了檢查測(cè)試的范圍,默認(rèn)值為CASCADED。腳本 視圖的數(shù)據(jù)來自于兩個(gè)表
CREATE TABLE student(stuno INT ,stuname NVARCHAR(60))CREATE TABLE stuinfo(stuno INT ,class NVARCHAR(60),city NVARCHAR(60))
INSERT INTO student VALUES(1,'wanglin'),(2,'gaoli'),(3,'zhanghai')
INSERT INTO stuinfo VALUES(1,'wuban','henan'),(2,'liuban','hebei'),(3,'qiban','shandong')
--創(chuàng)建視圖
CREATE VIEW stu_class(id,NAME,glass)AS SELECT student.`stuno`,student.`stuname`,stuinfo.`class` FROM student ,stuinfo WHERE student.`stuno`=stuinfo.`stuno`
SELECT * FROM stu_class
查看視圖
查看視圖必須要有SHOW VIEW權(quán)限
查看視圖的方法包括:DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW DESCRIBE查看視圖基本信息
DESCRIBE 視圖名 DESCRIBE stu_class 結(jié)果顯示了視圖的字段定義、字段的數(shù)據(jù)類型、是否為空、是否為主/外鍵、默認(rèn)值和額外信息
DESCRIBE一般都簡(jiǎn)寫成DESC
SHOW TABLE STATUS語句查看查看視圖基本信息 查看視圖的信息可以通過SHOW TABLE STATUS的方法
SHOW TABLE STATUS LIKE 'stu_class'
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
stu_class(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)(NULL)VIEW
COMMENT的值為VIEW說明該表為視圖,其他的信息為NULL說明這是一個(gè)虛表,如果是基表那么會(huì)基表的信息,這是基表和視圖的區(qū)別
SHOW CREATE VIEW語句查看視圖詳細(xì)信息
SHOW CREATE VIEW stu_class View Create View character_set_client collation_connection-----------------------------------------------------------------
stu_class CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_class` AS select `student`.`stuno` AS `id`,`student`.`stuname` AS `name`,`stuinfo`.`class` AS `class` from(`student` join `stuinfo`)where(`student`.`stuno` = `stuinfo`.`stuno`)utf8 utf8_general_ci 執(zhí)行結(jié)果顯示視圖的名稱、創(chuàng)建視圖的語句等信息
在VIEWS表中查看視圖的詳細(xì)信息
在MYSQL中,INFORMATION_SCHEMA VIEWS表存儲(chǔ)了關(guān)于數(shù)據(jù)庫中的視圖的信息 通過對(duì)VIEWS表的查詢可以查看數(shù)據(jù)庫中所有視圖的詳細(xì)信息
SELECT * FROM `information_schema`.`VIEWS` TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION-------------------------------------------------------------------------------------------------------------------------------------------def school stu_class select
`school`.`student`.`stuno` AS `id`,`school`.`student`.`stuname` AS `name`,`school`.`stuinfo`.`class` AS `class` from `school`.`student` join `school`.`stuinfo` where(`school`.`student`.`stuno` = `school`.`stuinfo`.`stuno`)NONE YES root@localhost DEFINER utf8 utf8_general_ci 當(dāng)前實(shí)例下只有一個(gè)視圖stu_class
修改視圖
修改視圖是指修改數(shù)據(jù)庫中存在的視圖,當(dāng)基本表的某些字段發(fā)生變化時(shí),可以通過修改視圖來保持與基本表的一致性。
MYSQL中通過CREATE OR REPLACE VIEW 語句和ALTER語句來修改視圖 語法如下:
ALTER OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 該語句用于更改已有視圖的定義。其語法與CREATE VIEW類似。當(dāng)視圖不存在時(shí)創(chuàng)建,存在時(shí)進(jìn)行修改
修改視圖 DELIMITER $$
CREATE OR REPLACE VIEW `stu_class` AS SELECT
`student`.`stuno` AS `id` FROM(`student` JOIN `stuinfo`)WHERE(`student`.`stuno` = `stuinfo`.`stuno`)$$
DELIMITER;
通過DESC來查看更改之后的視圖定義
DESC stu_class 可以看到只查詢一個(gè)字段
ALTER語句修改視圖
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 這里關(guān)鍵字跟前面的一樣,這里不做介紹
使用ALTER語句修改視圖 stu_class ALTER VIEW stu_class AS SELECT stuno FROM student;使用DESC查看
DESC stu_class
更新視圖
更新視圖是指通過視圖來插入、更新、刪除表數(shù)據(jù),因?yàn)橐晥D是虛表,其中沒有數(shù)據(jù)。通過視圖更新的時(shí)候都是轉(zhuǎn)到基表進(jìn)行更新,如果對(duì)視圖增加或者刪除記錄,實(shí)際上是對(duì)基表增加或刪除記錄
我們先修改一下視圖定義
ALTER VIEW stu_class AS SELECT stuno,stuname FROM student;查詢視圖數(shù)據(jù)
UPDATE
UPDATE stu_class SET stuname='xiaofang' WHERE stuno=2
查詢視圖數(shù)據(jù)
更新成功
INSERT INSERT INTO stu_class VALUES(6,'haojie')
插入成功
DELETE
DELETE FROM stu_class WHERE stuno=1
刪除成功 當(dāng)視圖中包含如下內(nèi)容的時(shí)候,視圖的更新操作將不能被執(zhí)行(1)視圖中包含基本中被定義為非空的列
(2)定義視圖的SELECT語句后的字段列表中使用了數(shù)學(xué)表達(dá)式(3)定義視圖的SELECT語句后的字段列表中使用聚合函數(shù)
(4)定義視圖的SELECT語句中使用了DISTINCT、UNION、TOP、GROUP BY、HAVING子句