【個人筆記】SQL操作基礎

1.主鍵
分爲邏輯主鍵與業務主鍵。
業務主鍵:具有真實意義的,比如身份證、銀行卡等,一旦變化,難以維護。
邏輯主鍵:沒有任何實際含義,只爲了標識當前列在當前數據表裏的位置的唯一標識。
不可以手動編輯,特殊情況下除外。
·每一張表都推薦有標識列·
·推薦使用邏輯主鍵·
·每一張表都推薦有主鍵列,並設置標識·
·主鍵標識列,就算數據被刪除了,也會按照原先的標識增長

命令方式創建數據庫

create database MySchool –數據庫名
on
(
name=’MySchool_data’, –數據庫名稱
filename=’d:\MySchool_data.mdf’, –物理文件名
size=5mb, –初始大小
maxsize=10mb, –最大文件大小
filegrowth=15% –主文件增長率
)
log on
(
name=’MySchool_log’, –日誌文件名
filename=’MySchool_log.ldf, –日誌物理文件名
size=2mb,
maxsize=4mb,
filegrowth=1mb
)
go

命令方式創建表 - 要先選擇要 創建表的位置

格式:
列名 類型 標識 主鍵 是否允許爲空
id INT IDENTITY(1,1)
create table Student
(
id INT IDENTITY(1,1) PRIMARY KEY,
name NVARCHAR(16) NOT NULL,
age INT NOT NULL
)

DML數據庫操作語言

·增刪查改
·增加數據
INSERT INTO 表名(…列名) VALUES(…要插入的數據)
· INSERT INTO 表名 VALUES(…要插入的數據) –完全插入
· INSERT INTO 表名(…要插入的列名) VALUES(…對應的數據) –選擇性插入

    注意:
        1.插入數據的時候,bit字段要用"0/1"表示True/False
        2.時間字段要用單引號括起,單引號中的內容要遵循基本的時間格式,如‘2014-10-10’
        3.INSERT語句中列的數目要和VALUE後值的數目一致
        4.不能爲標識列插入數據(特殊情況下可以,SET IDENTITY_INSERT 表名 ON)(同理  SET IDENTITY_INSERT 表名 OFF)
        5.直接拖拽‘列’可以快速插入列名
        6.除了標識列,其他所有字段的值都要寫出來,而且還要按照順序寫出來
        7.數據表中的 NULL 不是空指針也不是空字符串,而是表示數據庫不知道爲何值
        8.在服務器上執行的代碼中顯示的 UNICODE字符串常量 必須以大寫字母 N 爲前綴,避免插入特殊字符時無法識別
        9.INSERT INTO 表名(列名) VALUES(DEFAULT)
            VALUES 後的值可以爲 DEFAULT 值,即默認值
        10.INSERT INTO Student(Name) VALUES('張''三')
            插入的數據中有單引號的時候,需要輸入兩個單引號表示一個單引號(轉義字符)


·刪除數據
    DELETE FROM Student    --刪除表中的所有數據
    TRUNCATA TABLE Studeng  --重置表 (包括重置標識)
        ·以上兩者效率有很大差別,如果用 DELETE 會產生很多的日誌,而使用 TRUNCATE 只會產生一行日誌。
    DROP TABLE Student   --直接從數據庫中刪除該表(慎用)

·修改語句
    UPDATE 表名 SET 列名1=數據1,列名2=數據2··· WHERE 列名1=數據1( AND 列名2=數據2 AND 列名3=數據3 ···)( OR 列名2=數據2 ···)( AND 列名2=數據2 OR 列名3=數據3)
        UPDATE Student SET age=age+1
        UPDATE Student SET age+=1
        update Student set Phone='10010' where name='王五' and Gender=1 or name='王五6'
        UPDATE Student SET Address='未知' WHERE Address IS NULL
        WHERE Address IS NOT NULL
        WHERE Address=' '
        WHERE Address

    注意:
        1. AND 優先於 OR 執行
        2. SET 的時候可以取出原來的值
        3. WHERE 中可以使用的其他邏輯運算符:(||)OR 、 (&&)AND 、 (!)NOT 、 < 、 > 、 >= 、 <= 、 <>(同!=)(不等)等 

約束:
    非空約束:數據不能爲空
    主鍵約束:唯一且不能爲空
    唯一約束:數據唯一,允許爲空,但只能出現一次
    默認約束:如果不給值,則爲默認值
    檢查約束:範圍以及各式限制。在設計界面的列名上右鍵-CHECK約束
    外鍵約束:添加主外鍵關係,外鍵的值必須來自主鍵表

