mysql 基本語句 mysql sql常用語句大全
mysql sql常用語句大全
SQL執行一次INSERT INTO查詢,插入多行記錄
insert into test.person(number,name,birthday) values(5,'cxx5',now()),(6,'cxx6',now()),(7,'cxx7',now());
1、說明:建立資料庫
CREATE
DATABASE
database
-
name
2、說明:刪除資料庫
drop
database
dbname
3、說明:備份sql server
--- 建立 備份資料的 device
USE master
EXEC
sp_addumpdevice
'disk'
,
'testBack'
,
'c:\mssql7backup\MyNwind_1.dat'
--- 開始 備份
BACKUP
DATABASE
pubs
TO
testBack
4、說明:建立新表
create
table
tabname(col1 type1 [
not
null
] [
primary
key
],col2 type2 [
not
null
],..)
根據已有的表建立新表:
A:
create
table
tab_new
like
tab_old (使用舊錶B建立新表A)
備註:此種方式在將表B複製到A時候會將表B完整的欄位結構和索引複製到表A中來
B:
create
table
tab_new
as
select
col1,col2…
from
tab_old definition
only
備註:此種方式只會將表B的欄位結構複製到表A中來,但不會複製表B中的索引到表A中來。這種方式比較靈活可以在複製原表表結構的同時指定要複製哪些欄位,並且自身複製表也可以根據需要增加欄位結構。
結論:
create table as select 會將原表中的資料完整複製一份,但表結構中的索引會丟失。
create table like 只會完整複製原表的建表語句,但不會複製資料
兩種方式在複製表的時候均不會複製許可權對錶的設定。比如說原本對錶B做了許可權設定,複製後,表A不具備類似於表B的許可權。
5、說明:刪除新表
drop
table
tabname
6、說明:增加一個列
Alter
table
tabname
add
column
column_name
type
注:列增加後將不能刪除。DB2中列加上後資料型別也不能改變,唯一能改變的是增加
varchar
型別的長度。
7、說明:新增主鍵:
Alter
table
tabname
add
primary
key
(col)
說明:刪除主鍵:
Alter
table
tabname
drop
primary
key
備註:一個數據表只可以有一個主鍵,所以不存在刪除某一列的主鍵。
8、說明:建立索引:
create
[
unique
]
index
idxname
on
tabname(col….)
刪除索引:
drop
index
idxname
注:索引是不可更改的,想更改必須刪除重新建。
9、說明:建立檢視:
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
]
總數:
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、說明:幾個高階查詢運算詞
A:
UNION
運算子
UNION
運算子通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。當
ALL
隨
UNION
一起使用時(即
UNION
ALL
),不消除重複行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
B:
EXCEPT
運算子
EXCEPT
運算子通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重複行而派生出一個結果表。當
ALL
隨
EXCEPT
一起使用時 (
EXCEPT
ALL
),不消除重複行。
C:
INTERSECT
運算子
INTERSECT
運算子通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重複行而派生出一個結果表。當
ALL
隨
INTERSECT
一起使用時 (
INTERSECT
ALL
),不消除重複行。
注:使用運算詞的幾個查詢結果行必須是一致的。
12、說明:使用外連線
A、
left
(
outer
)
join
:
左外連線(左連線):結果集幾包括連線表的匹配行,也包括左連線表的所有行。
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
:
右外連線(右連線):結果集既包括連線表的匹配連線行,也包括右連線表的所有行。
C:
full
/
cross
(
outer
)
join
:
全外連線:不僅包括符號連線表的匹配行,還包括兩個連線表中的所有記錄。
12、分組:
Group
by
:
一張表,一旦分組完成後,查詢後只能得到組相關的資訊。
組相關的資訊:(統計資訊)
count
,
sum
,
max
,
min
,
avg
分組的標準)
在SQLServer中分組時:不能以text,ntext,image型別的欄位作為分組依據
在selecte統計函式中的欄位,不能和普通的欄位放在一起;
13、對資料庫進行操作:
分離資料庫: sp_detach_db; 附加資料庫:sp_attach_db 後接表明,附加需要完整的路徑名
14.如何修改資料庫的名稱:
sp_renamedb
'old_name'
,
'new_name'
二、提升
1、說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用)
法一:
select
*
into
b
from
a
where
1<>1(僅用於SQlServer)
法二:
select
top
0 *
into
b
from
a
2、說明:拷貝表(拷貝資料,源表名:a 目標表名:b) (Access可用)
insert
into
b(a, b, c)
select
d,e,f
from
b;
3、說明:跨資料庫之間表的拷貝(具體資料使用絕對路徑) (Access可用)
insert
into
b(a, b, c)
select
d,e,f
from
b
in
‘具體資料庫’
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、說明:顯示文章、提交人和最後回覆時間
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
限制查詢資料範圍時包括了邊界值,
not
between
不包括
select
*
from
table1
where
time
between
time1
and
time2
select
a,b,c,
from
table1
where
a
not
between
數值1
and
數值2
9、說明:
in
的使用方法
select
*
from
table1
where
a [
not
]
in
(‘值1’,’值2’,’值4’,’值6’)
10、說明:兩張關聯表,刪除主表中已經在副表中沒有的資訊
delete
from
table1
where
not
exists (
select
*
from
table2
where
table1.field1=table2.field1 )
11、說明:四表聯查問題:
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 語句搞定資料庫分頁
select
top
10 b.*
from
(
select
top
20 主鍵欄位,排序欄位
from
表名
order
by
排序欄位
desc
) a,表名 b
where
b.主鍵欄位 = a.主鍵欄位
order
by
a.排序欄位
具體實現:
關於資料庫分頁:
declare
@start
int
,@
end
int
@sql nvarchar(600)
set
@sql=’
select
top
’+str(@
end
[email protected]+1)+’+
from
T
where
rid
not
in
(
select
top
’+str(@str-1)+’Rid
from
T
where
Rid>-1)’
exec
sp_executesql @sql
注意:在
top
後不能直接跟一個變數,所以在實際應用中只有這樣的進行特殊的處理。Rid為一個標識列,如果
top
後還有具體的欄位,這樣做是非常有好處的。因為這樣可以避免
top
的欄位如果是邏輯索引的,查詢的結果後實際表中的不一致(邏輯索引中的資料有可能和資料表中的不一致,而查詢時如果處在索引則首先查詢索引)
14、說明:前10條記錄
select
top
10 * form table1
where
範圍
15、說明:選擇在每一組b值相同的資料中對應的a最大的記錄的所有資訊(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select
a,b,c
from
tablename ta
where
a=(
select
max
(a)
from
tablename tb
where
tb.b=ta.b)
16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重複行而派生出一個結果表
(
select
a
from
tableA )
except
(
select
a
from
tableB)
except
(
select
a
from
tableC)
17、說明:隨機取出10條資料
select
top
10 *
from
tablename
order
by
newid()
18、說明:隨機選擇記錄
select
newid()
19、說明:刪除重複記錄
1),
delete
from
tablename
where
id
not
in
(
select
max
(id)
from
tablename
group
by
col1,col2,...)
2),
select
distinct
*
into
temp
from
tablename
delete
from
tablename
insert
into
tablename
select
*
from
temp
評價: 這種操作牽連大量的資料的移動,這種做法不適合大容量但資料操作
3),例如:在一個外部表中匯入資料,由於某些原因第一次只匯入了一部分,但很難判斷具體位置,這樣只有在下一次全部匯入,這樣也就產生好多重複的欄位,怎樣刪除重複欄位
alter
table
tablename
--新增一個自增列
add
column_b
int
identity(1,1)
delete
from
tablename
where
column_b
not
in
(
select
max
(column_b)
from
tablename
group
by
column1,column2,...)
alter
table
tablename
drop
column
column_b
20、說明:列出資料庫裡所有的表名
select
name
from
sysobjects
where
type=
'U'
// U代表使用者
21、說明:列出表裡的所有的列名
select
name
from
syscolumns
where
id=object_id(
'TableName'
)
22、說明:列示type、vender、pcs欄位,以type欄位排列,
case
可以方便地實現多重選擇,類似
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
顯示結果:
type vender pcs
電腦 A 1
電腦 A 1
光碟 B 2
光碟 A 2
手機 B 3
手機 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
三、技巧
1、1=1,1=2的使用,在SQL語句組合時用的較多
“
where
1=1” 是表示選擇全部 “
where
1=2”全部不選,
如:
if @strWhere !=
''
begin
set
@strSQL =
'select count(*) as Total from ['
+ @tblName +
'] where '
+ @strWhere
end
else
begin
set
@strSQL =
'select count(*) as Total from ['
+ @tblName +
']'
end
我們可以直接寫成
錯誤!未找到目錄項。
set
@strSQL =
'select count(*) as Total from ['
+ @tblName +
'] where 1=1 安定 '
+ @strWhere 2、收縮資料庫
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收縮資料和日誌
DBCC SHRINKDB
DBCC SHRINKFILE
3、壓縮資料庫
dbcc shrinkdatabase(dbname)
4、轉移資料庫給新使用者以已存在使用者許可權
exec
sp_change_users_login
'update_one'
,
'newname'
,
'oldname'
go
5、檢查備份集
RESTORE VERIFYONLY
from
disk=
'E:\dvbbs.bak'
6、修復資料庫
ALTER
DATABASE
[dvbbs]
SET
SINGLE_USER
GO
DBCC CHECKDB(
'dvbbs'
,repair_allow_data_loss)
WITH
TABLOCK
GO
ALTER
DATABASE
[dvbbs]
SET
MULTI_USER
GO
7、日誌清除
SET
NOCOUNT
ON
DECLARE
@LogicalFileName sysname,
@MaxMinutes
INT
,
@NewSize
INT
USE tablename
-- 要操作的資料庫名
SELECT
@LogicalFileName =
'tablename_log'
,
-- 日誌檔名
@MaxMinutes = 10,
-- Limit on time allowed to wrap log.
@NewSize = 1
-- 你想設定的日誌檔案的大小(M)
Setup / initialize
DECLARE
@OriginalSize
int
SELECT
@OriginalSize =
size
FROM
sysfiles
WHERE
name
= @LogicalFileName
SELECT
'Original Size of '
+ db_name() +
' LOG is '
+
CONVERT
(
VARCHAR
(30),@OriginalSize) +
' 8K pages or '
+
CONVERT
(
VARCHAR
(30),(@OriginalSize*8/1024)) +
'MB'
FROM
sysfiles
WHERE
name
= @LogicalFileName
CREATE
TABLE
DummyTrans
(DummyColumn
char
(8000)
not
null
)
DECLARE
@Counter
INT
,
@StartTime DATETIME,
@TruncLog
VARCHAR
(255)
SELECT
@StartTime = GETDATE(),
@TruncLog =
'BACKUP LOG '
+ db_name() +
' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC
(@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE())
-- time has not expired
AND
@OriginalSize = (
SELECT
size
FROM
sysfiles
WHERE
name
= @LogicalFileName)
AND
(@OriginalSize * 8 /1024) > @NewSize
BEGIN
-- Outer loop.
SELECT
@Counter = 0
WHILE ((@Counter < @OriginalSize / 16)
AND
(@Counter < 50000))
BEGIN
-- update
INSERT
DummyTrans
VALUES
(
'Fill Log'
)
DELETE
DummyTrans
SELECT
@Counter = @Counter + 1
END
EXEC
(@TruncLog)
END
SELECT
'Final Size of '
+ db_name() +
' LOG is '
+
CONVERT
(
VARCHAR
(30),
size
) +
' 8K pages or '
+
CONVERT
(
VARCHAR
(30),(
size
*8/1024)) +
'MB'
FROM
sysfiles
WHERE
name
= @LogicalFileName
DROP
TABLE
DummyTrans
SET
NOCOUNT
OFF
8、說明:更改某個表
exec
sp_changeobjectowner
'tablename'
,
'dbo'
9、儲存更改全部表
CREATE
PROCEDURE
dbo.User_ChangeObjectOwnerBatch
@OldOwner
as
NVARCHAR(128),
@NewOwner
as
NVARCHAR(128)
AS
DECLARE
@
Name
as
NVARCHAR(128)
DECLARE
@Owner
as
NVARCHAR(128)
DECLARE
@OwnerName
as
NVARCHAR(128)
DECLARE
curObject
CURSOR
FOR
select