1. 程式人生 > >mysql 基本語句 mysql sql常用語句大全

mysql 基本語句 mysql sql常用語句大全

求知若渴 虛心若愚   隨筆-391  文章-0  評論-7 

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 [uniqueindex 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 LEFT OUT JOIN 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 from where 1<>1(僅用於SQlServer)

法二:select top 0 * into 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 in ‘具體資料庫’ where 條件

例子:..from in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、說明:子查詢(表名1:a 表名2:b)

select a,b,c from where IN (select from b ) 或者: select a,b,c from where 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 LEFT OUT JOIN 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 not between 數值1 and 數值2

9、說明:in 的使用方法

select from table1 where a [notin (‘值1’,’值2’,’值4’,’值6’)

10、說明:兩張關聯表,刪除主表中已經在副表中沒有的資訊

delete from table1 where not exists ( select from table2 where table1.field1=table2.field1 )

11、說明:四表聯查問題:

select from left inner join on a.a=b.b right inner join on a.a=c.c inner join 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 where rid not in(select top’+str(@str-1)+’Rid from 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 from tableA ) except (select from tableB) except (select 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 end),sum(case vender when 'C' then pcs else end),sum(case venderwhen 'B' then pcs else endFROMtablename 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