數據庫系統原理(第四章:SQL與關系數據庫基本操作 )

一、SQL概述

sql是結構化查詢語言(Structured Query Language,SQL)是專門用來與數 據庫通信的語言,它可以幫助用戶操作關系數據庫。

SQL的特點:

SQL不是某個特定數據庫供應商專有的語言; SQL簡單易學 ;SQL強大、靈活,可以進行非常復雜和高級的數據庫操作

SQL的組成:

  • 數據查詢
  • 數據定義語言(Data Definition Language,DDL)
  • 數據操縱(DML)
  • 數據控制(DCL)

*******************數據定義語言**********************

CREATE 創建數據庫或數據庫對象

ALTER 對數據庫或數據庫對象進行修改

DROP 刪除數據庫或數據庫對象

************數據操縱語言(Data Manipulation Language,DML)***********

SELECT 從表或視圖中檢索數據

INSERT 將數據插入到表或視圖中

UPDATE 修改表或視圖中的數據

DELETE 從表或視圖中刪除數據

***************數據控制語言(Data Control Language,DCL)****************

GRANT 用于授予權限

REVOKE 用于收回權限

?

二、MySQL預備知識

嵌入式和動態SQL規則:規定了SQL語句在高級語言程序設計中 使用的規范方法,以便適應較為復雜的應用

SQL 調 用(以便提高SQL的靈活性、有效性、共享性以及使SQL具有更多的高級語言的特征):SQL 例 程、調 用 規 則??

MySQL使用基礎:LAMP模式 、WAMP模式? ?L(Linux)?A(Apache)M(MySQL) P(PHP、Perl、Python)

?

?

關系數據庫管理系統(RDBMS):優點:體積小、速度快、開放源代碼、遵循GPL

MySQL擴展語言要素

常量:也稱字面值或標量值?

  • 字符串常量:用單引號或雙引號括起來的字符序列,分為ASCII字符串常量和Unicode字符串常量
  • 數值常量:整數常量、? 浮點數常量
  • 十六進制常量:每對十六進制數字被轉換為一個字符,其最前面有一個字母“X”(或“x”)
  • 時間日期常量:用單引號將表示日期時間的字符串括起來而構成的 例如:’2018-06-05’
  • 位字段值
  • 布爾值:TRUE:1? ;FALSE: 0
  • NULL值

變量:

  • 用戶變量:用戶變量前常添加一個符號@,用于將 其與列名區分開
  • 系統變量:大多數系統變量應用于其他SQL語句中 時,必須在系統變量前添加兩個@

?

?

?表達式 表達式是常量、變量、列名、復雜計算、運算符和函數的組合。

  • 字符型表達式
  • 數值型表達式
  • 日期型表達式

?

?

?三、數據定義(DDL)

創建數據庫(CREATE):使用CREATE? DATABASE 或? CREATE SCHEMA語句

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name[DEFAULT]CHARACTER SET[=]charset_name|[DEFAULT]COLLATE[=]collation_name

例句:create DATABASE test_sy CHARACTER SET ="UTF8" COLLATION ="utf8_general_ci";? ? ?CREATE DATABASE mysql_test;

  1. 字符集(character set):定義了字符以及字符的編碼。
  2. 字符序(collation):指定字符集的 校對規則。

查看數據庫(SHOW):查看數據庫的所有表

SHOW {DATABASES | SCHEMAS}[LIKE’pattern’ | WHERE expr]

Like關鍵字用于匹配指定的數據庫名稱; Where從句用于指定數據庫名稱查詢范圍的條件

例句:SHOW DATABASES;??SHOW DATABASES LIKE "%test%";

SHOW TABLES:查看數據庫非系統表

?

選擇數據庫(USE):USE db_name;??從一個數據庫“跳轉”到另一個數據庫。

修改數據庫:alert

mysql>ALTER DATABASE mysql_test-> DEFAULT CHARACTER SET gb2312-> DEFAULT COLLATE gb2312_chinese_ci;

刪除數據庫:

DROP{DATABASE|SCHEMA}[IF EXISTS]db_name

