1. 程式人生 > >Sqlite全面學習(三)

Sqlite全面學習(三)

SQLite約束

約束是在表的資料列上強制執行的規則。這些是用來限制可以插入到表中的資料型別。這確保了資料庫中資料的準確性和可靠性。約束可以是列級或表級。列級約束僅適用於列,表級約束被應用到整個表。

以下是在SQLite中常用的約束:

  • NOT NULL約束:確保某列不能有NULL值。
  • DEFAULT約束:當某列沒有指定值時,為該列提供預設值。
  • UNIQUE約束:確保某列中的所有值是不同的。
  • PRIMARY Key約束:唯一標識資料庫表中的各行/記錄。
  • CHECK約束:CHECK約束確保某列中的所有值滿足一定條件。

NOT NULL約束

預設情況下,列可以儲存NULL值。如果您不想某列有NULL值,那麼需要在該列上定義此約束,指定在該列上不允許NULL值。NULL與沒有資料是不一樣的,它代表著未知的資料。

示例語法:

MySQL
1234567 CREATETABLEAndroidTeam(idINT
PRIMARY KEYNOT NULL,nameTEXTNOT NULL,ageINTNOT NULL,addressCHAR(50),moneyREAL);

DEFAULT約束

DEFAULT約束在INSERT INTO語句沒有提供一個特定的值時,為列提供一個預設值。

示例語法:

MySQL
1234567 CREATETABLEAndroidTeam(idINTPRIMARY KEYNOT NULL,nameTEXTNOT NULL,ageINTNOT NULL,addressCHAR(50),moneyREALDEFAULT4500.0);

UNIQUE約束

UNIQUE約束防止在一個特定的列存在兩個記錄具有相同的值。

示例語法:

MySQL
1234567 CREATETABLEAndroidTeam(idINTPRIMARY KEYNOT NULL,nameTEXTNOT NULL,ageINTNOT NULLUNIQUE,addressCHAR(50),moneyREALDEFAULT4500.0);

PRIMARY KEY約束

PRIMARY KEY約束唯一標識資料庫表中的每個記錄。在一個表中可以有多個UNIQUE列,但只能有一個主鍵。在設計資料庫表時,主鍵是很重要的。主鍵是唯一的ID。我們使用主鍵來引用表中的行。可通過把主鍵設定為其他表的外來鍵,來建立表之間的關係。主鍵是表中的一個欄位,唯一標識資料庫表中的各行/記錄。主鍵必須包含唯一值。主鍵列不能有NULL值。一個表只能有一個主鍵,它可以由一個或多個欄位組成。當多個欄位作為主鍵,它們被稱為複合鍵。如果一個表在任何欄位上定義了一個主鍵,那麼在這些欄位上不能有兩個記錄具有相同的值。

示例語法:

MySQL
1234567 CREATETABLEAndroidTeam(idINTPRIMARY KEYNOT NULL,nameTEXTNOT NULL,ageINTNOT NULL,addressCHAR(50),moneyREAL);

CHECK約束

CHECK約束啟用輸入一條記錄要檢查值的條件。如果條件值為false,則記錄違反了約束,且不能輸入到表。

示例語法:

MySQL
1234567 CREATETABLEAndroidTeam(idINTPRIMARY KEYNOT NULL,nameTEXTNOT NULL,ageINTNOT NULL,addressCHAR(50),moneyREALCHECK(money>0));

刪除約束

SQLite支援ALTER TABLE的有限子集。在SQLite中,ALTER TABLE命令允許使用者重命名錶,或向現有表新增一個新的列。重新命名列,刪除一列,或從一個表中新增或刪除約束都是不可能的。

SQLite Joins關鍵字

SQLite的Joins子句用於結合兩個或多個數據庫中表的記錄。JOIN是一種通過共同值來結合兩個表中欄位的手段。

SQL定義了三種主要型別的連線:

  • 交叉連線(CROSS JOIN)
  • 內連線(INNER JOIN)
  • 外連線(OUTER JOIN)

交叉連線CROSS JOIN

交叉連線(CROSS JOIN)把第一個表的每一行與第二個表的每一行進行匹配。如果兩個輸入表分別有 x 和 y 列,則結果表有 x+y 列。由於交叉連線(CROSS JOIN)有可能產生非常大的表,使用時必須謹慎,只在適當的時候使用它們。

語法:

MySQL
1 SELECT...FROMtable1CROSS JOINtable2...;

如下展示示例:
這裡寫圖片描述

內連線INNER JOIN

