日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL语言方方面面

發布時間:2025/7/14 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL语言方方面面 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 數據庫和SQL

1.1 數據庫

  DB, DBMS

  DBMS的種類: 層次性數據庫, 關系型數據庫, 非關系型數據庫

  RDBMS, 關系數據庫管理系統

1.2 數據庫的結構

  RDBMS常見的系統結構是 客戶端服務器結構

  表: 在關系數據庫中管理數據的二維表

  關系數據庫必須以航為單位進行數據的讀寫

1.3 SQL

  標準SQL和特定的SQL

  SQL語句的分類

    1) DDL 數據定義語言: create, drop, alter

    2) DML 數據操作語言(90%的使用率): select, instert, update, delete

    3) DCL 數據控制語言: commit, rollback, grant, revoke

  SQL的基本原則

    1) 以分號結尾

    2) 不區分大小寫, 一般關鍵字大寫, 表首字母大寫, 列小寫

    3) 常數的書寫方式是固定的, 字符串日期常數用單引號, 數字直接寫就行

    4) 空格要是半角的

    5) 注釋有兩種寫法 單行用-- 多行用/**/

1.4 表的創建

  數據庫的創建

create database 數據庫名稱;

  表的創建

create table 表名(列名 數據類型 該列的約束...表的約束 );

  命名規則

    名字可以是: 半角英文字母, 數字, 下劃線,?

    必須是以英文開頭

    名稱不能重復

  數據類型

    integer, char(定長的字符串), varchar(不定長的字符串), date

  主鍵約束

    primary key

1.5 表的刪除和更新

  刪除表

drop table 表名;

  添加行

alter table 表名 add column 列的定義;

  插入數據

insert into 表 values (值, 值...);

2 基礎查詢

2.1 select語句基礎

  1) 基本格式

select 列名, 列名... from 表名,.. ;

  2) 其中在列名去中輸入* 表示顯示所有列, 而且是按照表定義的列的順序進行顯示

  3) 為列設置別名

select 列名 as 別名, 列名 as 別名, ... from 表名,.. ;

    設置別名之后, 查詢得到的結果的行首就顯示的是別名

    如果設置成中文的話需要使用雙引號來定義

  4) 設置常數列

select 列名 as 別名, 列名 as 別名, 常數 as 別名... from 表名,.. ;

    這個常數可以是數字也可是字符串

    這么設置之后這個列的值就是這個常數值, 且表頭顯示的是別名, 如果不設置別名, 那也顯示成該常數

  5) 去除重復行

    在select后面加上關鍵字distinct

    注意distinct的位置, 只能在第一個列名之前

    去除是根據后面選取行的組合來判斷的重復

  6) where限定行

    在from之后加上where語句限定查詢出來的結果

2.2 算數運算符和比較運算符

  算數運算符: + - * /

    關于NULL的運算結果都是NULL

  比較運算符: = <> >= <= > <

    數字的比較是按照值比較的

    字符串的比較是按照字典順序進行比較的

    NULL不會和別的結果進行比較

    判斷是NULL用IS NULL

    判斷不是NULL用 IS NOT NULL

2.3 邏輯運算符

  NOT 表示否定

  AND OR 與或者非

    AND的優先級是高于OR的

    要想按照指定的順序執行需要使用括號

  邏輯運算中NULL需要單獨討論

    對NULL使用比較運算符得到的結果是unkonwn(不確定)

    除了true, false還有unknown

    在SQL中的邏輯運算有三值邏輯

    判斷值的原則是 真>unknown>假, AND取等級低的, OR取等級高的

    因此在AND中, 真 AND unknown = unknown, unknown AND false = false

    在OR中,?真 OR unknown = 真, unknown OR false =?unknown

3 聚合和排序

3.1 對表進行聚合查詢

  常用的聚合函數

    count: 計算個數(行數), 可以指定參數, 當指定列值為NULL時, 不做統計

    sum: 求和

    avg: 求平均值

    max: 求最大值

    min: 求最小值

  關于NULL

    指定列時, 如果值為NULL, 會忽略

    對于AVG, 如果有NULL值, 同樣也是忽略, 也就是分子沒有那個值, 分母也不算拿一行

  在聚合函數中, 可以傳入參數, 可以傳入distinct來刪除重復的值