例句:DROP DATABASE hahaha;? ?DROP DATABASE IF EXISTS hahaha;

*****************************表定義**********************************

創建表:數據表是關系數據庫中最重要、最基本的數據對象, 也是數據存儲的基本單位。

數據表, 被定義為字段的集合 按(行 )和(列 )的格式來存儲的, 每一(?行)代表一條記錄, 每一(列 )代表記錄中一個字段的取值。

CREATE[TEMPORARY]TABLE tbl_name(字段名1 數據類型 [列級完整性約束條件][默認值][,字段名2 數據類型 [列級完整性約束條件][默認值]][,……][,表級完整性約束條件])[ENGINT=引擎類型]

若添加“TEMPORARY”,則為臨時表

在一個已有數據庫mysql_test中新建一個包含客戶姓名、性別、地址、 聯系方式等內容的客戶基本信息表,要求將客戶的id號指定為該表的 主鍵。

?

?

PRIMARY KEY(cust_id):指定主鍵

數據類型:

  • 整型int
  • 浮點型double
  • 布爾型bool
  • 日期型date
  • 時間戳timestamp
  • 時間型time 定長
  • 字符類型char
  • 可變長字符varchar

更新表(ALTER):使用ALTER TABLE語句,增加或刪減列、創建或取消索引、更改原有列的 數據類型、重新命名列或表,更改表的評注和表的引擎類型,為表重新創 建觸發器、存儲過程、索引和外鍵等。

1、ADD COLUMN?

例如:向數據庫mysql_test的表customers中添加一列,并命名為 cust_city,要求其不能為NULL,默認值為字符串“Wuhan”,且該列位 于原表cust_sex列之后。

ALTER TABLE mysql_test.customers ->ADD COLUMN cust_city char(10)NOT NULL DEFAULT ‘Wuhan’ AFTER cust_sex;

2、CHANGE[COLUMN]子句 修改表中列的名稱或數據類型

?

?3、ALTER[COLUMN]子句 修改或刪除表中指定列的默認值

  ALTER TABLE mysql_test.customers ->ALTER COLUMN cust_city SET DEFAULT ‘Beijing’;

4、MODIFY[COLUMN]子句 只修改指定列的數據類型,不會干涉它的列名

  ALTER TABLE mysql_test.customers ->MODIFY COLUMN cust_name char(20) FIRST;

5、DROP[COLUMN]子句 刪除表中多余的列

ALTER TABLE mysql_test.customers ->DROP COLUMN cust_contact;

6、RENAME[TO]子句 為表重新賦予一個表名

ALTER TABLE mysql_test.customers ->RENAME TO mysql_test.backup_customers;

給表重命名表的第二種寫法:RENAME TABLE db_a.old_table TO db_b.new_table;

7、DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [ ,tbl_name ] … [RESTRICT | CASCADE]

?

查看表結構:

SHOW [FULL] COLUMNS {FROM | IN} tbl_name[{FROM | IN} db_name] [LIKE’pattern’ | WHERE expr]

例如:SHOW COLUMNS FROM t_role;

{DESCRIBE | DESC} tbl_name [col_name | wild]

例如:DESC t_role;

********************************************索引****************************************

?索引:索引是提高數據文件訪問效率的有效方法

?索引存在的弊端: 1)索引是以文件的形式存儲的,如果有大量的索引,索引文件可能比數據 文件更快達到最大的文件尺寸; 2)索引在提高查詢速度的同時,會降低更新表的速度。

?索引的分類:索引通常被創建成單列索引和組合索引

  • 普通索引 INDEX或KEY
  • 唯一性索引 UNIQUE
  • 主鍵 PRIMARY KEY

索引的創建?Create?index

?

?

?例如:在數據庫mysql_test的表customers上,根據客戶姓名列的前三個 字符創建一個升序索引index_customers。

create?index? index_customers? on mysql_test.customers (name(3) ASC);

在數據庫mysql_test的表customers上,根據客戶姓名列和客戶id 號創建一個組合索引index_cust。

create index index_cust on mysql_test.customers (cust_name,cust_id);