內連線(INNER JOIN)根據連線謂詞結合兩個表(table1和table2)的列值來建立一個新的結果表。查詢會把table1中的每一行與table2中的每一行進行比較,找到所有滿足連線謂詞的行的匹配對。當滿足連線謂詞時,A和B行的每個匹配對的列值會合併成一個結果行。

內連線(INNER JOIN)是最常見的連線型別,是預設的連線型別。INNER 關鍵字是可選的。

語法:

MySQL
1 SELECT...FROMtable1[INNER]JOINtable2ONconditional_expression...;

為了避免冗餘,並保持較短的措辭,可以使用USING表示式宣告內連線(INNER JOIN)條件。這個表示式指定一個或多個列的列表:

MySQL
1 SELECT...FROMtable1JOINtable2USING(column1,...)...;

自然連線(NATURAL JOIN)類似於JOIN…USING,只是它會自動測試存在兩個表中的每一列的值之間相等值:

MySQL
1 SELECT...FROMtable1NATURALJOINtable2...;

如下展示示例:
這裡寫圖片描述

外連線OUTER JOIN

外連線(OUTER JOIN)是內連線(INNER JOIN)的擴充套件。雖然 SQL標準定義了三種類型的外連線:LEFT、RIGHT、FULL,但SQLite只支援左外連線(LEFT OUTER JOIN)。外連線(OUTER JOIN)宣告條件的方法與內連線(INNER JOIN)是相同的,使用 ON、USING或NATURAL關鍵字來表達。最初的結果表以相同的方式進行計算。一旦主連線計算完成,外連線(OUTER JOIN)將從一個或兩個表中任何未連線的行合併進來,外連線的列使用NULL值,將它們附加到結果表中。

左外連線(LEFT OUTER JOIN)的語法:

MySQL
1 SELECT...FROMtable1LEFT OUTER JOINtable2ONconditional_expression...;

為了避免冗餘,並保持較短的措辭,可以使用USING表示式宣告外連線(OUTER JOIN)條件。這個表示式指定一個或多個列的列表:

MySQL
1 SELECT...FROMtable1LEFT OUTER JOINtable2USING(column1,...)...;

如下展示示例:
這裡寫圖片描述

SQLite Unions子句

SQLite的UNION子句/運算子用於合併兩個或多個SELECT語句的結果,不返回任何重複的行。為了使用UNION,每個SELECT被選擇的列數必須是相同的,相同數目的列表達式,相同的資料型別,並確保它們有相同的順序,但它們不必具有相同的長度。

語法:

MySQL
1234567 SELECTcolumn1[,column2]FROMtable1[,table2][WHEREcondition]UNIONSELECTcolumn1[,column2]FROMtable1[,table2][WHEREcondition]

如下展示示例:
這裡寫圖片描述

UNION ALL子句

UNION ALL運算子用於結合兩個SELECT語句的結果,包括重複行。適用於UNION的規則同樣適用於UNION ALL運算子。

語法:

MySQL
123456789 SELECTcolumn1[,column2]FROMtable1[,table2][WHEREcondition]UNION ALLSELECTcolumn1[,column2]FROMtable1[,table2][WHEREcondition];

這裡給定的條件根據需要可以是任何表示式。

如下展示示例:
這裡寫圖片描述

SQLite NULL值

SQLite的NULL是用來表示一個缺失值的項。表中的一個NULL值是在欄位中顯示為空白的一個值。帶有NULL值的欄位是一個不帶有值的欄位。NULL值與零值或包含空格的欄位是不同的,理解這點是非常重要的。

語法示例:

MySQL
1234567 CREATETABLEAndroidTeam(idINTPRIMARY KEYNOT NULL,nameTEXTNOT NULL,ageINTNOT NULL,addressCHAR(50),moneyREAL);

這裡NOT NULL表示列總是接受給定資料型別的顯式值。這裡有兩個列我們沒有使用NOT NULL,這意味著這兩個列可能為NULL。帶有NULL值的欄位在記錄建立的時候可以保留為空。NULL值在選擇資料時會引起問題,因為當把一個未知的值與另一個值進行比較時,結果總是未知的,且不會包含在最後的結果中。

如下展示示例:
這裡寫圖片描述

SQLite as別名

您可以暫時把表或列重新命名為另一個名字,這被稱為別名。使用表別名是指在一個特定的SQLite語句中重命名錶。重新命名是臨時的改變,在資料庫中實際的表的名稱不會改變。列別名用來為某個特定的SQLite語句重命名錶中的列。

表別名語法:

