MySQL學(xué)習(xí)筆記和題目:級聯(lián)刪除,子查詢語法大全,用代碼建表【詩書畫唱】


————————
前言:
很多東西只要記錄并且知道正確的語法,就可以迎刃而解。——詩書畫唱
——————————
mysql的數(shù)據(jù)類型:
int:整形?
varchar():字符串
boolean:是否
text:大文本
timestamp:時間戳
【timestamp?
美?/?ta?mst?mp/
?n. 時間戳;時間郵票】
bolb:二進(jìn)制 ?
【
blob英[bl?b]美[blɑ?b]
n.(尤指液體的) 一點(diǎn),一滴; (顏色的) 一小片,斑點(diǎn);vt.弄臟; 弄錯;
】
唯一:unique??
自增約束:auto_increments??
【
auto英[???t??]美[???to?]
n.汽車;vi.乘汽車;
automatic英[???t??m?t?k]美[???t??m?t?k]
adj.自動的; 無意識的; 不假思索的; 必然的; 當(dāng)然的;n.自動手槍(或步槍); 自動變速汽車; 自動換擋汽車;
increments英[??nkr?m?nts]美[???kr?m?nts]
n.定期的加薪; 增量; 增加;[詞典]increment的復(fù)數(shù);
】
主外鍵:foreign key?
外鍵也稱為參照完整性,外鍵表的信息參照著主鍵表的信息進(jìn)行設(shè)置,主鍵表沒有的信息外鍵。
表示不能使用的非空約束:notnull??
主鍵約束:primary key
默認(rèn)值約束:default
timestamp:YYYY-MM-DD
text:大文本
Blob:二進(jìn)制數(shù)據(jù)類型,可以存儲圖片音頻視頻
【
BLOB的全名是Binary Large Object ,用于存儲大量的二進(jìn)制數(shù)據(jù),如圖片、視頻、音頻等。
在MySQL中,大數(shù)據(jù)對象字段數(shù)據(jù)類型有TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB等。
它們的大小容量:
TINYBLOB ≈ 255 bytes
BLOB ≈ 64KB
MEDIUMBLOB ≈ 16MB
LONGBLOB ≈ 4GB
保存數(shù)據(jù)
保存數(shù)據(jù)到表使用的關(guān)鍵方法setBinaryStream(),參數(shù)設(shè)置InputStream流。
我們只要將路徑轉(zhuǎn)換成File對象,將File轉(zhuǎn)換成InputStream對象,將InputStream對象設(shè)置成PreparedStatement對象的參數(shù)。最后就能將二進(jìn)制數(shù)據(jù)存儲到表里。
】
創(chuàng)建表:
學(xué)生表 stu
字段? ? ? ? ? ? ? ? 類型
xuehao(編號)? ? ? ? ? int(主鍵自增)
xingming(姓名)? ? ?? varchar(非空唯一)
sex(性別)? ? ? ? ? ? ? ? varchar(非空)
chushengriqi(出生日期)? timestamp(設(shè)置默認(rèn)為當(dāng)前時間)
beizhu? ? ? ? ? ? ? ?text(備注)
專業(yè)表 zy
zhuanyeid? ? ? ? ?int(主鍵自增)
zhuanyename? ? varchar(100)專業(yè)名稱
成績表 cj
chengjiid(成績編號)? ?? int(主鍵自增)
xuehao? ? ? ? ? ? ? ? ? ? ? ? ? ?int(學(xué)號)(外鍵)
zhuanyeid? ? ? ? ? ? ? ? ? ? ?int(專業(yè))(外鍵)
chengji? ? ? ? ? ? ? ? ? ? ? ? ? int(具體成績)
--【按照下面的順序刪除(先刪除有外鍵的表)才有用】
--drop table cj
--drop table stu
--drop table zy
create table zy(
zhuanyeid? ? int primary key auto_increment,
zhuanyename? ? varchar(100) unique
)
--設(shè)置為唯一,這樣第7,4等題的子查詢才不會錯
create table stu(
xuehao int primary key auto_increment,
xingming varchar(100)not null unique,
sex? varchar(100) not null,
chushengriqi? ?timestamp default current_timestamp,
beizhu? ? ?text
)
--timestamp default current_timestamp:設(shè)置時間默認(rèn)為當(dāng)前時間
--【注釋不可以插到執(zhí)行語句中,不然會報錯,
--如果報錯就看是錯在哪一行(看“l(fā)ine XXX”】
create table cj(
chengjiid int primary key auto_increment,
xuehao? ? ? ? ? ? ? ? ? ? ? ? ? ?int,
zhuanyeid? ? ? ? ? ? ? ? ? ? ?int,
chengji? ? ? ? ? ? ? ? ? ? ? ? ? int,
foreign key(xuehao ) references stu(xuehao ) on delete cascade,
foreign key(zhuanyeid) references zy(zhuanyeid) on delete cascade
)
--關(guān)系表的級聯(lián)更新: on update cascade
--on delete cascade 是級聯(lián)刪除的意思
--意思是 當(dāng)你更新或刪除主鍵表時,那么外鍵表也會跟隨一起更新或刪除
--——————————
--1.使用sql語句給學(xué)生表,專業(yè)表和成績表增加5條數(shù)據(jù)
insert into zy (zhuanyename ) values('計算機(jī)專業(yè)'),
('物理專業(yè)'),('醫(yī)學(xué)專業(yè)'),('哲學(xué)專業(yè)'),('美術(shù)專業(yè)');
--select * from zy
insert into? stu(xingming,sex,beizhu) values('劉六6','女','b站up主'),
('詩書畫唱1','男','b站up主'),('詩書畫唱2','男','b站up主'),
('詩書畫唱3','男','b站up主'),('詩書畫唱4','男','b站up主'),
('詩書畫唱5','男','b站up主');
insert into cj (xuehao ,zhuanyeid ,chengji ) values(6,5,50),
(1,1,100),(2,2,100),(3,3,100),(4,4,100),(5,5,100);
--select * from cj
--2.修改學(xué)生表編號為3的學(xué)生姓名為張三豐
update stu set xingming ='張三豐' where xuehao=3
--select * from stu
——————
錯誤部分:
update stu set xingming='張三豐' where xuehao=3
【這里set等關(guān)鍵字沒變藍(lán)色,說明從網(wǎng)頁復(fù)制出來時,
有錯,自到看不出來的網(wǎng)頁附加附帶的編碼格式】
——————
--3.修改成績表張三豐的成績?yōu)?0
--【下面的語句的列名和表名等不可以弄錯,
--比如update cj set chengji ='80 ' where? ? ?
--zhuanyeid? in (select zhuanyeid from cj?
--where zhuanyename='張三豐'),專業(yè)名(zhuanyename)
--不可能為”張三豐”
update cj set chengji ='80 ' where? ? xuehao = (select xuehao??
? ?from stu where xingming='張三豐')
--select * from cj
--4.將學(xué)生成績大于80的專業(yè)改為計算機(jī)專業(yè)
--update? zy set zhuanyename ='計算機(jī)'? where? ? ?zhuanyeid='
-- (select zhuanyeid from cj where chengji>80)'不行時,說明替換錯了,
--就是替換別的變量
--替換對應(yīng)的查出來的為唯一的數(shù)據(jù),比如有where的 zhuanyeid =
--(select zhuanyeid from zy where zhuanyename='哲學(xué)')
--,不應(yīng)替換會有多個內(nèi)容的變量,比如
-- zhuanyeid='(select zhuanyeid from cj where chengji>80)'
update cj set zhuanyeid =(select zhuanyeid from zy where
?zhuanyename='計算機(jī)專業(yè)') where chengji>80
--select * from cj
--5.修改張三豐的專業(yè)為計算機(jī)專業(yè)
--update? zy set zhuanyename ='計算機(jī)'? where? ? ?zhuanyeid=
-- (select zhuanyeid from cj where zhuanyename='張三豐')不行時,
--說明替換錯了,就是替換別的變量或表
update cj inner join stu on cj.xuehao=stu.xuehao set cj.zhuanyeid=(select?
zhuanyeid from zy where zhuanyename='計算機(jī)專業(yè)') where stu.xingming='張三豐'
--select * from cj
--6.修改性別為女的并且成績小于60的專業(yè)為哲學(xué)專業(yè)
--update? zy set zhuanyename ='哲學(xué)'? where? ? ?zhuanyeid=?
--(select zhuanyeid from cj where chengji<60? ?and?
?--xuehao? = (select? xuehao from stu where sex='女')) 不行時,說明替換錯了,
--就是替換別的變量或表,用上兩表查詢
update cj inner join stu on cj.xuehao=stu.xuehao set cj.zhuanyeid=(select
?zhuanyeid from zy where zhuanyename='哲學(xué)專業(yè)') where cj.chengji<60 and?
stu.sex='女'
--7.修改學(xué)生id為5的專業(yè)為計算機(jī)專業(yè)
--create table zy(
--zhuanyeid? ? int primary key auto_increment,
--zhuanyename? ? varchar(100) unique
--)
--設(shè)置為唯一,這樣第7題的子查詢才不會錯
--update? zy set zhuanyename ='計算機(jī)'專業(yè)? where? ?
?--? zhuanyeid = (select zhuanyeid from cj where xuehao=5)不行時,說明替換錯了,
--就是替換別的變量或表,用上兩表查詢
update cj inner join zy on cj.zhuanyeid=zy.zhuanyeid inner join stu?
on cj.xuehao=stu.xuehao set cj.zhuanyeid=
(select zhuanyeid from zy where zy.zhuanyename='計算機(jī)專業(yè)')
?where stu.xuehao=5
--8.刪除張三豐
--有時xingming等大略的不行,就替換上具體明確的stu.xingming
--delete? ?from? ?stu where stu.xingming='張三豐'
delete? from stu where xingming='張三豐'
--如果where等的關(guān)鍵字不變藍(lán)((說明有不可見的內(nèi)容之類,
--附在關(guān)鍵字中或周圍等),那么就把周圍的空格刪除,之后再重新加空格等
--9.刪除成績在60-70之間的學(xué)生
--chengji在cj表中,而不是在stu表才有
delete from cj where? chengji>60 and chengji<70
--10.查詢所有學(xué)生的信息,包含專業(yè)和成績
--簡寫:select * from cj inner join stu on stu.xuehao=cj.xuehao?
--inner join zy on cj.zhuanyeid=zy.zhuanyeid
select * from stu as stu
?inner join cj as cj on stu.xuehao=cj.xuehao? inner join zy as zy on zy.zhuanyeid=cj.zhuanyeid?


——————————————————————
類似題目擴(kuò)展:
創(chuàng)建商品類型表sp_type
字段 類型
sp_typeid int(主鍵自增)
sp_typename varchar(非空,唯一)
商品表sp?
字段? ? ? ? ? ? ? ?類型
sp_id? ? ? ? ? ? ?int(主鍵自增)
sp_name? ? ? varchar(非空,唯一)
sp_price? ? ? ? float
sp_riqi? ? ? ? ? ?timestamp(默認(rèn)當(dāng)前時間)
sp_jieshao? ? ?text
sp_typeid? ? ?? int



一、SQL子查詢語句
1、單行子查詢
select ename,deptno,sal from emp where deptno=(select deptno from dept where loc='NEW YORK');
2、多行子查詢
SELECT ename,job,sal FROM EMP WHERE deptno in ( SELECT deptno FROM dept WHERE dname LIKE 'A%');
3、多列子查詢
SELECT deptno,ename,job,sal FROM EMP WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMP GROUP BY deptno);
4、內(nèi)聯(lián)視圖子查詢
(1)SELECT ename,job,sal,rownum FROM (SELECT ename,job,sal FROM EMP ORDER BY sal); (2)SELECT ename,job,sal,rownum FROM ( SELECT ename,job,sal FROM EMP ORDER BY sal) WHERE rownum<=5;
5、在HAVING子句中使用子查詢
SELECT deptno,job,AVG(sal) FROM EMP GROUP BY deptno,job HAVING AVG(sal)>(SELECT sal FROM EMP WHERE ename='MARTIN');
6、內(nèi)連接 左連接 右連接舉例;
select sys_user.user_id ,sys_user.user_code from sys_user inner join XZFW_BANJIE on sys_user.user_id=XZFW_BANJIE.userid
小例子:
select top 10 * from sys_user where user_code not in (select user_code from sys_user where user_code like '%yzj%') select top 2 * from (select top 2 * from td.users order by us_username desc) users order by us_username desc
7、刪除約束語句:
alter table dbo.XZFW_SYS_USER drop CONSTRAINT FK1772E1891324F678
8、記錄數(shù)查詢
select count(user_pass) from sys_user select count(*) from sys_user where user_code!='admin'
9、在范圍之間取值( between ... and ..用法)
select sys_user.user_id,sys_user.user_name,xzfw_shoujian.caseid from sys_user inner join xzfw_shoujian on sys_user.user_id=xzfw_shoujian.userid where user_id between 5 and 100
或 select * from sys_user where user_id<10 and user_id>1
二、SQL基本語句
下列語句部分是Mssql語句,不可以在access中使用。
SQL分類:
DDL—數(shù)據(jù)定義語言(Create,Alter,Drop,DECLARE)
DML—數(shù)據(jù)操縱語言(Select,Delete,Update,Insert)
DCL—數(shù)據(jù)控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,簡要介紹基礎(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、說明:增加一個列
Alter table tabname add column col type
注:列增加后將不能刪除。DB2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長度。
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、說明:幾個簡單的基本的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
最?。簊elect min(field1) as minvalue from table1
11、說明:幾個高級查詢運(yùn)算詞
A: UNION 運(yùn)算符
UNION 運(yùn)算符通過組合其他兩個結(jié)果表(例如 TABLE1 和 TABLE2)并消去表中任何重復(fù)行而派生出一個結(jié)果表。當(dāng) ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復(fù)行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
B: EXCEPT 運(yùn)算符
EXCEPT 運(yùn)算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重復(fù)行而派生出一個結(jié)果表。當(dāng) ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復(fù)行。
C: INTERSECT 運(yùn)算符
INTERSECT 運(yùn)算符通過只包括 TABLE1 和 TABLE2 中都有的行并消除所有重復(fù)行而派生出一個結(jié)果表。當(dāng) ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重復(fù)行。
注:使用運(yùn)算詞的幾個查詢結(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:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
其次,大家來看一些不錯的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ù)使用絕對路徑) (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ù)時間
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ù)范圍時包括了邊界值,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開始時間,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ù)中對應(yīng)的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產(chǎn)品分析,按科目成績排名,等等.)
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ù)行而派生出一個結(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可以方便地實現(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 1
電腦 A 1
光盤 B 2
光盤 A 2
手機(jī) B 3
手機(jī) C 3
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語句實現(xiàn))
對存儲在數(shù)據(jù)庫中的數(shù)據(jù)來說,隨機(jī)數(shù)特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP“找個隨機(jī)數(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)的一個隨機(jī)數(shù)(假設(shè)500就是數(shù)據(jù)庫內(nèi)記錄的總數(shù))。然后,你遍歷每一記錄來測試ID 的值、檢查其是否匹配RNumber。滿足條件的話就執(zhí)行由THEN 關(guān)鍵字開始的那一塊代碼。假如你的RNumber 等于495,那么要循環(huán)一遍數(shù)據(jù)庫花的時間可就長了。雖然500這個數(shù)字看起來大了些,但相比更為穩(wěn)固的企業(yè)解決方案這還是個小型數(shù)據(jù)庫了,后者通常在一個數(shù)據(jù)庫內(nèi)就包含了成千上萬條記錄。這時候不就死定了?
采用SQL,你就可以很快地找出準(zhǔn)確的記錄并且打開一個只包含該記錄的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,你只需要檢查匹配情況即可。只要你對以上代碼的工作滿意,你自可按需操作“隨機(jī)”記錄。Recordset沒有包含其他內(nèi)容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時間。
再談隨機(jī)數(shù)
現(xiàn)在你下定決心要榨干Random 函數(shù)的最后一滴油,那么你可能會一次取出多條隨機(jī)記錄或者想采用一定隨機(jī)范圍內(nèi)的記錄。把上面的標(biāo)準(zhǔn)Random 示例擴(kuò)展一下就可以用SQL應(yīng)對上面兩種情況了。
為了取出幾條隨機(jī)選擇的記錄并存放在同一recordset內(nèi),你可以存儲三個隨機(jī)數(shù),然后查詢數(shù)據(jù)庫獲得匹配這些數(shù)字的記錄:
SQL = "Select * FROM Customers Where ID = " & RNumber & " or ID = " & RNumber2 & " or ID = " & RNumber3
假如你想選出10條記錄(也許是每次頁面裝載時的10條鏈接的列表),你可以用BETWEEN 或者數(shù)學(xué)等式選出第一條記錄和適當(dāng)數(shù)量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 Select 語句只顯示一種可能(這里的ID 是自動生成的號碼):
SQL = "Select * FROM Customers Where ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
注意:以上代碼的執(zhí)行目的不是檢查數(shù)據(jù)庫內(nèi)是否有9條并發(fā)記錄。
隨機(jī)讀取若干條記錄,測試過
Access語法:Select top 10 * From 表名 orDER BY Rnd(id)
Sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 order By rand() Limit n
Access左連接語法(最近開發(fā)要用左連接,Access幫助什么都沒有,網(wǎng)上沒有Access的SQL說明,只有自己測試, 現(xiàn)在記下以備后查)
語法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
使用SQL語句 用...代替過長的字符串顯示
語法:
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查詢語句時,將返回查詢得到的記錄集。用法為:
Set 對象變量名=連接對象.Execute("SQL 查詢語言")
Execute方法調(diào)用后,會自動創(chuàng)建記錄集對象,并將查詢結(jié)果存儲在該記錄對象中,通過Set方法,將記錄集賦給指定的對象保存,以后對象變量就代表了該記錄集對象。
2.執(zhí)行SQL的操作性語言時,沒有記錄集的返回。此時用法為:
連接對象.Execute "SQL 操作性語句" [, RecordAffected][, Option]
·RecordAffected 為可選項,此出可放置一個變量,SQL語句執(zhí)行后,所生效的記錄數(shù)會自動保存到該變量中。通過訪問該變量,就可知道SQL語句隊多少條記錄進(jìn)行了操作。一、SQL子查詢語句
二、SQL基本語句
下列語句部分是Mssql語句,不可以在access中使用。
SQL分類:
DDL—數(shù)據(jù)定義語言(Create,Alter,Drop,DECLARE)
DML—數(shù)據(jù)操縱語言(Select,Delete,Update,Insert)
DCL—數(shù)據(jù)控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,簡要介紹基礎(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、說明:增加一個列
Alter table tabname add column col type
注:列增加后將不能刪除。DB2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長度。
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、說明:幾個簡單的基本的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
最?。簊elect min(field1) as minvalue from table1
11、說明:幾個高級查詢運(yùn)算詞
A: UNION 運(yùn)算符
UNION 運(yùn)算符通過組合其他兩個結(jié)果表(例如 TABLE1 和 TABLE2)并消去表中任何重復(fù)行而派生出一個結(jié)果表。當(dāng) ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復(fù)行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
B: EXCEPT 運(yùn)算符
EXCEPT 運(yùn)算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重復(fù)行而派生出一個結(jié)果表。當(dāng) ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復(fù)行。
C: INTERSECT 運(yùn)算符
INTERSECT 運(yùn)算符通過只包括 TABLE1 和 TABLE2 中都有的行并消除所有重復(fù)行而派生出一個結(jié)果表。當(dāng) ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重復(fù)行。
注:使用運(yùn)算詞的幾個查詢結(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:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
其次,大家來看一些不錯的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ù)使用絕對路徑) (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ù)時間
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ù)范圍時包括了邊界值,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開始時間,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ù)中對應(yīng)的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產(chǎn)品分析,按科目成績排名,等等.)
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ù)行而派生出一個結(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可以方便地實現(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 1
電腦 A 1
光盤 B 2
光盤 A 2
手機(jī) B 3
手機(jī) C 3
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語句實現(xiàn))
對存儲在數(shù)據(jù)庫中的數(shù)據(jù)來說,隨機(jī)數(shù)特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP“找個隨機(jī)數(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)的一個隨機(jī)數(shù)(假設(shè)500就是數(shù)據(jù)庫內(nèi)記錄的總數(shù))。然后,你遍歷每一記錄來測試ID 的值、檢查其是否匹配RNumber。滿足條件的話就執(zhí)行由THEN 關(guān)鍵字開始的那一塊代碼。假如你的RNumber 等于495,那么要循環(huán)一遍數(shù)據(jù)庫花的時間可就長了。雖然500這個數(shù)字看起來大了些,但相比更為穩(wěn)固的企業(yè)解決方案這還是個小型數(shù)據(jù)庫了,后者通常在一個數(shù)據(jù)庫內(nèi)就包含了成千上萬條記錄。這時候不就死定了?
采用SQL,你就可以很快地找出準(zhǔn)確的記錄并且打開一個只包含該記錄的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,你只需要檢查匹配情況即可。只要你對以上代碼的工作滿意,你自可按需操作“隨機(jī)”記錄。Recordset沒有包含其他內(nèi)容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時間。
再談隨機(jī)數(shù)
現(xiàn)在你下定決心要榨干Random 函數(shù)的最后一滴油,那么你可能會一次取出多條隨機(jī)記錄或者想采用一定隨機(jī)范圍內(nèi)的記錄。把上面的標(biāo)準(zhǔn)Random 示例擴(kuò)展一下就可以用SQL應(yīng)對上面兩種情況了。
為了取出幾條隨機(jī)選擇的記錄并存放在同一recordset內(nèi),你可以存儲三個隨機(jī)數(shù),然后查詢數(shù)據(jù)庫獲得匹配這些數(shù)字的記錄:
SQL = "Select * FROM Customers Where ID = " & RNumber & " or ID = " & RNumber2 & " or ID = " & RNumber3
假如你想選出10條記錄(也許是每次頁面裝載時的10條鏈接的列表),你可以用BETWEEN 或者數(shù)學(xué)等式選出第一條記錄和適當(dāng)數(shù)量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 Select 語句只顯示一種可能(這里的ID 是自動生成的號碼):
SQL = "Select * FROM Customers Where ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
注意:以上代碼的執(zhí)行目的不是檢查數(shù)據(jù)庫內(nèi)是否有9條并發(fā)記錄。
隨機(jī)讀取若干條記錄,測試過
Access語法:Select top 10 * From 表名 orDER BY Rnd(id)
Sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 order By rand() Limit n
Access左連接語法(最近開發(fā)要用左連接,Access幫助什么都沒有,網(wǎng)上沒有Access的SQL說明,只有自己測試, 現(xiàn)在記下以備后查)
語法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
使用SQL語句 用...代替過長的字符串顯示
語法:
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查詢語句時,將返回查詢得到的記錄集。用法為:
Set 對象變量名=連接對象.Execute("SQL 查詢語言")
Execute方法調(diào)用后,會自動創(chuàng)建記錄集對象,并將查詢結(jié)果存儲在該記錄對象中,通過Set方法,將記錄集賦給指定的對象保存,以后對象變量就代表了該記錄集對象。
2.執(zhí)行SQL的操作性語言時,沒有記錄集的返回。此時用法為:
連接對象.Execute "SQL 操作性語句" [, RecordAffected][, Option]
·RecordAffected 為可選項,此出可放置一個變量,SQL語句執(zhí)行后,所生效的記錄數(shù)會自動保存到該變量中。通過訪問該變量,就可知道SQL語句隊多少條記錄進(jìn)行了操作。
·Option 可選項,該參數(shù)的取值通常為adCMDText,它用于告訴ADO,應(yīng)該將Execute方法之后的第一個字符解釋為命令文本。通過指定該參數(shù),可使執(zhí)行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法
這三個方法是連接對象提供的用于事務(wù)處理的方法。BeginTrans用于開始一個事物;RollbackTrans用于回滾事務(wù);CommitTrans用于提交所有的事務(wù)處理結(jié)果,即確認(rèn)事務(wù)的處理。
事務(wù)處理可以將一組操作視為一個整體,只有全部語句都成功執(zhí)行后,事務(wù)處理才算成功;若其中有一個語句執(zhí)行失敗,則整個處理就算失敗,并恢復(fù)到處里前的狀態(tài)。
BeginTrans和CommitTrans用于標(biāo)記事務(wù)的開始和結(jié)束,在這兩個之間的語句,就是作為事務(wù)處理的語句。判斷事務(wù)處理是否成功,可通過連接對象的Error集合來實現(xiàn),若Error集合的成員個數(shù)不為0,則說明有錯誤發(fā)生,事務(wù)處理失敗。Error集合中的每一個Error對象,代表一個錯誤信息。
·Option 可選項,該參數(shù)的取值通常為adCMDText,它用于告訴ADO,應(yīng)該將Execute方法之后的第一個字符解釋為命令文本。通過指定該參數(shù),可使執(zhí)行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法
這三個方法是連接對象提供的用于事務(wù)處理的方法。BeginTrans用于開始一個事物;RollbackTrans用于回滾事務(wù);CommitTrans用于提交所有的事務(wù)處理結(jié)果,即確認(rèn)事務(wù)的處理。
事務(wù)處理可以將一組操作視為一個整體,只有全部語句都成功執(zhí)行后,事務(wù)處理才算成功;若其中有一個語句執(zhí)行失敗,則整個處理就算失敗,并恢復(fù)到處里前的狀態(tài)。
BeginTrans和CommitTrans用于標(biāo)記事務(wù)的開始和結(jié)束,在這兩個之間的語句,就是作為事務(wù)處理的語句。判斷事務(wù)處理是否成功,可通過連接對象的Error集合來實現(xiàn),若Error集合的成員個數(shù)不為0,則說明有錯誤發(fā)生,事務(wù)處理失敗。Error集合中的每一個Error對象,代表一個錯誤信息。