2、語法項[CONSTRAINT[symbol]] UNIQUE [INDEX|KEY] [index_name] (index_col_name,…),
用于表示在創建新表的同時創建該表的唯一性索引;
3、語法項[CONSTRAINT[symbol]] FOREIGN KEY [index_name] (index_col_name,…),
用于表示在創建新表的同時創建該表的外鍵;

?索引的創建:使用ALTER TABLE語句創建

  • 1)語法項ADD {INDEX|KEY} [index_name](index_col_name,…), 用于表示在修改表的同時為該表添加索引;
  • 2)語法項ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,…), 用于表示在創建新表的同時為該表添加主鍵;?
  • 3)語法項ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] (index_col_name,…), 用于表示在修改表的同時為該表添加唯一性索引;
  • 4)語法項ADD [CONSTRAINT [symbol]] FOREIGN KEY (index_col_name,…), 用于表示在創建新表的同時為該表添加外鍵

例如:使用ALTER TABLE語句在數據庫mysql_test中表seller的姓名上添加一列 非唯一的索引,取名為index_seller_name。

?ALTER TABLE mysql_test.seller? ?ADD INDEX index_seller_name(seller_name);

?索引的查看(SHOW INDEX )

SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name ] [WHERE expr]

?SHOW index FROM t_test.tb_dept;

索引的刪除:使用DROP INDEX語句

DROP INDEX index_name ON tbl_name;

索引的刪除:使用ALTER TABLE語句

  • 1)選用DROP PRIMARY KEY子句用于刪除表中的主鍵,由于一個表中只有 一個主鍵,其也是一個索引;
  • 2)選用DROP INDEX子句用于刪除各種類型的索引;
  • 3)選用DROP FOREIGN KEY子句用于刪除外鍵。

例如:使用ALTER TABLE語句刪除數據庫mysql_test中表customers的主鍵和索引 index_customers。

?

四、數據更新(數據操縱語言DML)

插入數據?

  • INSERT…VALUES語句
  • INSERT…SET語句
  • INSERT…SELECT語句

例如:

1、使用INSERT…VALUES語句向數據庫mysql_test的表customers中 插入這樣一行完整數據:(901,張三 ,F,北京市,朝陽區)

  INSERT INTO mysql_test.customers? ? VALUES (901,’張三’,’F’,’北京市’,’朝陽區’);

2、使用INSERT…VALUES語句向數據庫mysql_test的表customers中插入這樣一行 數據,要求該數據目前只用明確給出cust_name列和cust_address列的信息,即分別為 ‘李四’‘武漢’,而cust_id由系統自動生成,cust_sex列選用表中默認值,另外 cust_contact列的值暫不確定,可不用指定

INSERT INTO mysql_test.customers? ?VALUES (0,’李四’,DEFAULT,’武漢市’,NULL);

********************使用INSERT…SET語句插入部分列值數據***************************

語法:INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},…

例如:使用INSERT…SET語句向數據庫mysql_test的表customers中插入 數據:名為李四 ,地址為武漢,性別默認

insert?into?mysql_test.customers set cu_name="李四",cu_address="武漢",cu_sex=DEFAULT;

***********************使用INSERT…SELECT語句插入子查詢數據****************************

語法:INSERT [INTO] tbl_name [(col_name,…)] SELECT…

例句:INSERT?INTO?db1_name (field1,field2)?SELECT?field1,field2 FROM db2_name;

刪除數據

語法:DELETE FROM tbl_name [WHERE where_condition ] [ORDER BY … ] [LIMIT row_count ]

例如:使用DELETE語句刪除數據庫mysql_test的表customers中客戶名 為“李四”的客戶信息。

delete?from?mysql_test.customers where cu_name="李四";

修改數據

語法:UPDATE tbl_name SET col_name1={expr1|DEFAULT}[,col_name2={expr2|DEFAULT}]… [WHERE where_condition] [ORDER BY …] [LIMIT row_count]

例如:使用UPDATE語句將數據庫mysql_test的表customers中姓名為“ 張三”的客戶的地址更新為“武漢”

UPDATE mssql_test.customers? ?SET cust_address=‘武漢市’? ?WHERE cust_name=‘張三’;

