解決方法是:
如果自己的服務器,有權限修改my.ini的話,打開my.ini,查找
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
修改為
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
然后重啟MYSQL
在別人的虛擬空間上當然不可能實現,所以根本的解決方法還是修改自己的數據結構,把非空的字段加上默認值,以后設計數據庫要注意這一點,方便程序的移植
]]>MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
MySQL支持數個存儲引擎作為對不同表的類型的處理器。MySQL存儲引擎包括處理事務安全表的引擎和處理非事務安全表的引擎:
· MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默認的存儲引擎,除非你配置MySQL默認使用另外一個引擎。
· MEMORY存儲引擎提供“內存中”表。MERGE存儲引擎允許集合將被處理同樣的MyISAM表作為一個單獨的表。就像MyISAM一樣,MEMORY和MERGE存儲引擎處理非事務表,這兩個引擎也都被默認包含在MySQL中。
注釋:MEMORY存儲引擎正式地被確定為HEAP引擎。
· InnoDB和BDB存儲引擎提供事務安全表。BDB被包含在為支持它的操作系統(tǒng)發(fā)布的MySQL-Max二進制分發(fā)版里。InnoDB也默認被包括在所 有MySQL 5.1二進制分發(fā)版里,你可以按照喜好通過配置MySQL來允許或禁止任一引擎。
· EXAMPLE存儲引擎是一個“存根”引擎,它不做什么。你可以用這個引擎創(chuàng)建表,但沒有數據被存儲于其中或從其中檢索。這個引擎的目的是服務,在 MySQL源代碼中的一個例子,它演示說明如何開始編寫新存儲引擎。同樣,它的主要興趣是對開發(fā)者。
· NDB Cluster是被MySQL Cluster用來實現分割到多臺計算機上的表的存儲引擎。它在MySQL-Max 5.1二進制分發(fā)版里提供。這個存儲引擎當前只被Linux, Solaris, 和Mac OS X 支持。在未來的MySQL分發(fā)版中,我們想要添加其它平臺對這個引擎的支持,包括Windows。
· ARCHIVE存儲引擎被用來無索引地,非常小地覆蓋存儲的大量數據。
· CSV存儲引擎把數據以逗號分隔的格式存儲在文本文件中。
· BLACKHOLE存儲引擎接受但不存儲數據,并且檢索總是返回一個空集。
· FEDERATED存儲引擎把數據存在遠程數據庫中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未來的分發(fā)版中,我們想要讓它使用其它驅動器或客戶端連接方法連接到另外的數據源。
當你創(chuàng)建一個新表的時候,你可以通過添加一個ENGINE 或TYPE 選項到CREATE TABLE語句來告訴MySQL你要創(chuàng)建什么類型的表:
CREATE TABLE t (i INT) ENGINE = INNODB;
CREATE TABLE t (i INT) TYPE = MEMORY;
雖然TYPE仍然在MySQL 5.1中被支持,現在ENGINE是首選的術語。
如何選擇最適合你的存儲引擎呢?
下述存儲引擎是最常用的:
· MyISAM:默認的MySQL插件式存儲引擎,它是在Web、數據倉儲和其他應用環(huán)境下最常使用的存儲引擎之一。注意,通過更改STORAGE_ENGINE配置變量,能夠方便地更改MySQL服務器的默認存儲引擎。
· InnoDB:用于事務處理應用程序,具有眾多特性,包括ACID事務支持。
· BDB:可替代InnoDB的事務引擎,支持COMMIT、ROLLBACK和其他事務特性。
· Memory:將所有數據保存在RAM中,在需要快速查找引用和其他類似數據的環(huán)境下,可提供極快的訪問。
· Merge:允許MySQL DBA或開發(fā)人員將一系列等同的MyISAM表以邏輯方式組合在一起,并作為1個對象引用它們。對于諸如數據倉儲等VLDB環(huán)境十分適合。
· Archive:為大量很少引用的歷史、歸檔、或安全審計信息的存儲和檢索提供了完美的解決方案。
· Federated:能夠將多個分離的MySQL服務器鏈接起來,從多個物理服務器創(chuàng)建一個邏輯數據庫。十分適合于分布式環(huán)境或數據集市環(huán)境。
· Cluster/NDB:MySQL的簇式數據庫引擎,尤其適合于具有高性能查找要求的應用程序,這類查找需求還要求具有最高的正常工作時間和可用性。
· Other:其他存儲引擎包括CSV(引用由逗號隔開的用作數據庫表的文件),Blackhole(用于臨時禁止對數據庫的應用程序輸入),以及Example引擎(可為快速創(chuàng)建定制的插件式存儲引擎提供幫助)。
記住,對于整個服務器或方案,你并不一定要使用相同的存儲引擎,你可以為方案中的每個表使用不同的存儲引擎,這點很重要。
mysql> show engines;
+——————–+————+———————————————–———————-—————————–+
| Engine | Support | Comment |
+——————–+————+———————————————————–———————-——————+
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys |
| BerkeleyDB | NO | Supports transactions and page-level locking |
| BLACKHOLE | NO | /dev/null storage engine (anything you write to it disappears) |
| EXAMPLE | NO | Example storage engine |
| ARCHIVE | NO | Archive storage engine |
| CSV | NO | CSV storage engine |
| ndbcluster | NO | Clustered, fault-tolerant, memory-based tables |
| FEDERATED | NO | Federated MySQL storage engine |
| MRG_MYISAM | YES | Collection of identical MyISAM tables |
| ISAM | NO | Obsolete storage engine |
+————+———+—————————————————————————————-+
如何創(chuàng)建內存表?
創(chuàng)建內存表非常的簡單,只需注明 ENGINE= MEMORY 即可:
CREATE TABLE `tablename` ( `columnName` varchar(256) NOT NUL) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=100000000;
注意:
當內存表中的數據大于max_heap_table_size設定的容量大小時,mysql會轉換超出的數據存儲到磁盤上,因此這是性能就大打折扣了,所 以我們還需要根據我們的實際情況調整max_heap_table_size,例如在.cnf文件中[mysqld]的下面加入:
max_heap_table_size = 2048M
另外在建表語句中還可以通過MAX_ROWS來控制表的記錄數。
內存表使用哈希散列索引把數據保存在內存中,因此具有極快的速度,適合緩存中小型數據庫,但是使用上受到一些限制。
1、heap對所有用戶的連接是可見的,這使得它非常適合做緩存。
2、僅適合使用的場合。heap不允許使用xxxTEXT和xxxBLOB數據類型;只允許使用=和<=>操作符來搜索記錄 (不允許<、>、<=或>=);不支持auto_increment;只允許對非空數據列進行 索引(not null)。
注:操作符 “<=>” 說明:NULL-safe equal.這個操作符和“=”操作符執(zhí)行相同的比較操作,不過在兩個操作碼均為NULL時,其所得值為1而不為NULL,而當一個操作碼為NULL時,其所得值為0而不為NULL。
3、一旦服務器重啟,所有heap表數據丟失,但是heap表結構仍然存在,因為heap表結構是存放在實際數據庫路徑下的,不會自動刪除。重啟之后,heap將被清空,這時候對heap的查詢結果都是空的。
4、如果heap是復制的某數據表,則復制之后所有主鍵、索引、自增等格式將不復存在,需要重新添加主鍵和索引,如果需要的話。
5、對于重啟造成的數據丟失,有以下的解決辦法:
a、在任何查詢之前,執(zhí)行一次簡單的查詢,判斷heap表是否存在數據,如果不存在,則把數據重新寫入,或者DROP表重新復制某張表。這需要多做一次查詢。不過可以寫成include文件,在需要用該heap表的頁面隨時調用,比較方便。
b、對于需要該heap表的頁面,在該頁面第一次且僅在第一次查詢該表時,對數據集結果進行判斷,如果結果為空,則需要重新寫入數據。這樣可以節(jié)省一次查詢。
c、更好的辦法是在mysql每次重新啟動時自動寫入數據到heap,但是需要配置服務器,過程比較復雜,通用性受到限制。
6、一些預期可能用到的sql語句
//如果表存在,則刪除
DROP TABLE IF EXISTS `abc`;
//復制整張表xyz為heap表abc(包含所有數據)
CREATE TABLE `abc` type=heap select * from `xyz`;
//添加主鍵id
ALTER TABLE `abc` ADD PRIMARY KEY (`id`);
//添加索引username
ALTER TABLE `abc` ADD INDEX `abc` (`username`);
其它參考:
官方文檔:As indicated by the name, MEMORY tables are stored in memory. They use hash indexes by default, which makes them very fast, and very useful for creating temporary tables. However, when the server shuts down, all rows stored in MEMORY tables are lost. The tables themselves continue to exist because their definitions are stored in .frm files on disk, but they are empty when the server restarts.
可以看出來MEMORY確實是very fast,and very useful for creating temporary tables .把臨時表和內存表放在一起使用確實會快不少:create table tmp2(id int not null) engine memory;
內存表的建立還有一些限制條件:
MEMORY tables cannot contain BLOB or TEXT columns. HEAP不支持BLOB/TEXT列。
The server needs sufficient memory to maintain all MEMORY tables that are in use at the same time. 在同一時間需要足夠的內存.
To free memory used by a MEMORY table when you no longer require its contents, you should execute DELETE or TRUNCATE TABLE, or remove the table altogether using DROP TABLE.為了釋放內存,你應該執(zhí)行DELETE FROM heap_table或DROP TABLE heap_table。
幾個關鍵參數
max_heap_table_size
mysql HEAP MEMORY tables 提高行數支持的方法
別人問到的 記一下
mysql MEMORY tables 如果目前支持的行數到上限還不夠用 可以把 my.conf 配置里面
max_heap_table_size = 256M
改大
設置 MAX_ROWS
在跑著 可以 ALTER TABLE tbl_name MAX_ROWS=
MAX_ROWS 依賴于 max_heap_table_size 設置
update dede_addonarticle set body=replace(body,'news/uploads/allimg/c110826','news/uploads/blank.gif?')
可以把dedecms的文章內容表所有的圖片鏈接替換成空白圖片,這樣就可以去把已經上傳的大量圖片刪除以節(jié)省空間了,在對采集回來的數據尤其有用。
]]>利用Mysql中的 的聚合函數 count(*) 可以實現這個功能,例如需要查詢data表中name出現次數最多的記錄,可以先按照group by name分組,用count算出分組里的條數,再按照count排序:
select name,count(*) from data group by name order by count(*) DESC limit 1
不加limit限制將返回按照name重復次數排列的數據
]]>在使用聚合函數之前,我們可以通過where對查詢加限制條件,那么如果在group by之后我們要對分組里面的數據再加限制條件怎么辦呢?答案是having。
HAVING子句可以讓我們篩選成組后的各組數據.
WHERE子句在聚合前先篩選記錄.也就是說作用在GROUP BY 子句和HAVING子句前.
而 HAVING子句在聚合后對組記錄進行篩選。
having子句出現的數據必須在group by 之后,order by 之后
例如在上一篇中對name按照出現次數排序之后,我們還想只查出名字里面含有l(wèi)in的數據,可以這樣寫:
select name ,count(*) from data group by name having name like '%lin%' order by couny(*) DESC
]]>數據表t1 數據表t2
I1 C1 I2 C2
1
2
3 A
C 2
3
4 C
A
先找兩個表內都存在的數據
select i1 from t1 where exists(select * from t2 where t1.i1=t2.i2);
再找t1表內存在,t2表內不存在的數據
select i1 form t1 where not exists(select * from t2 where t1.i1=t2.i2);
需要注意:在這兩種形式的子選擇里,內層查詢中的星號代表的是外層查詢的輸出結果。內層查詢沒有必要列出有關數據列的名字,田為內層查詢關心的是外層查詢的結果有多少行。希望大家能夠理解這一點
? in 和not in 子選擇
在這種子選擇里面,內層查詢語句應該僅僅返回一個數據列,這個數據列里的值將由外層查詢語句中的比較操作來進行求值。還是以上題為例
先找兩個表內都存在的數據
select i1 from t1 where i1 in (select i2 from t2);
再找t1表內存在,t2表內不存在的數據
select i1 form t1 where i1 not in (select i2 from t2);
好象這種語句更容易讓人理解,再來個例子
比如你想找到所有居住在A和B的學生。
select * from student where state in('A','B')
二, 把子選擇查詢改寫為關聯查詢的方法。
1,匹配型子選擇查詢的改寫
下例從score數據表里面把學生們在考試事件(T)中的成績(不包括測驗成績?。┎樵兂鰜怼?br />
Select * from score where event_id in (select event_id from event where type='T');
可見,內層查詢找出所有的考試事件,外層查詢再利用這些考試事件搞到學生們的成績。
這個子查詢可以被改寫為一個簡單的關聯查詢:
Select score.* from score, event where score.event_id=event.event_id and event.event_id='T';
下例可以用來找出所有女學生的成績。
Select * from score where student_id in (select student_id form student where sex = 'f');
可以把它轉換成一個如下所示的關聯查詢:
Select * from score
Where student _id =student.student_id and student.sex ='f';
把匹配型子選擇查詢改寫為一個關聯查詢是有規(guī)律可循的。下面這種形式的子選擇查詢:
Select * from tablel
Where column1 in (select column2a from table2 where column2b = value);
可以轉換為一個如下所示的關聯查詢:
Select tablel. * from tablel,table2
Where table.column1 = table2.column2a and table2.column2b = value;
(2)非匹配(即缺失)型子選擇查詢的改寫
子選擇查詢的另一種常見用途是查找在某個數據表里有、但在另一個數據表里卻沒有的東西。正如前面看到的那樣,這種"在某個數據表里有、在另一個數據表里沒有"的說法通常都暗示著可以用一個left join 來解決這個問題。請看下面這個子選擇查詢,它可以把沒有出現在absence數據表里的學生(也就是那些從未缺過勤的學生)給查出來:
Select * from student
Where student_id not in (select student_id from absence);
這個子選擇查詢可以改寫如下所示的left join 查詢:
Select student. *
From student left join absence on student.student_id =absence.student_id
Where absence.student_id is null;
把非匹配型子選擇查詢改寫為關聯查詢是有規(guī)律可循的。下面這種形式的子選擇查詢:
Select * from tablel
Where column1 not in (select column2 from table2);
可以轉換為一個如下所示的關聯查詢:
Select tablel . *
From tablel left join table2 on tablel.column1=table2.column2
Where table2.column2 is null;
注意:這種改寫要求數據列table2.column2聲明為not null。
以下三條sql語句的效果是等效的:
SELECT * FROM `logs` WHERE id = 1 or id = 2 or id = 3
SELECT * FROM `logs` WHERE id between 1 and 3
SELECT * FROM `logs` WHERE id in (1,2,3)
經過測試性能也是差不多,如果id是一個大數組那么最后一條書寫會簡單很多,可以利用php的
函數把數組組合成(implode(',',$array))也就是(1,2,3)這樣的格式
]]>1 登陸mysql服務器
mysql -uroot -ppassword
2 進入數據庫
use haxinbbs;
3 插入一條記錄
insert into user(username,password) values('harryzyp','harryzyp');
sql="insert into 目標數據表 select * from 源數據表" (把源數據表的記錄添加到目標數據表)
4 查看一個記錄或多個
select password,sex(或*) from user where username='harryzyp';(等于 = 不等于 <> 小于 < 大于 > 小于或等于 <= 大于或等于 >=)
sql="select * from 數據表 where 字段名 in ( 值1 , 值2 , 值3 )"
sql="select * from 數據表 where 字段名 between 值1 and 值2"
模糊查詢
SQL的模式匹配允許你使用"_"匹配任何單個字符,而"%"匹配任意數目字符(包括零個字符)。
為了找出包含一個"w"的名字:
mysql> SELECT * FROM pet WHERE name LIKE "%w%";
select * from qq where id like '%8%';
限制以Publishing結尾,使用LIKE '%Publishing'
限制以A開頭:LIKE '[A]%'
限制以A開頭外:LIKE '[^A]%'
-求工資最高的員工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
from employee)
用戶可以使用邏輯連接符AND,OR和NOT。
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';
SELECT * FROM EMPLOYEES
WHERE NOT(BRANCH_OFFICE = 'Boston');
SELECT * FROM EMPLOYEES
WHERE (LAST_NAME = 'Jones'
AND FIRST_NAME = 'Indiana')
OR (LAST_NAME = 'Smith'
AND FIRST_NAME = 'Bessie');
斷言中進行NULL判斷
SELECT * FROM EMPLOYEES
WHERE SALARY IS NULL;
SELECT * FROM EMPLOYEES
WHERE SALARY IS NOT NULL;
要消除結果中的重復行,只要在SELECT語句中加上DISTINCT子句:
SELECT DISTINCT BRANCH_OFFICE FROM EMPLOYEES;
使用ORDER BY子句就可以按照升序或降序來排列結果:(如果你希望以降序排列,那么可以用關鍵字DESC)
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
按照字符串長度排序
order by length($str) DESC
第一個技巧:利用連接符連接多個字段。
如在員工基本信息表中,有員工姓名、員工職位、出身日期等等。如果現在視圖中這三個字段顯示在同一個字段中,并且中間有分割符。如我現在想顯示的結果為"經理Victor出身于1976年5月3日"。這該如何處理呢?其實,這是比較簡單的,我們可以在Select查詢語句中,利用連接符把這些字段連接起來。
如可以這么寫查詢語句:
SELECT員工職位 ||' ' ||員工姓名||'出身于'||出身日期 as 員工出身信息 FROM 員工基本信息表;
通過這條語句就可以實現如上的需求。也就是說,我們在平時查詢中,可以利用||連接符把一些相關的字段連接起來。這在報表視圖中非常的有用。如筆者以前在設計圖書館管理系統(tǒng)的時候,在書的基本信息處有圖書的出版社、出版序列號等等內容。但是,有時會在打印報表的時候,需要把這些字段合并成一個字段打印。為此,就需要利用這個連接符把這些字段連接起來。而且,利用連接符還可以在字段中間加入一些說明性的文字,以方便大家閱讀。如上面我在員工職位與員工姓名之間加入了空格;并且在員工姓名與出身日期之間加入了出身于幾個注釋性的文字。這些功能看起來比較小,但是卻可以大大的提高內容的可讀性。這也是我們在數據庫設計過程中需要關注的一個內容。
總之,令后采用連接符,可以提高我們報表的可讀性于靈活性。
5 修改字段
update user set password='harryzyp' where username='xiaohe';
sql="update 數據表 set 字段1=值1,字段2=值2 …… 字段n=值n where 條件表達式"
6 刪除一個字段
delete from user where username='xiaohe';
7 創(chuàng)建一個表
create table books(id varchar(8) primary key,name varchar(24));
8 查看一個表中的所有字段名
desc person;
9 查看所有數據庫或表
show databases或show tables;
有兩個表student和elective,建立SQL腳本如下:
create table student(id int(10) not null primary key,name varchar(20) not null);
create table elective(id int(10) auto_increment primary key,stu_id int(10) not null,class_name varchar(20));
插入數據略!!
10 查詢第二個字符為"a"的學生(student)
select * from student where name like '_a%';
11 查詢已經選過課的選課信息
select * from elective as e inner join student as s where e.stu_id=s.id;
附: (1)inner可省略 (2)where可用on代替
12 查詢所有學生的選課信息
select * from student as s left join elective as e on s.id=e.stu_id;
附: (1)on不能用where代替
13 同11
select * from student as s right join elective as e on s.id=e.stu_id;
14 字查詢舉例
select * from student s where 2<=(select count(*) from elective e where e.stu_id=s.id);
15 把某列的內容復制到另外一列
update authors set au_lname= authors.job_desc
070917添加
1 MSSQL取出表中前10條數據
select top 10 * from tableName;
2 MSSQL取出表中前10%的數據
select top 10 percent * from tableName;
3 MySQL取出表中前10條數據
select * from tableName limit 10;
4MySQL取出表中4—9的數據
select * from tableName limit 3,6;
limit a,b a表示取a-1條,b表示取多少條
4查看當天發(fā)布的帖子
select * from article where posttime like 'yyyy-MM-dd%'
5設置mysql默認字符編碼命令
set names gbk;
6數據記錄統(tǒng)計函數:
AVG(字段名) 得出一個表格欄平均值
COUNT(*|字段名) 對數據行數的統(tǒng)計或對某一欄有值的數據行數統(tǒng)計
MAX(字段名) 取得一個表格欄最大的值
MIN(字段名) 取得一個表格欄最小的值
SUM(字段名) 把數據欄的值相加
sql="select sum(字段名) as 別名 from 數據表 where 條件表達式"
set rs=conn.excute(sql)
用 rs("別名") 獲取統(tǒng)的計值,其它函數運用同上。
文章出處:http://www.diybl.com/course/3_program/java/javajs/2007104/75907.html
模糊查詢
SQL的模式匹配允許你使用"_"匹配任何單個字符,而"%"匹配任意數目字符(包括零個字符)。
在 MySQL中,SQL的模式缺省是忽略大小寫的。下面顯示一些例子。注意在你使用SQL模式時,你不
能使用=或!=;而使用LIKE或NOT LIKE比較操作符。
為了找出以"b"開頭的名字:
mysql> SELECT * FROM pet WHERE name LIKE "b%";
為了找出以"fy"結尾的名字:
mysql> SELECT * FROM pet WHERE name LIKE "%fy";
為了找出包含一個"w"的名字:
mysql> SELECT * FROM pet WHERE name LIKE "%w%";
為了找出包含正好5個字符的名字,使用"_"模式字符:
mysql> SELECT * FROM pet WHERE name LIKE "_____";
由MySQL提供的模式匹配的其他類型是使用擴展正則表達式。當你對這類模式進行匹配測試時,使用
REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它們是同義詞)。
擴展正則表達式的一些字符是:
"."匹配任何單個的字符。
一個字符類"[...]"匹配在方括號內的任何字符。例如,"[abc]"匹配"a"、"b"或"c"。
為了命名字符的一個范圍,使用一個"-"。"[a-z]"匹配任何小寫字母,而"[0-9]"匹配任
何數字。
" * "匹配零個或多個在它前面的東西。例如,"x*"匹配任何數量的"x"字符,"[0-9]*"
匹配的任何數量的數字,而".*"匹配任何數量的任何東西。
正則表達式是區(qū)分大小寫的,但是如果你希望,你能使用一個字符類匹配兩種寫法。例如,
"[aA]"匹配小寫或大寫的"a"而"[a-zA-Z]"匹配兩種寫法的任何字母。
如果它出現在被測試值的任何地方,模式就匹配(只要他們匹配整個值,SQL模式匹配)。
為了定位一個模式以便它必須匹配被測試值的開始或結尾,在模式開始處使用"^"或在模式的
結尾用"$"。
為了說明擴展正則表達式如何工作,上面所示的LIKE查詢在下面使用REGEXP重寫:
為了找出以"b"開頭的名字,使用"^"匹配名字的開始并且"[bB]"匹配小寫或大寫的"b":
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
為了找出以"fy"結尾的名字,使用"$"匹配名字的結尾:
mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
為了找出包含一個"w"的名字,使用"[wW]"匹配小寫或大寫的"w":
mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";
既然如果一個正規(guī)表達式出現在值的任何地方,其模式匹配了,就不必再先前的查詢中在模式的兩
方面放置一個通配符以使得它匹配整個值,就像如果你使用了一個SQL模式那樣。
為了找出包含正好5個字符的名字,使用"^"和"$"匹配名字的開始和結尾,和5個"."實例在
兩者之間:
mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
你也可以使用"{n}""重復n次"操作符重寫先前的查詢:
mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
查找數字和其他的模糊查詢語句
Select * from pet where name REGEXP "[^a-zA-Z].";
簡單的Transact-SQL查詢只包括選擇列表、FROM子句和WHERE子句
一、 簡單查詢
簡單的Transact-SQL查詢只包括選擇列表、FROM子句和WHERE子句。它們分別說明所查詢列、查詢的表或視圖、以及搜索條件等。
例如,下面的語句查詢testtable表中姓名為"張三"的nickname字段和email字段。
SELECT nickname,emailFROM testtable
WHERE name='張三' |
(一) 選擇列表
選擇列表(select_list)指出所查詢列,它可以是一組列名列表、星號、表達式、變量(包括局部變量和全局變量)等構成。
1、選擇所有列
例如,下面語句顯示testtable表中所有列的數據:
SELECT *FROM testtable |
2、選擇部分列并指定它們的顯示次序
查詢結果集合中數據的排列順序與選擇列表中所指定的列名排列順序相同。
例如:
SELECT nickname,emailFROM testtable |
3、更改列標題
在選擇列表中,可重新指定列標題。定義格式為:
列標題=列名
列名 列標題
如果指定的列標題不是標準的標識符格式時,應使用引號定界符,例如,下列語句使用漢字顯示列標題:
SELECT 昵稱=nickname,電子郵件=emailFROM testtable |
4、刪除重復行
SELECT語句中使用ALL或DISTINCT選項來顯示表中符合條件的所有行或刪除其中重復的數據行,默認為ALL。使用DISTINCT選項時,對于所有重復的數據行在SELECT返回的結果集合中只保留一行。
5、限制返回的行數
使用TOP n [PERCENT]選項限制返回的數據行數,TOP n說明返回n行,而TOP n PERCENT時,說明n是表示一百分數,指定返回的行數等于總行數的百分之幾。
例如:
SELECT TOP 2 *FROM testtable SELECT TOP 20 PERCENT * FROM testtable |
(二)FROM子句FROM子句指定SELECT語句查詢及與查詢相關的表或視圖。在FROM子句中最多可指定256個表或視圖,它們之間用逗號分隔。
在FROM子句同時指定多個表或視圖時,如果選擇列表中存在同名列,這時應使用對象名限定這些列所屬的表或視圖。例如在usertable和citytable表中同時存在cityid列,在查詢兩個表中的cityid時應使用下面語句格式加以限定:
SELECT username,citytable.cityidFROM usertable,citytable
WHERE usertable.cityid=citytable.cityid |
在FROM子句中可用以下兩種格式為表或視圖指定別名:
表名 as 別名
表名 別名
例如上面語句可用表的別名格式表示為:
SELECT username,b.cityidFROM usertable a,citytable b
WHERE a.cityid=b.cityid |
SELECT不僅能從表或視圖中檢索數據,它還能夠從其它查詢語句所返回的結果集合中查詢數據。
例如:
SELECT a.au_fname+a.au_lnameFROM authors a,titleauthor ta
(SELECT title_id,title FROM titles WHERE ytd_sales>10000 ) AS t WHERE a.au_id=ta.au_id AND ta.title_id=t.title_id |
此例中,將SELECT返回的結果集合給予一別名t,然后再從中檢索數據。
(三) 使用WHERE子句設置查詢條件
WHERE子句設置查詢條件,過濾掉不需要的數據行。例如下面語句查詢年齡大于20的數據:
SELECT *FROM usertable
WHERE age>20 |
WHERE子句可包括各種條件運算符:
比較運算符(大小比較):>、>=、=、<、<=、<>、!>、!<
范圍運算符(表達式值是否在指定的范圍):BETWEEN…AND…
NOT BETWEEN…AND…
列表運算符(判斷表達式是否為列表中的指定項):IN (項1,項2……)
NOT IN (項1,項2……)
模式匹配符(判斷值是否與指定的字符通配格式相符):LIKE、NOT LIKE
空值判斷符(判斷表達式是否為空):IS NULL、NOT IS NULL
邏輯運算符(用于多條件的邏輯連接):NOT、AND、OR
1、范圍運算符例:age BETWEEN 10 AND 30相當于age>=10 AND age<=30
2、列表運算符例:country IN ('Germany','China')
3、模式匹配符例:常用于模糊查找,它判斷列值是否與指定的字符串格式相匹配??捎糜赾har、varchar、text、ntext、datetime和smalldatetime等類型查詢。
可使用以下通配字符:
百分號%:可匹配任意類型和長度的字符,如果是中文,請使用兩個百分號即%%。
下劃線_:匹配單個任意字符,它常用來限制表達式的字符長度。
方括號[]:指定一個字符、字符串或范圍,要求所匹配對象為它們中的任一個。[^]:其取值也[] 相同,但它要求所匹配對象為指定字符以外的任一個字符。
例如:
限制以Publishing結尾,使用LIKE '%Publishing'
限制以A開頭:LIKE '[A]%'
限制以A開頭外:LIKE '[^A]%'
4、空值判斷符例WHERE age IS NULL
5、邏輯運算符:優(yōu)先級為NOT、AND、OR
(四)查詢結果排序
使用ORDER BY子句對查詢返回的結果按一列或多列排序。ORDER BY子句的語法格式為:
ORDER BY {column_name [ASC|DESC]} [,…n]
其中ASC表示升序,為默認值,DESC為降序。ORDER BY不能按ntext、text和image數據類型進行排序。
例如:
SELECT *FROM usertable
ORDER BY age desc,userid ASC |
另外,可以根據表達式進行排序。
二、 聯合查詢
UNION運算符可以將兩個或兩個以上上SELECT語句的查詢結果集合合并成一個結果集合顯示,即執(zhí)行聯合查詢。UNION的語法格式為:
select_statementUNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n] |
其中selectstatement為待聯合的SELECT查詢語句。
ALL選項表示將所有行合并到結果集合中。不指定該項時,被聯合查詢結果集合中的重復行將只保留一行。
聯合查詢時,查詢結果的列標題為第一個查詢語句的列標題。因此,要定義列標題必須在第一個查詢語句中定義。要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列標題或者列序號。
在使用UNION 運算符時,應保證每個聯合查詢語句的選擇列表中有相同數量的表達式,并且每個查詢選擇表達式應具有相同的數據類型,或是可以自動將它們轉換為相同的數據類型。在自動轉換時,對于數值類型,系統(tǒng)將低精度的數據類型轉換為高精度的數據類型。
在包括多個查詢的UNION語句中,其執(zhí)行順序是自左至右,使用括號可以改變這一執(zhí)行順序。例如:
查詢1 UNION (查詢2 UNION 查詢3)
三、連接查詢
通過連接運算符可以實現多個表查詢。連接是關系數據庫模型的主要特點,也是它區(qū)別于其它類型數據庫管理系統(tǒng)的一個標志。
在關系數據庫管理系統(tǒng)中,表建立時各數據之間的關系不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數據類型。為不同實體創(chuàng)建新的表,爾后通過連接進行查詢。
連接可以在SELECT 語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時有助于將連接操作與WHERE子句中的搜索條件區(qū)分開來。所以,在Transact-SQL中推薦使用這種方法。
SQL-92標準所定義的FROM子句的連接語法格式為:
FROM join_table join_type join_table[ON (join_condition)] |
其中join_table指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表操作,對同一個表操作的連接又稱做自連接。
join_type 指出連接類型,可分為三種:內連接、外連接和交叉連接。內連接(INNER JOIN)使用比較運算符進行表間某(些)列數據的比較操作,并列出這些表中與連接條件相匹配的數據行。根據所使用的比較方式不同,內連接又分為等值連接、自然連接和不等連接三種。外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行。
交叉連接(CROSS JOIN)沒有WHERE 子句,它返回連接表中所有數據行的笛卡爾積,其結果集合中的數據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構成。
無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接連接。例如:
SELECT p1.pub_id,p2.pub_id,p1.pr_infoFROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) |
(一)內連接內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種:
1、等值連接:在連接條件中使用等于號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。
2、不等連接: 在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
3、自然連接:在連接條件中使用等于(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,并刪除連接表中的重復列。
例,下面使用等值連接列出authors和publishers表中位于同一城市的作者和出版社:
SELECT *FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city |
又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重復列(city和state):
SELECT a.*,p.pub_id,p.pub_name,p.countryFROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city |
(二)外連接
內連接時,返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件的行。而采用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。如下面使用左外連接將論壇內容和作者信息連接起來:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as bON a.username=b.username |
下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:
SELECT a.*,b.*FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username |
(三)交叉連接
交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等
于6*8=48行。 SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
[Post=0][/Post]
]]>