3.2 對表進行分組

  使用group by來分組

  group by后面指定的列為聚合鍵或者分組列

  分組NULL同樣會單獨形成一個分組

  有where會先執行where, 得到篩選的結果之后再進行分組

  注意事項:

    1) select 不能選取除group by選定的列的其他列

    原因是: 既然已經分組了, 那么一個分組對應的記錄就有可能是多條, 在當前分組下, group by后面的列的值是一致的并沒有什么關系, 但是如果選取別的列, 那么就有可能是不同的值, 那么此時就不能夠確定顯示哪一個值了, 這樣就造成了歧義, 在mysql中會排序然后得到第一個值

    2) group by后面不要寫別名

    原因是: select語句是在group by之后執行的, 因此使用了別名那個時候是找不到的

    3) 不要在where中使用聚集函數

    實際上能夠使用聚集函數的就有: select子句, having, order by, group by

3.3 為聚合結果指定條件

  使用having在分組的基礎上進行過濾篩選

  having的組成部分

    常數

    聚合函數(聚合函數類的參數可以是非聚合鍵)

    聚合鍵

  因此在having中使用別的鍵是錯誤的

  having和where的區別

    要將having和where區分開來

    having: 指定組的條件

    where: 指定行的條件

    能使用where就使用where, 因為where的執行效率更高

3.4 對查詢結果進行排序

  排序使用order by

  一般地, 查詢的記錄的順序是隨機的(或者有的數據庫會有默認的排序)

  由于進行數據的排序是在返回結果的時候執行, 因此一般地, order by語句放在查詢語句的末尾

  ASC表示升序, DESC表示降序

  指定多個排序鍵

    可以指定多個排序鍵, 這樣在第一個鍵相同的時候判斷第二個鍵, 進一步確定排序的順序

  NULL值會固定放在最后, 不管是升序還是降序

  查詢語句的執行順序:

    from -> where?-> group by?-> having?-> select?-> order by

  order by可以使用的列

    表中的列

    select中選取的列的序號, 從1開始

    聚合函數

4 數據更新

4.1 數據的插入

  insert的基本語法

insert into 表名(列1, 列2, ...) values (值1, 值2,...)... ;

  原則上, 一次insert語句只會插入一行數據

  但是有的數據庫是支持多行插入的, 用括號括起來表示一行, 用逗號間隔多行的數據

  列清單可以省略, 省略之后按照順序排序數據

  值可以是NULL

  插入默認值

    1) 通過顯式的方式

    在設置了默認值的位置用default代替

    2) 通過隱式的方式

    列清單不寫該列

  從其他表中賦值數據

insert into 表名(列1, 列2, ...) select... ;

4.2 數據的刪除

  刪除表

drop table 表名;

  全部刪除數據

delete from 表名;

  刪除指定記錄

delete from 表名 where 條件;

  清空表, 還原表為初始狀態

truncate 表名;

    不能加入where語句指定某記錄

    處理速度比delete快很多

4.3 數據的更新

  update的基本語法

update 表名set 列名 = 表達式
   ...where 條件;

  表達式可以是一個固定的值, 也可以是一個運算

  NULL清空

    將值設置為NULL, 但是該列必須是允許空的

  其中列名=表達式可以有多個, 這樣可以方便進行多行更新

4.4 事務

  事務: 需要在同一個處理單元中執行的一系列更新處理的集合

  創建事務

事務開始語句;DML語句;...... 事務結束語句;

    一般地, 事務開始語句分數據庫, SQL server的是begin transaction, MySQL是start?transaction, Oracle沒有開始語句

    因此一定要注意事務的開始起點, 在標準SQL中已經規定了一種悄悄處理事務的方法

    結束語句一般是commit表示提交

    一定要記得在事務結束之后仔細確認

    結束語句還可以是rollback, 表示取消事務包含的全部更新處理

  一般的數據庫產品已經不需要事務的開始語句了, 很多數據庫在執行第一個SQL語句的時候就已經悄悄開始了事務

  一般有兩種情況

    1) 每一條SQL語句都是一個事務(自動提交模式): SQL Server, PostgreSQL, MySQL

    2) 知道用戶執行了commit或者rollback為止算作一個事務: Oracle

    因此在大多數情況下, 采用自動提交模式的數據庫, 你一旦誤刪了某個表, 就再也找不回來了

  酸性性質

    ACID性質, 這是所有DBMS都必須遵守的規則

    A: 原子性, 事務在結束時, 其中包含的更新處理要么全部執行, 要么完全不執行, 這樣就防止了中途停止的情況, 不會對業務造成不好的影響

    C: 一致性(完整性), 事務中執行的處理, 必須要滿足數據庫數據表設置好的約束, 如果不遵守約束, 就會報錯, 然后事務回滾

    I: 隔離性, 保證事務時間互不干擾的特性, 該事務之間不會相互嵌套, 當前事務如果沒有提交, 所做的修改是對別的事務是不可見的, 直到事務完成

    D: 持久性(耐久性), 事務一旦結束, 數據庫會保證數據的狀態得以保存, 常見的保證持久性的方法是將執行記錄保存到存儲介質上, 也就是一般意義的保存日志