MySQL
123 SELECTcolumn1,column2...FROMtable_nameASalias_nameWHERE[condition];

列別名語法:

MySQL
123 SELECTcolumn_nameASalias_nameFROMtable_nameWHERE[condition];

如下例項語句:

SELECT a.id, a.name, a.age, b.position FROM teamTable AS a, monkeyTable AS b WHERE a.id = b.tid;

SELECT a.id AS aid, a.name AS aname, a.age, b.position FROM teamTable AS a, monkeyTable AS b WHERE a.id = b.tid;

SQLite觸發器(Trigger)

SQLite的觸發器是資料庫的回撥函式,它在自動執行/指定的資料庫事件發生時呼叫。以下是關於SQLite的觸發器的要點:

  • SQLite的觸發器(Trigger)可以指定在特定的資料庫表發生DELETE、INSERT或UPDATE時觸發,或在一個或多個指定表的列發生更新時觸發。
  • SQLite只支援FOR EACH ROW觸發器(Trigger),沒有FOR EACH STATEMENT觸發器(Trigger)。因此,明確指定FOR EACH ROW是可選的。
  • WHEN子句和觸發器(Trigger)動作可能訪問使用表單NEW.column-name和OLD.column-name的引用插入、刪除或更新的行元素,其中column-name是從與觸發器關聯的表的列的名稱。
  • 如果提供WHEN子句,則只針對WHEN子句為真的指定行執行SQL語句。如果沒有提供WHEN子句,則針對所有行執行SQL語句。
  • BEFORE或AFTER關鍵字決定何時執行觸發器動作,決定是在關聯行的插入、修改或刪除之前或者之後執行觸發器動作。
  • 當觸發器相關聯的表刪除時,自動刪除觸發器(Trigger)。
  • 要修改的表必須存在於同一資料庫中,作為觸發器被附加的表或檢視,且必須只使用tablename,而不是database.tablename。
  • 一個特殊的SQL函式RAISE()可用於觸發器程式內丟擲異常。

建立觸發器(Trigger)語法:

MySQL
123456 CREATETRIGGERtrigger_name[BEFORE|AFTER]event_nameONtable_nameBEGIN-- Trigger logic goes here....END;

在這裡,event_name 可以是在所提到的表 table_name上的INSERT、DELETE和UPDATE資料庫操作。您可以在表名後選擇指定FOR EACH ROW。

以下是在UPDATE操作上在表的一個或多個指定列上建立觸發器(Trigger)的語法:

MySQL
123456 CREATETRIGGERtrigger_name[BEFORE|AFTER]UPDATEOFcolumn_nameONtable_nameBEGIN-- Trigger logic goes here....END;

如下例項語句:
這裡寫圖片描述

列出觸發器(TRIGGERS)

您可以從sqlite_master表中列出所有觸發器,如下所示:

MySQL
1 SELECTnameFROMsqlite_masterWHEREtype='trigger';

上面的 SQLite 語句只會列出一個條目,如下:

MySQL
123 name----------audit_log

如果您想要列出特定表上的觸發器,則使用AND子句連線表名,如下所示:

MySQL
1 SELECTnameFROMsqlite_masterWHEREtype='trigger'ANDtbl_name='teamTable';

上面的 SQLite 語句只會列出一個條目,如下:

MySQL
123 name----------audit_log

相關推薦

Sqlite全面學習

SQLite約束 約束是在表的資料列上強制執行的規則。這些是用來限制可以插入到表中的資料型別。這確保了資料庫中資料的準確性和可靠性。約束可以是列級或表級。列級約束僅適用於列,表級約束被應用到整個表。 以下是在SQLite中常用的約束: NOT NULL約束:確保

Sqlite全面學習

SQLite建立資料庫 建立資料庫語法: MySQL sqlite3 DatabaseName.db 1 sqlite3

爬蟲庫之BeautifulSoup學習

子節點 rom lac repr 文檔 strong 爬蟲 time contents 遍歷文檔樹:   1、查找子節點   .contents     tag的.content屬性可以將tag的子節點以列表的方式輸出。   print soup.body.cont

Java學習JSP學習1

rtm 斷開 三大指令 保持 web應用 對比 c語言 let 新建 一、 理解JSP技術   JSP全名為Java Server Pages,中文名叫java服務器頁面,其根本是一個簡化的Servlet設計,它 是由Sun Microsystems公司倡導、許多公司參

java學習