五、數據查詢

?SELECT語句

?

?

?

?例如:查詢數據庫mysql_sest的表customers中各個客戶的姓名、性別和地址信息

? ? ? ? SELECT cust_name,cust_sex,cust_address? ?FROM mysql_test.customers;

定義并使用列的別名:SELECT cust_name,cust_address AS 地址,cust_contact? ? FROM mysql_test.customers;

替換查詢結果集中的數據

SELECT 
CASE id
WHEN 1 then "yf"
when 2 then "cs"
WHEN 3 THEN "yw"
WHEN 4 THEN "jl"
ELSE "qt" END AS NAME
FROM tb_dept;

?

?

?聚合函數通常是數據庫系統中一類系統(內置函數)

*******************FROM子句與多表連接查詢**********************

交叉連接,又稱笛卡爾積

  • SELECT * FROM tbl1 CROSS JOIN tbl2;
  • SELECT * FROM tbl1,tbl2

內連接:SELECT? ?*? FROM tb_student INNER JOIN tb_score? ?ON tb_student.studentNo=tb_score.studentNo

  • 關于內連接的使用,可以將一個表與它本身進行連接,這種連接方式稱為自連接;
  • 關于內連接的使用,如若在ON子句的連接條件中使用運算符“=”,則此 連接方式為(等值連接)

外連接:

  • 左外連接:在FROM子句中使用關鍵字LEFT OUTER JOIN或LEFT JOIN
  • 右外連接:在FROM子句中使用關鍵字RIGHT OUTER JOIN或RIGHT JOIN

問答題:寫出在MySQL中,內連接的語法格式。

?

?

?

簡述左外連接和右外連接的區別。

  • 左外連接:也稱左連接。以左表為基表,在FROM子句中使用關鍵字“LEFT OUTER JOIN”或關鍵字“LEFT JOIN”來連接兩張表。
  • 右外連接:也稱右連接。以右表為基表,在FROM子句中使用關鍵字“RIGHT OUTER JOIN”或關鍵字“RIGHT JOIN”來連接兩張表。

where子句

?

?

?

判定范圍:

1、當查詢的過濾條件被限定在值的某個范圍時,可以使用關鍵字“BETWEEN”。

例如:SELECT * FROM mysql_test.customers ->WHERE cust_id BETWEEN 903 AND 912;

2、使用關鍵字“IN”可以指定一個值的枚舉表,該表中會列出所有可能的值

判定空值:?is? null ;is?not?null

子查詢—結合關鍵字“IN”使用的子查詢:主要用于判定一個給定值是否存在于子查詢的結果集中

子查詢—結合關鍵字“EXISTS”使用的子查詢:子查詢的結果集不為空,則返回TRUE,否則返回FALSE

GROUP BY子句與分組數據:


HAVING子句:HAVING where_condition(指定過濾條件)

?

?

?

having?語句與實際有出入為了考試請按照書本上的來哪怕他錯了

?

?

?ORDER BY子句:排序

例句:在數據庫mysql_test的表customers中依次按照客戶姓名和地址的降序方式輸出客戶的姓名和性別

SELECT cust_name,cust_sex FROM mysql_test.customers -> ORDER BY cust_name DESC,cust_address DESC;

?

?LIMIT:使用LIMIT子句限制被SELECT語句返回的行數

?

六、視圖

什么是視圖:

  • 視圖是數據庫中的一個對象,它是數據庫管理系統提供給用戶的以多種角度觀察數據庫中數據的一種重要機制。
  • 視圖不是數據庫中真實的表,而是一張虛擬表,其自身并不存儲數據。

使用視圖的優點

  • 集中分散數據
  • 簡化查詢語句
  • 重用SQL語句
  • 保護數據安全
  • 共享所需數據
  • 更改數據格式


使用CREATE VIEW創建視圖

語法;CREATE VIEW view_name[(column_list)]? AS select_statement? [WITH [CASCADED | LOCAL] CHECK OPTION]

  • create or replace view的意思就是若數據庫中已經存在這個名字的視圖的話,就替代它,若沒有則創建視圖;
  • create則不進行判斷,若數據庫中已經存在的話,則報錯,說對象已存在;