5 復雜查詢

5.1 視圖

  視圖基本上與表差不多, 只是說表實際存儲數據, 而視圖是虛表, 不會存儲實際的數據

  一般的, 對表的修改更新等操作會實際的寫到存儲介質上進行保存, 但是對視圖的處理, 不會將數據保存到任何地方, 實際上視圖保存的就是select語句, 當需要從視圖中讀取數據的時候, 就是根據這個select語句來創建一個臨時表

  視圖的優點

    1) 無需保存數據, 節省存儲空間

    2) 可以將常用的select語句保存成視圖, 這樣就不會每次重寫查詢語句, 且會得到數據的 最新狀態

  創建視圖

create view 視圖名稱 (視圖列名, 視圖列名, ...) as select語句 ;

    創建視圖的時候, 視圖名稱后面的名稱是可以省略的, 省略的時候默認就是查詢出來的列名; 如果指定了列名, 就相當于是重新命名的列名, 但是要注意此時的列名要和查詢得到的列相同數量

  視圖的注意事項:

    1) 可以在視圖的基礎上再創建視圖, 也就是形成了多重視圖, 但是這樣會降低SQL的性能, 一般杜絕這樣的操作

    2) 一般定義視圖的時候不使用order by, 因為數據行是沒有順序的, 盡管很多數據庫支持這樣的操作

    3) 可以對視圖進行更新, 但是有條件限制, 一般視圖是無法進行更新的, 因為諸如你創建的視圖是基于聚合函數的, 聚合函數是針對一個分組的, 如果對視圖進行添加數據了, 那么對應這個數據反映到原表上是一組數據, 數據庫是沒有辦法處理這一組數據僅僅只有一個聚合的結果

    可以進行更新的條件

    1) select子句中沒有使用distinct

    2) from后面就只有一張表

    3) 沒有使用group by, 也沒有使用having

  視圖的使用

    一般對視圖的操作就是查詢操作, 可以將視圖名稱當成一般的表使用就好了

  視圖的刪除

drop view 視圖名稱;

    在刪除的時候, 如果有其他視圖是在當前視圖的基礎上創建的, 那么這個視圖是無法被刪除的, 此時還要刪除需要加上級聯刪除

drop view 視圖名稱 cascade;

5.2 子查詢

  子查詢就是在select ..from的后面再加上select語句查詢結果, 并用as關鍵字命名, 但不是所有的數據庫都支持as, 直接寫名字就行

select .. from (select語句) as 名字 .. ;

  可以在子查詢中嵌套子查詢

  標量子查詢: 只返回一行一列數據的子查詢

    標量子查詢相當于就是一個標量值, 因此可以應用到標量值應用的所有位置, selet后面, where后面, having后面等

    使用標量子查詢需要注意的是, 一定要注意查詢的結果是一行一列的

5.3 關聯子查詢

  現在有個商品表    

  

  現在需要根據篩選出單價大于該分類的平均值的商品

  如果僅僅使用子查詢, 得到的SQL是錯誤的

SELECT * FROM sp WHERE sp_prise > (SELECT AVG( sp_prise) FROM sp GROUP BY sp_class );

  但是這樣會報錯, 因為子查詢的值不唯一, 那如何將當前商品和當前商品類別的平均價格對應上呢, 就是關聯子查詢

  關聯子查詢就是在子查詢中, 關聯表的操作, 應用關聯子查詢得到的SQL是這樣的

SELECT * FROM sp as s1 WHERE s1.sp_prise > (SELECT AVG( s2.sp_prise) FROM sp as s2WHERE s1.sp_class = s2.sp_classGROUP BY s2.sp_class );

6 函數, 謂詞和case表達式

