SQL入門級操作,不經常使用的話,也可作為備忘收藏。
SQL學習準備為了方便練習,在數據庫中創建演示數據:
SQL初級教程SELECT
create database TEST; use TEST ; ---------- go create table t_icitem (id int primary key, name varchar(255), model varchar(255), alexa varchar(255), COUNTry varchar(255) ) insert into t_icitem values ('1','oppo','16g','1','CN') ,('2','索尼','8g','13','JAP') ,('3','蘋果','8g','2','USA') ,('4','小米','64g','3','CN') ,('5','華為','32g','4','CN') ,('6','魅族','32gm','15','CN') select * from t_icitem; ---------- create table icstockbillentry (id int primary key, item_id int not null, [count] int not null, date date not null ) insert into icstockbillentry values (1,1,45,'2016-05-10') ,(2,3,100,'2016-05-13') ,(3,1,230,'2016-05-14') ,(4,2,10,'2016-05-14') ,(5,5,205,'2016-05-14') ,(6,4,13,'2016-05-15') ,(7,3,220,'2016-05-15') ,(8,5,545,'2016-05-16') ,(9,3,201,'2016-05-17') select * from icstockbillentry
SELECT DISTINCT
select column_name,column_name from table_name; --從表中選取部分列 select * from table_name; --從表中選取所有列
WHERE
select distinct column_name from table_name; --從列中選取不重複的值;即去重
select * from where column_name operator value; --取符合條件的記錄
where子句中的運算符
邏輯運算的優先級
( ) > not > and > or
模糊查詢
%:号表示多個字符,_表示一個字符;
M%:查詢M開頭的值;
%M%:查詢包含M的所有值;
%M:查詢M結尾的值;
%M_:查詢M在倒數第二位的所有值;
AND & ORORDER BY
select * from table_name where column_name > value and (column_name = 'a' or column_name = 'b'); --and和or可以結合使用,使用括号可以組成複雜的表達式
INSERT INTO
select * from table_name order by column_name asc,column_name desc; --排列不寫明asc,desc時默認為'asc'; --'asc'表示升序;'desc'表示降序。
UPDATE
insert into table_name(column1,column2) values(1,a),(2,b); --沒有指定列名,則需要插入所有的值
DELETE
update table_name set column1=value1,column2=value2 where some_column = some_value update te set te.cloumn = value from table1 te,table2 ti where te.FItemID = ti.FItemID and ti.cloumn operator value --多個表連接之後,限定條件,更新某個字段
SQL高級教程SELECT TOP
delete from table_name where some_column = some_value; --如果省略where子句,将删除表中所有記錄,但不改變表結構、屬性、索引等
AS
select top number percent * from table_name; --number代表返回的記錄數,如:2; --number後面輸入percent代表返回所有行數的百分比
JOIN (INNER JOIN)
select T1.column_name as A,T2.column_name as B from table_name as T1,table_name as T2 在下面的情況下,使用别名很有用: --查詢中涉及多個表 --查詢中使用了函數 --列名很長或可讀性差 --需要把多個列結合在一起
select * from table_A inner join table_B on A.column = B.column; --如果條件為空,on後面輸入1 = 1即可。
用于把來自倆個表或多個表的行結合起來;join等于inner jion。更多請參考文末鍊接。
SELECT INTOINSERT INTO SELECT
select * into table_name_bak from table_name; --完全複制表,可以看作表的備份; select column_name,column_name into table_nanme_bak from table_name where column_name operator value; --複制部分列的滿足部分條件的記錄到新表; select T1.column,T2.column into #table from T1 join T2 ON T1.fid = T2.fid; --複制多個表中的數據到臨時表;
CREATE
insert into table_A(column_name,column_name) select column_name,column_name from table_B where column_name operator value --複制B表中指定記錄插入A表的指定列 INSERT INTO table2 SELECT * FROM table1
create database DB_name; --創建數據庫 create table table_name ( column_name data_type(size) constraint default(value), column_name data_type(size) constraint default(value), .... ); --創建數據表;data_type為數據類型;constraint為約束;default為默認值;
ALTER
declare
alter table table_name add column_name data_type(size); --在表中添加一列; alter table table_name drop column column_name; --在表中删除一列; alter table table_name alter column data_type; --修改列的數據類型;
IF (NOT) EXISTS
--#聲明 declare @dept varchar(255) declare @batchno varchar(255) declare @starttime date declare @endtime date --#賦值 set @dept = '' set @batchno = '' set @starttime = '2017-01-01' set @endtime = '2017-12-30' --或者 select @dept = '',@batchno = '',@starttime = '2017-01-01',@endtime = '2017-12-30' --#使用 slect * from t1,t2,t4 where t4.FName like '%' @dept '%'--like比較值格式:'%' @變量 '%' and t2.FBatchNo like '%' @batchno '%' and t1.FDate >= @starttime and t1.FDate <= @endtime
- 1.介紹
if not exists 即如果不存在,if exists 即如果存在
- 2.使用
a.判斷數據庫不存在時
if not exists(select * from sys.databases where name = 'database_name')
b.判斷表不存在時
if not exists (select * from sysobjects where id = object_id('table_name') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
c.判斷列不存在
if not exists (select * from syscolumns where id=object_id('table_name') and name='column_name')
當判斷的結果不存在時,我可以執行創建數據庫,創建表,增加列,可以執行相應的SQL語句;
而if exists同理判斷,首先判斷查詢結果是否存在,如果存在執行判斷後面的語句,查詢的數據庫,表,列的方法相同;
SQL骨灰教程CONVERT
convert(clume_type(length),date,style)
--示例:
select convert(varchar(20),getdate(),100)
COUNT
日期的計算
select count({*,colume,index}) from table_name [where 條件] --統計記錄數 select count(distinct colume) from table_name [where 條件] --統計不重複的記錄數
DATEADD(datepart,number,date)
--示例:
REPLACE
DATEADD(dd,1,getdate()) --當前 1天 DATEADD(dd,-1,getdate()) --當前-1天 DATEADD(hh,1,getdate()) --當前 1小時 DATEADD(dd,-1,getdate()) --當前-1小時
DELETE和TRUNCATE區别
update [表名] set 字段名 =replace(與前面一樣的字段名,'原内容','想要替換成什麼') [where 可以限定條件] -- 字符串替換函數
- 區别1:
DELETE語句執行删除的過程是每次從表中删除一行,并且同時将該行的删除操作作為事務記錄在日志中保存以便進行進行回滾操作。在删除過程中激活與表有關的删除觸發器。TRUNCATE TABLE 則一次性地從表中删除所有的數據并不把單獨的删除操作記錄記入日志保存,删除行是不能恢複的。并且在删除的過程中不會激活與表有關的删除觸發器。執行速度快。
- 區别2:
表和索引所占空間。當表被TRUNCATE 後,這個表和索引所占用的空間會恢複到初始大小,而DELETE操作不會減少表或索引所占用的空間。drop語句将表所占用的空間全釋放掉。
- 區别3:
應用範圍。TRUNCATE 隻能對TABLE;DELETE可以是table和view。
- 區别4:
對于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。
- 區别5:
DELETE自動編号不恢複到初始值。TRUNCATE自動編号恢複到初始值。
查詢bak備份文件的版本
restore headeronly from disk=N'D:\chl\SQL.bak'
常見系統存儲過程
查詢存儲過程和觸發器
exec sp_databases --查看數據庫 exec sp_tables --查看表 exec sp_columns table_name --查看數據表的列 exec sp_helpIndex table_name --查看索引 exec sp_helpConstraint table_name --約束 exec sp_stored_procedures --查看存儲過程 exec sp_helptext '存儲過程名[觸發器名]' -查看存儲過程[觸發器]的SQL語句 exec sp_rename table_name , table_rename --修改表、索引、列的名稱 exec sp_help table_name --查詢表的信息 exec sp_helpdb database_name --查詢數據庫信息 exec sp_helpfile database_name --查詢數據庫文件信息 exec sp_helpfilegroup ['文件組名'] --數據庫文件組信息
select * from sysobjects where xtype = 'TR' --查詢系統中所有的觸發器 select * from sysobjects where xtype = 'p' --查詢系統中所有的存儲過程 select distinct object_name(id) from syscomments where id in (select id from sysobjects where type ='p') and text like'%TableName%' --查詢表名被哪些存儲過程用到過
希望詳細了解觸發器和存儲過程的童鞋請看這裡:SQL觸發器入門 - 觸發器的原理及常用存儲過程
附:單詞記憶,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!