在數據庫mysql_test中創建視圖customers_view,要求該視圖包含客戶信息表customers中所有男客戶的信息,并且要求保證今后對該視圖數據的修改都必須符合客戶性別為男性這個條件

CREATE OR REPLACE VIEW mysql_test.customers_view? ?AS? SELECT*FROM mysql_test.customers? WHERE cust_sex=‘M’? WITH CHECK OPTION;

使用DROP VIEW語句刪除視圖:

DROP VIEW [IF EXISTS] view_name [,view_name]… [RESTRICT | CASCADE]

使用ALTER VIEW語句對已有視圖的定義(結構)進行修改

ALTER VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL]CHECK OPTION]

使用SHOW CREATE VIEW語句查看已有視圖的定義(結構)

SHOW CREATE VIEW view_name

使用DELETE語句通過視圖刪除基本表的數據:

示例:刪除視圖customers_view中姓名為“周明”的客戶信息

DELETE FROM mysql_test.customers_view -> WHERE cust_name=‘周明’

在視圖customers_view中查找客戶id號為905的客戶姓名及其地址

轉載于:https://www.cnblogs.com/jalja/p/11605648.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248050.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248050.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248050.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

selenium操作瀏覽器窗口最大化和刷新

實際測試過程中經常遇到打開一個頁面并不是全屏顯示,但是卻希望它能夠全屏顯示或者新增一條記錄后需要刷新一下看能不能再列表中正常顯示。 于是就有了今天的關于對瀏覽器窗口的最大化和刷新頁面。需要說明的一點:所有和python相關的記錄都是基于3.6版本…

Git安裝步驟+Mac終端配置

Git安裝步驟 其實可以直接略過。因為安裝的時候,一路 next 即可。 注意,安裝路徑中不能出現中文。安裝完成后,不得更改安裝路徑。 檢查Git是否安裝成功 在任何文件夾,空白處,右鍵。如果看到 “Git Bash Here”&#xf…

Swift傻傻分不清楚系列(十一)類和結構體

本頁包含內容: 類和結構體對比結構體和枚舉是值類型類是引用類型類和結構體的選擇字符串(String)、數組(Array)、和字典(Dictionary)類型的賦值與復制行為 類和結構體是人們構建代碼所用的一種通用且靈活的構造體。我們可以使用完全相同的語法規則來為類和結構體定義…

數據庫系統原理(第5章:數據庫編程)

一、存儲過程 概念:存儲過程是一組為了完成某項特定功能的SQL語句集, 其實質就是一段存儲在數據庫中的代碼。 它可以由聲明式的sql語句和過程式sql語句組成。 特點: 可增強SQL語言的功能和靈活性良好的封裝性高性能可減少網絡流量可作為一種安…

科學-中醫:儒醫

ylbtech-科學-中醫:儒醫"儒醫"是一種歷史悠久的社會文化現象。闡釋了"儒醫"的三重境界,即良醫、大醫、圣醫。"良醫"注重技,屬于知識論,追求的是"真";"大醫"注重德,屬于道德論,追求的是"善";"圣醫…

Ajax — 第六天

Ajax-06 GET和POST的區別 字面意思不同 GET 是獲取意思。想從服務器獲取數據,用GET方式的請求POST是郵遞、郵寄意思。如果提交數據到服務器,用POST方式 請求參數位置不同 GET 請求參數會和url拼接到一起,形如 api/getbooks?id2&age3PO…

iOS Tips 模擬器屏幕截圖

當我們發布app到AppStore的時候,在itunes connect里面,蘋果官方要求我們提供各種尺寸的屏幕截圖。由于受到硬件條件的限制,我們不可能在每個真實的物理機器上測試并截圖,相反如果我們能直接在模擬器上進行屏幕截圖的話&#xff0c…

數據庫系統原理(第6章:數據庫安全與保護)

一、數據庫完整性 數據庫完整性是指數據庫中數據的正確性和相容性。 完整性約束條件的作用對象 列級約束: 包括對列的類型、取值范圍、精度等的約束元組約束: 指元組中各個字段之間的相互約束表級約束: 指若干元組、關系之間的聯系的約束定義…