6.1 函數

  函數: 給定一些輸入, 輸出特定的輸出

    輸入值就是參數

    輸出值就是返回值

  函數分為

    1) 算術函數: abs(絕對值), mod(求余, 傳入兩個參數), round(四舍五入),?

    2) 字符串函數

      拼接:

-- 一般數據庫使用||拼接字符串 SELECT sp_name, sp_class, sp_name || sp_class as my_str FROM sp;-- SQL Server使用+拼接字符串 SELECT sp_name, sp_class, sp_name + sp_class as my_str FROM sp;-- MySQL使用concat()函數拼接字符串 SELECT sp_name, sp_class, concat(sp_name,sp_class) as my_str FROM sp;

      字符串長度: length(字符串) SQL Server使用的是len()

      轉成小寫: lower()

      轉成大寫: upper()

      字符串替換: replace(字符串對象, 要替換的字符串, 替換成的字符串)

      字符串截取: substring(字符串對象 from 起點 for 截取的字符數) 例如: substring("ABCDE" from 2 for 3) 得到的字符串是"BCD"   

    3) 日期函數

      當前日期: current_date

      當前時間: current_time

      當前日期和時間點: current_timestamp

      截取日期元素: extract(日期元素 from 日期)

SELECT CURRENT_TIMESTAMP,EXTRACT(YEAR FROM CURRENT_TIMESTAMP),EXTRACT(MONTH FROM CURRENT_TIMESTAMP),EXTRACT(DAY FROM CURRENT_TIMESTAMP),EXTRACT(HOUR FROM CURRENT_TIMESTAMP),EXTRACT(MINUTE FROM CURRENT_TIMESTAMP),EXTRACT(SECOND FROM CURRENT_TIMESTAMP);

    4) 聚合函數: sum, avg, max, min, count

    5) 轉換函數: 轉換函數是進行類型的轉換或者值的轉換

      類型轉換

        cast(轉換前的值 as 想轉換的數據類型)

      值轉換, 將NULL轉化為其他值

        coalesce(數據1, 數據2, ...)  

6.2 謂詞

  常見的謂詞就是一些比較運算符(= < >等)

  具體來說就是, 返回值是真值(true/false/unknown)

  常見的謂詞有like betwween, is null, is not null, in, exists

  (1) like

    涉及到前方一致, 中間一致, 后方一致, 分別是: 字符串%, %字符串%, %字符串

    %表示任意個字符, _表示任意一個字符

  (2) between A and B 范圍查找

    取值范圍為?[A, B]?

  (3) is null, is not null

    判斷是不是null不能用 值 = null 來判定, 這樣始終返回為false

    判斷是否為null

  (4) in

    in/not in 可以用or來實現, 但是使用in更加簡潔

  (5) exist

    判斷記錄是否存在某種條件, 返回值是false或者true

6.3 case表達式

  case表達式主要完成條件分歧

  具體格式為

case when 判斷表達式 then 表達式when 判斷表達式 then 表達式when 判斷表達式 then 表達式...else 表達式 end

  課件不管有多么復雜的case語句, 最終的結果始終是一個簡單的值

  基于這樣的特點, case語句也可以放在任何單值的位置

7 集合運算

7.1 表的加減法

  表的加減法是處理增減或者減少數據行

  (1) 表的加法 union

  union是對表進行并集運算, 條件是列必須相同(一般地, 列對應是一樣的union才有意義), 得到的結果會去掉重復

  注意:

    列要相同

    列的類型必須一致

    可以使用任何select大但是order by只能在最后使用且使用一次, 也就是說只能對union之后的表進行排序

    如果要包含重復的行要使用union all

  (2) 表的公共部分 intersect

  intersect取得的是表的交集

  (3) 表的減法 except

  求的在A表中不在B表中的記錄

7.2 聯結

  聯結的作用是增加列, 是在列的方向進行一定的操作

  (1) 內聯結 inner join

  格式為

select 列 from 表A inner join 表B on 聯結條件 其他操作;

  得到的結果是同時滿足聯結條件的記錄, 不存在補記錄的現象

  (2) 外聯結 outer join

  與內聯結相比, 外聯結存在補齊的情況

  (3) 交叉聯結 cross join

  得到的就是笛卡爾積?

?

轉載于:https://www.cnblogs.com/weihuchao/p/6958942.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的SQL语言方方面面的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。