con void pub oid 修改密碼 tro int str 用戶 類 public class Dog{ String breed; int age; String color; void barking(){ } void hungr

Qt Installer Framework的學習

科技 released his 表示 star online 解壓 dem 普通 Qt Installer Framework的學習(三) Qt Installer Framework的樣例中。通常是這種:config目錄一般放了一個config.xml文件,包括的是安裝

PYTHON學習之利用python進行數據分析(1)---準備工作

-- 下載 rip 安裝包 png 要求 eight code 電腦   學習一門語言就是不斷實踐,python是目前用於數據分析最流行的語言,我最近買了本書《利用python進行數據分析》(Wes McKinney著),還去圖書館借了本《Python數據分析基礎教程--N

Python學習 八大排序算法的實現

ram tty adjust 二叉樹 turn bre python 使用 元素 本文Python實現了插入排序、基數排序、希爾排序、冒泡排序、高速排序、直接選擇排序、堆排序、歸並排序的後面四種。 上篇:Python學習(三) 八大排序算法的實現(上)

RabbitMQ學習訂閱/發布

cto submit actor nal chan true exec oid lsp RabbitMQ學習(三)訂閱/發布 1.RabbitMQ模型 前面所學都只用到了生產者、隊列、消費者。如上圖所示,其實生產者並不直接將信息傳輸到隊列中,在生產者和隊列

C++學習入門篇——函數

image clu square src 函數接口 值類型 使用 mes 技術分享 C++函數分兩種:有返回值的和沒返回值的 1.有返回值的函數 調用函數流程 如圖,sqrt(6.25)為函數調用,

python學習

操作數 sdf dfs 查找子串 索引 start val 成員 放置 第三章 使用字符串

【轉】JMeter學習元件的作用域與執行順序

ces ner 處理器 規則 fig 子節點 控制器 conf 節點 1.元件的作用域 JMeter中共有8類可被執行的元件(測試計劃與線程組不屬於元件),這些元件中,取樣器是典型的不與其它元件發生交互作用的元件,邏輯控制器只對其子節點的取樣器有效,而其它元件(config

vue移動音樂app開發學習:輪播圖組件的開發

hub out webapp width eth reat slot utc -1 本系列文章是為了記錄學習中的知識點,便於後期自己觀看。如果有需要的同學請登錄慕課網,找到Vue 2.0 高級實戰-開發移動端音樂WebApp進行觀看,傳送門。 完成後的頁面狀態以及項目結構如

selenium + python自動化測試unittest框架學習webdriver對頁面其他控件操作

文件的 文件路徑 內容 option selenium script web 對話 對話框 1.對話框,下拉框 (1)對話框的有兩種,一種是iframe格式的,需要switch_to_iframe()進行定位,現在大部分的對話框是div格式的,這種格式的可以通過層級定位來定

selenium + python自動化測試unittest框架學習webdriver元素定位

倒數 節點 大於 文本框 webdriver 而且 單標簽 unit 遍歷 1.Webdriver原理 webdirver是一款web自動化操作工具,為瀏覽器提供統一的webdriver接口,由client也就是我們的測試腳本提交請求,remote server瀏覽器進行響

Spring Boot學習

src pack art tin pre size -s script jar Spring boot實戰 —— Hello Word 1、創建maven項目 2、pom.xml文件 <?xml version="1.0" encoding="UTF-8"?>

Python Web框架Django學習

pythonPython Web框架Django學習(三)目錄: 五、Django生命周期 六、Django的CBV與FBV 七、字典、基於正則的URL 八、ORM=====================================================================

arm cortex-m0plus源碼學習GPIO

byte gen 類型 when 情況 代碼示例 16bit 變量 進行 概述: Cortex-m0的integration_kit提供三個GPIO接口,其中GPIO0傳輸到外部供用戶使用,為EXTGPIO;GPIO1是內核自己的信號,不能亂改,會崩掉;GPIO2是

MongoDB學習

null mon 數據類型 正則表達 utf 64位 時間戳 32位 位或 mongodb支持的數據類型 字符串 必須是 utf-8 整型 可以是32位或者是64位 取決於服務器 布爾類型 雙精度浮點數 最小/最大值 數組 時間戳 對象 Null 符號 日期 對象ID

UML學習-----序列圖

傳遞 發送對象 指向 定義 是把 我認 mage 表達 操作 UML的模型中可分為兩種,動態模型和靜態模型。用例圖、類圖和對象圖都是UML中的靜態結構模型。而在UML系統動態模型的其中一種就是交互視圖,它描述了執行系統功能的各個角色之間相互傳遞消息的順序關系。序列圖就是交互