.net core WebApi 使用Swagger生成API文檔

關于 Swagger Swagger能成為最受歡迎的REST APIs文檔生成工具之一,有以下幾個原因: Swagger 可以生成一個具有互動性的API控制臺,開發者可以用來快速學習和嘗試API。Swagger 可以生成客戶端SDK代碼用于各種不同的平臺上的實現。Swagger 文件可…

Git — 初體驗

準備工作 版本管理軟件 作用 記錄代碼的版本實現多人協作 分類 集中式,典型代表 SVN分布式,典型代表 Git 注冊遠程倉庫賬號 遠程倉庫相當于中央服務器我們需要在github上或碼云上注冊一個賬號,用于創建遠程倉庫使用注冊的時候&#xff0…

iOS CoreTelephony框架介紹與使用案列

昨晚看一篇文章時看到了私有API這個詞,貌似開發者對私有API的使用很反感于是果斷百度谷歌,以下是Stackoverflow中關于Private Frameworks的一個解釋: Private frameworks are frameworks which you are not allowed to use. They are not exp…

JS數組的迭代器方法

迭代器forEachevery一、迭代器方法 迭代器方法, 這些方法對數組中的每一個元素應用一個函數,可以返回一個值,一組值或一個新數組。 不生成新數組的迭代器方法 1.forEach() forEach()輸出 forEach輸出結果2.every() 該方法按接受一個返回值為布…

Git 筆記

三個區域 下面三個區域,是Git虛擬的區域,看不到,摸不著。 工作區 工作區,指的是使用Git管理后的文件,這些文件顯示在磁盤上,供我們使用或修改的區域。所以,粗略的說,項目文件夾就是…

C# webapi 上傳下載圖片

客戶端上傳文件 string url url "webUploadFile";Uri server new Uri(url);HttpClient httpClient new HttpClient();MultipartFormDataContent multipartFormDataContent new MultipartFormDataContent();StreamContent streamConent new StreamContent(new F…

OC-@dynamic 關鍵字

dynamic這個關鍵詞,通常是用不到的。 它與synthesize的區別在于: 使用synthesize編譯器會確實的產生getter和setter方法,而dynamic僅僅是告訴編譯器這兩個方法在運行期會有的,無需產生警告。 假設有這么個場景,B類&…

git -- 練習的筆記

gitgitee.com:my_exercises/my_exercises.githttps://gitee.com/my_exercises/my_exercises/invite_link?invite3ab56c724a0aed34ae2bd193ce87e741e67fe05ee029cc01b7993663152babc57d76203fdafbbb42e766b0d826817bc91.在任意位置右鍵打開 2.初始化設置 3.添加遠程倉庫地址 4.…

Swift傻傻分不清楚系列(十二) 屬性

本頁包含內容: 存儲屬性(Stored Properties)計算屬性(Computed Properties)屬性觀察器(Property Observers)全局變量和局部變量(Global and Local Variables)類型屬性&a…

GIT — 使用回顧

回顧Git的使用 記錄每次的變更 工作區 --> 暫存區 git add . / git add 文件 文件夾 .... 工作區 --> 暫存區/本地倉庫 前提條件:文件曾經被添加到暫存區或提交到倉庫git commit -a -m 提交說明 暫存區 --> 本地倉庫 git commit -m 提交說明 / git commi…

獲取兩個數百分比的值

1 /**2 * 獲取兩個數百分比的值3 * 4 * param num1 5 * param num26 * param retain 保留小數位數7 * return8 */9 public static String numberFormat(int num1, int num2, int retain) { 10 NumberFormat numberFormat …

iOS AVAudioPlayer和AVAudioPlayerDelegate-音頻播放處理中斷

學習總是在進行。 一、AVAudioPlayer如何處理中斷 AVAudioPlayer類提供了代理方法&#xff0c;用來處理當播放音頻文件時&#xff0c;發生來電、鬧鐘等事件。設置代理并遵守AVAudioPlayerDelegate協議,<span style"font-family: Arial, Helvetica, sans-serif;"&g…