·查詢語句
    select 列名1( as 重命名),列名2( as 重命名)··· from 表名 where 條件
    select 列名1( as '重命名'),列名2( as '重命名')··· from 表名 where 條件
    select 列名1( 重命名),列名2( 重命名)··· from 表名 where 條件

    select 1+1  --計算表達式值
    SELECT GETDATE()  --方便快捷的取到服務器系統的時間

    -TOP
        --在查詢出的整個結果集中取前一部分數據
        select top 10 * from Student  --取出Student表中前10條的所有數據
        select top 10 Name,Gender,Age from Student  --取出Student表中前10條的部分數據
        select top 10 percent * from Student  --從Student表中取出前10%的數據,所有計算的結果是進位的,如 21/10=2.1=>3

    -ORDER BY   (效率較低,能不使用就不使用)
        --將當前查詢出來的數據結果進行排序,排序方式按照後面指定的列排序
        --order by 列名 desc  : 按照降序排序數據
        --order by 列名 asc   : 按照升序排序數據
        select top 10 * from Student order by id desc

    -DISTINCT
        --針對查詢之後的結果去除重複行。兩行數據中只要有一個數據不同就不認爲是重複行。
        select distinct Name,Gender,Age from Student  --將查詢出的整個結果集進行重複處理。

·聚合函數
MAX(列名) –返回一行數據
MIN(列名) –返回一行數據
AVG(列名) –返回一行數據
SUM(列名) –返回一行數據
COUNT(列名) –返回篩選成功的數據量。建議使用 COUNT(ID)

注:1.聚合函數對NULL值不計算。如果一行的值都是NULL,COUNT(*) 包含對空值行、重複行的統計。
    2.對於查詢表中的所有數據,【select 分別列出所有的列名 from 表名】要比【select * from Student】 運行效率高。

例:select max(age) from Student  --取出表中的最大年齡
    select min(age),max(age),avg(age),sum(age) from Student  --計算出各種值
    select count(*) from Student where age=10  --計算符合要求的行的數據量

·排序規則
-先後順序爲 數字、字母、漢子(拼音)

·WHERE
- < > <= >= <> != 等判斷符號

- BETWEEN...AND... (該函數經過優化,在大數據中使用時,明顯查詢效率)
    -例如 BETWEEN 20 AND 30 其顯示的結果中包含20與30 
    -SELECT * FROM STUDENT WHERE AGE BETWEEN 20 AND 30

- IN (數據1,2...) (查詢表中列中的值爲括號中的值的數據)
    -SELECT * FROM STUDENT WHERE CID IN (1,2) 同 SELECT * FROM STUDENT WHERE CID=1 OR CID=2
    -SELECT * FROM dbo.Student WHERE Gender IN ('男','女')

注:1.BETWEEN and 在數據庫內部是做過特殊優化的,執行效率比> and < 等這種方式快

·模糊查詢
-使用系統已經定義好的匹配符,按照定義的規則篩選數據
-匹配符: _ % [] ^
_ 代表一個任意字符
% 代表零個或多個任意字符
[] 代表一個字符的取值區間
-不區分大小寫
^ 配合[]使用,表示不屬於該區間
-該匹配符數據庫不兼容,SQL SERVER可以使用,其他數據庫要使用 NOT LIKE

注:1.使用匹配符篩選數據效率很低
    2.當要轉義匹配符時一般使用 [] 進行轉義,而'^'不用,因爲當'^'在[]外時就代表一個普通的'^'符號

-例如:SELECT * FROM STUDENT WHERE NAME LIKE '%王%' --從表中篩選出名字中有'王'字的人
       SELECT * FROM STUDENT WHERE NAME LIKE '王%'  --從表中篩選出姓'王'的人
       SELECT * FROM STUDENT WHERE NAME LIKE '_A%'  --從表中篩選出名字第二個字是'A'的人
       SELECT * FROM STUDENT WHERE NAME LIKE '%[A-Z]%]  --從表中篩選出名字中有字母的人
       SELECT * FROM STUDENT SHERE NAME LIKE '%[0-9]%'  --查詢表中名字中有數字的人
       SELECT * FROM STUDENT WHERE NAME LIKE '%[0-9(,)A-Z]%'  --
       SELECT * FROM STUDENT WHERE NAME LIKE '%[^0-9A-Z]%'  --查詢名字中沒有數字和字母的人
       SELECT * FROM STUDENT WHERE NAME NOT LIKE '%[0-9A-Z]%'  --同上,查詢名字中沒有數字和字母的人
       特殊:
           SELECT * FROM STUDENT WHERE NAME LIKE '%[%]%'  --查詢名字中有一個'%'的人
           SELECT * FROM STUDENT WHERE NAME LIKE '%[_]%'  --查詢名字中有一個'_'的人
           SELECT * FROM STUDENT WHERE NAME LIKE '%['']%'  --查詢名字中有一個 單引號 的人
           SELECT * FROM STUDENT WHERE NAME LIKE '%['']%'  --同上
           SELECT * FROM STUDENT WHERE NAME LIKE '%^%'  --匹配出名字中有一個'^'的人

·空值判斷
-SELECT * FROM STUDENT WHERE ADRESS IS NULL
-SELECT * FROM STUDENT WHERE ADRESS IS NOT NULL

·ISNULL() 函數
-如:SELECT NAME,ISNULL(AGE,符合AGE類型的其他值) FROM STUDENT WHERE … –當查詢的結果中,AGE的值爲’NULL’,則顯示爲要替換的值

·類型轉換
-CAST(AGE AS NVARCHAR(10)) –將原本爲INT類型的AGE轉換成NVARCHAR(10)類型
-CONVERT(INT,’123’) –將字符串’123’轉換成INT類型
-

·GROUP BY
CAST(EXPRESSION AS DATA_TYPE)
CONVERT(DATA_TYPE,EXPRESSION,[STYLE])
-根據某一列數據進行分組,返回的數據表格中一行代表一組,通常配合聚合函數使用。
-例如:SELECT GENDER,MAX(AGE),MIN(AGE),SUM(AGE) FROM STUDENT GROUP BY GENDER
SELECT * FROM STUDENT GROUP BY GENDER
-注:1.分組後只能獲得作爲分組依據的原表數據,其他數據需通過聚合函數獲得

-HAVING
    -其作用是對分組後的信息進行過濾。可用的參數爲GROUP BY子句中的參數和聚合函數
    -例如:SELECT AGE,COUNT(ID) FROM STUDENT GROUP BY AGE HAVING AGE>25
           SELECT AGE,COUNT(ID) FROM STUDENT GROUP BY AGE HAVING COUNT(ID)>1

·SQL語句的執行順序
1.SELECT -> DISTINCT -> TOP
2.FROM 表
3.WHERE 條件 –形成結果集
4.GROUP BY 列
5.HAVING 篩選條件
6.ORDER BY 列

`UNION 聯合查詢
-1.兩個結果集必須具有相同的列數
2.列具有相同的數據類型(至少能隱式轉換)
3.最終輸出的集合的列名由第一個結果集的列名確定

-SELECT * FROM STUDENT WHERE AGE>25
 UNION
 SELECT * FROM STUDENT WHERE AGE<30
 UNITON
 ...
 (可進行多結果集聯合,但結果中不會出現重複數據)

 -SELECT * FROM STUDENT WHERE AGE>25
 UNION ALL
 SELECT * FROM STUDENT WHERE AGE<30
 UNITON ALL
 ...
 (可進行多結果集聯合,結果中可能包含重複數據)

·批量插入 = 插入語句 + 結果集
-將結果集當成值插入數據庫,結果集的列數量、類型都要一樣
INSERT INTO STUDENT(STUNO,ENGLISH,MATH)
SELECT 1,80,100 UNION
SELECT 1,80,100 UNION
SELECT 3,50,59 UNION ALL
SELECT 4,66,89 UNION
SELECT 5,59,100

 -可以複製一張表,但是沒有主鍵
    Select * into Score2 from Score where 1<>1

·字符串函數
-LEN(STRING) 計算字符串中的字符個數
-DATALENGTH(STRING) 計算字符串的字節長度
-LOWER(STRING) 將字符串轉換成小寫
-UPPER(STRING) 將字符串轉換成大寫
-LTRIM(STRING) 去除字符串左側的空白字符
-RTRIM(STRING) 去除字符串右側的空白字符
-LEFT(STRING,LENGTH) 取得字符串從左側開始取的LENGTH長度的字符串
-RIGHT(STRING,LENGTH) 取得字符串從右側開始取的LENGTH長度的字符串
-SUBSTRING(STRING,START_NUM,LENGTH) 從字符串中第START_NUM個字符開始取LENGTH個字符

·日期函數
-GETDATE() 取得當前日期
-DATEADD(PART_NAME,NUM,DATE) 在DATE的基礎上增加NUM的時間
例如:SELECT DATEADD(YEAR,2,GETDATE())
SELECT DATEADD(MONTH,2,GETDATE())
SELECT DATEADD(DAY,2,GETDATE())
SELECT DATEADD(HOUR,2,GETDATE())

-DATEDIFF(DATE_NAME,START_DATE,END_DATE) 取得以DATE_NAME爲時間單位的兩個時間的差
例如:SELECT DATEDIFF(MINUTE,GETDATE(),DATEADD(YEAR,2,GATDATE()))
-DATEPART(DATE) 取得一個日期的特定部分
例如:SELECT DATEPART(YEAR,GETDATE())
SELECT DATEPART(MONTH,GETDATE())
SELECT DATEPART(HOUR,GETDATE())
-YEAR(DATE) 取得時間的年
-MONTH(DATE) 取得時間的月
-DAY(DATE) 取得時間的日

·取絕對值 ABS(數值)

【高級運用】
-INSERT
1.在 INSERT 語句的 VALUES 前加上 OUTPUT INSERTED.列名 ,這樣就能取得新增數據的列名值,和普通的 INSERT 語句相比,當使用 OUTPUT 時將返回列名值,與 @@IDENTITY 類似。

-DELETE
1. DELETED.列名 ,在 WHERE 前使用,效果同 INSERTED.列名 。(若刪除多行,則返回多個值)

爲已存在的表的列添加默認值約束
ALTER TABLE [表名] ADD CONSTRAINT [約束名] DEFAULT([默認值]) FOR [列名]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章