第37次文章:數據庫基本語法

  • 2019 年 10 月 8 日
  • 筆記

本周我們結束了最為複雜的dql語法,完成最後一個進階9—聯合查詢,然後進入剩下的dml和ddl語法介紹。一起來看看吧~


進階9:聯合查詢

一、含義

union:合併、聯合,將多次查詢結果合併成一個結果

二、語法

查詢語句1

union【all】

查詢語句2

union【all】

三、意義

1、將一條比較複雜的查詢語句拆分成多條語句

2、適用於查詢多個表的時候,查詢的列基本是一致的

四、特點

1、要求多條查詢語句的查詢列數必須一致

2、要求多條查詢語句的查詢的各列類型、順序最好一致

3、union去重,union all包含重複項

以上就結束了查詢語言(dql)的全部介紹,下面我們對其進行一個基本總結,將所有學到的dql語法匯總起來,寫出一個模板,以後需要用到哪一條直接往裏面放相應的查詢語句即可。具體如下:

select 查詢列表

from 表1 別名 連接類型 join 表2 別名 on 連接條件

where 篩選條件

group by 分組條件

having 分組後篩選條件

order by 排序條件

limit 起始索引,條目數

union 聯合查詢

DML語言

DML語言稱為數據管理語言,主要負責對表格中的數據進行增刪改操作。

一、插入

1、方式一

(1)語法:insert into 表名(字段名,…) values(值,….);

(2)特點:

  • 要求的類型的字段的類型要一致或兼容
  • 字段的個數和順序不一定與原始表中的字段個數和順序一致,但必須保證值和字段一一對應
  • 假如表中有可以為null的字段,注意可以通過以下兩種方式插入null值
  • 字段名和值都省略
  • 字段寫,值使用null
  • 字段和值的個數必須一致
  • 段名可以省略,默認所有列
2、方式二

語法:insert into 表名 set 字段=值,字段=值,…;

3、兩種方式的區別

(1)方式一支持一次性插入多行,語法如下:

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

(2)方式一支持子查詢,語法如下:

insert into 表名 查詢語句;

4、案例

我們根據兩種方式向一個beauty表格中插入數據,beauty表格中的各個屬性如下所示:

對於各個屬性參數的插入,具體語法如下:

#1、方式一支持插入多行,方式二不支持  INSERT INTO beauty  VALUES (23,'楊冪1','女','1985-10-1','19988886666',NULL,2)  ,(24,'楊冪2','女','1985-10-1','19988886666',NULL,2)  ,(25,'楊冪3','女','1985-10-1','19988886666',NULL,2)  #2、方式一支持子查詢,方式二不支持  INSERT INTO beauty(id,NAME,phone)  SELECT 26,'宋茜','5436546';  #3、方式二插入數據  INSERT INTO beauty  SET id=17,NAME='劉亦菲',phone='999'

tips:在上面的3條插入語句中,我們僅僅展示一下語法輸入。在表格屬性中我們看到不可以為空的屬性有:id、name、phone。所以這三個屬性是我們必須插入的值。

第一條語句中,我們沒有填寫需要添加的屬性,所以默認的所有屬性都需要添加進去,同時,我們使用到了多行插入。

第二條語句中,我們填寫了需要插入的屬性,所以我們需要對應着屬性來插入相關的值,與此同時,我們使用到了子查詢語句,在select語句後面對應的插入參數值。

第三條語句中,我們使用的是方式二的set方法來,此時在表名後面不用填寫需要插入的屬性,因為set後面的語法中,已經直接填寫了對應的屬性。

總體而言,方式二較為簡單,但是由於只能單行插入,所以使用的較少,一般都是採取方式一的語法進行操作。

二、修改

1、修改單表的記錄

update 表1 別名 連接類型 join 表2 別名 on 連接條件

set 字段=值,字段=值 【where 篩選條件】;

2、修改多表的記錄【補充】

(1)sql92語法:update 表1 別名,表2 別名set 列=值,….where 連接條件and 篩選條件

(2)sql99語法:update 表1 別名 【join type】 join 表2 別名 on 連接條件set 列=值,….where 篩選條件

3、案例
#1.修改單表中的記錄  #案例:修改beauty表中姓楊的女神電話為11122233344  UPDATE beauty  SET phone='11122233344'  WHERE NAME LIKE '楊%';  #2.修改多表的記錄  #案例:修改張無忌的女朋友的手機號114  UPDATE beauty b JOIN boys bo ON b.`boyfriend_id`=bo.`id`  SET b.`phone`=114  WHERE bo.`boyName`='張無忌';

tips:在上面的代碼中,我們主要展示對表中數據的修改語法。查看這段代碼,我們可以將其類比為插入語法中的方式二,使用set關鍵字,將特定的列值修改為設定的參數值。對比單表修改和多表修改,我們可以發現,不同點就在於多表中有一個多表連接,連接語法與我們在dql語言中使用的類似。

三、刪除

1、方式一

使用delete

(1)刪除單表的記錄

delete from 表名 【where 篩選條件】【limit 條目數】

(2)級聯刪除【補充】

delete 別名1,別名2 from 表1 別名 連接類型 join 表2 別名 on 連接條件

【where 篩選條件】

2、方式二

使用truncate

語法:truncate table 表名

3、案例
#1.單表刪除  #案例:刪除手機號以9結尾的女神信息  DELETE FROM beauty WHERE phone LIKE '%9';  #2.級聯刪除  #案例:刪除黃曉明的信息以及他女朋友的信息  DELETE b,bo  FROM beauty b JOIN boys bo ON b.`boyfriend_id`=bo.`id`  WHERE bo.`boyName`='黃曉明';  #方式二:truncate語句  #無法添加篩選條件,直接將整張表清空  TRUNCATE TABLE boys;

tips:對於單表刪除,直接查看語句就會一目了然,我們不再贅述。主要提一下級聯刪除,級聯刪除還是屬於多表刪除,使用到了多表互連的語法。在對表中數據進行刪除時,需要注意一點,delete後面,需要加上需要刪除的表,因為語法中涉及到了多表,而我們可能只是刪除其中某個表格中的數據,其他表格僅僅是用於篩選,如果需要刪除所有表格中符合篩選條件的數據,那麼我們就需要將每個表名放在delete關鍵字後面。

對於truncate語句,其默認的是將整個表格的數據全部清空,所以該語法中不需要加入篩選條件。對於兩種刪除語法的區別,我們在下面將會加以介紹。

4、兩種方式的區別【面試題】

(1)truncate刪除後,如果再插入,標識列從1開始;delete刪除後,如果再插入,標識列從斷點開始

(2)delete可以添加篩選條件;truncate不可以添加篩選條件

(3)truncate效率較高,delete效率較低

(4)truncate沒有返回值,delete有返回值

(5)truncate是徹底刪除,不能回滾,delete可以回滾

DDL語言

date define language數據定義語言,主要負責對數據庫和表的結構進行修改,而不是對表中數據進行修改。

一、庫的管理

1、創建庫

create database 【if not exists】 庫名 【character set 字符集】;

2、修改庫

alter database 庫名 character set 字符集;

3、刪除庫

drop database 【if exists】 庫名;

4、案例
#1、創建庫Books  CREATE DATABASE IF NOT EXISTS books;  #2、庫的修改  #更改庫的字符集  ALTER DATABASE books CHARACTER SET utf8;  #3、庫的刪除  DROP DATABASE IF EXISTS books;

tips:在一般的工程中,我們不會對庫有什麼具體的修改,因為對庫的修改容易導致整個數據的不穩定。數據庫的命名以及字符集等等屬性設置,一般在創建的初始時就需要被設置好。在以後的運維過程中基本也不會有什麼變動,可能變化的主要就是數據庫的字符集。所以在對庫的操作中,我們主要介紹了創建和刪除,以及對數據庫字符集的修改。對比後面對錶的管理,使用的關鍵字也是一樣的!

二、表的管理

1、創建表

create table 【if not exists】 表名(

字段名 數據類型 【約束】,

……

字段名 數據類型 【約束】

);

2、修改表

(1)添加新列

alter table 表名 add column 列名 類型 【first|after 字段名】;

(2)修改列的類型

alter table 表名 modify column 舊字段名 新類型 【新約束】;

(3)對字段重命名

alter table 表名 舊字段名 change column 新字段名 數據類型

(4)刪除列

alter table 表名 drop column 列名;

(5)修改表名

alter table 表名 rename 【to】 新表名

3、刪除表

drop table 【if exists】 表名;

4、複製表

(1)僅僅複製表的結構

create table 表名1 like 表名2

(2)複製表的結構+數據

create table 表名1

select * from 表名2 【where 篩選】

5、案例
#1、表的創建  #案例:創建表Book  CREATE TABLE IF NOT EXISTS book(    id INT,#圖書編號    bName VARCHAR(20),#圖書的名稱    price DOUBLE,#價格    authorId INT,#作者編號    publishDate DATETIME#出版日期  );  #案例:創建表author  CREATE TABLE IF NOT EXISTS author(    id INT,#作者id    au_name VARCHAR(20),#作者姓名    nation VARCHAR(20)#國籍  )    #2.表的修改  #(1)修改列名  ALTER TABLE book CHANGE COLUMN publishDate puDate DATETIME;  #(2)修改列的類型或約束  ALTER TABLE book MODIFY COLUMN pudate TIMESTAMP;  #(3)添加列  ALTER TABLE author ADD COLUMN annual DOUBLE;  #(4)刪除列  ALTER TABLE author DROP COLUMN annual;  #(5)修改表名  ALTER TABLE author RENAME book_author;    #3.表的刪除  DROP TABLE IF EXISTS book_author;    #4.表的複製  INSERT INTO author  VALUES(1,'村上春樹','日本'),(2,'莫言','中國'),(3,'金庸','中國'),(4,'古龍','中國');  #(1)僅僅複製表的結構  CREATE TABLE copy LIKE author;  #(2)複製表的結構+數據  CREATE TABLE copy2 SELECT * FROM author;  #(3)僅僅複製表的部分數據  CREATE TABLE copy3 SELECT * FROM author WHERE nation = '中國';  #(4)僅僅複製表的部分結構,不複製數據  CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 0;

tips:在上面對錶的增刪改中,全都是按照上述的基本語法進行操作,修改列的時候,一定要注意將列的類型重新更新一下。還有一點就是表的複製,通過上面的案例可以發現一點,表的複製,使用的是create關鍵字,在表的後面可以添加子查詢語句,有點類似於dml語句中的插入語法。

三、數據類型

1、數值型

(1)整型

tinyint、smallint、mediumint、int、integer、bigint

特點:

  • 都可以設置無符號和有符號,默認有符號,通過unsigned設置無符號
  • 如果超出了範圍,會報out of range異常,插入臨界值
  • 長度可以不指定,默認會有一個長度

長度代表顯示的最大寬度,如果不夠則左邊用0填充,但需要搭配zerofill,並且默認變為無符號整型。

tips:當設置為無符號時,插入負數,將會在數據庫中用0進行填充。

(2)浮點型

定點數:decimal(M,D)

浮點數:

float(M,D)

double(M,D)

特點:

  • M代表整數部位+小數部位的個數,D代表小數部位
  • 如果超出範圍,則報out of range 異常,並且插入臨界值
  • M和D都可以省略,但對於定點數,M默認為10,D默認為0,如果是float和double,則會根據插入的數值的精度來決定精度。
  • 如果精度要求較高,則優先考慮使用定點數。如:貨幣運算等則考慮使用。

tips:double所佔位元組數為8,float所佔位元組數為4,無其他區別。

2、字符型

char、varchar、binary、varbinary、enum、set、text、blob

char:固定長度的字符,寫法為char(M),最大長度不能超過M,其中M可以省略,默認為1

varchar:可變長度的字符,寫法為varchar(M),最大長度不能超過M,其中M不可以省略

tips:對於char和varchar兩種類型,需要根據實際情況進行選擇。當某一列確定為性別或學號等等信息時,已經可以知道其長度,此時應該選擇char,可以佔用更小的內存空間。

3、日期型

year年

date日期

time時間

datetime 日期+時間 8位元組

timestamp 日期+時間 4位元組 比較容易受時區,語法模式、版本的影響,更能反映當前時區的真實時間

tips:timestamp可以根據所在時區的不同,自動的將存儲的時間轉換為對應時區的時間,所以,timestamp類型所反映的時間更加精準。

四、常見的約束

1、含義

一種限制,用於限制表中的數據,為了保證表中的數據的準確和可靠

2、分類

(1)not null :非空,用於保證該字段的值不能為空。比如姓名,學號等(2)default:默認,用於保證該字段有默認值。比如性別

(3)primary key:主鍵,用於保證該字段的值具有唯一性,並且非空。比如學號、員工編號等

(4)unique:唯一,用於保證該字段的值具有唯一性,可以為空。比如座位號(5)check:檢查約束【mysql中不支持】。比如年齡。性別

(6)foreign key:外鍵。用於限制兩個表的關係,用於保證該字段的值必須來自於主表的關聯列的值。在從表添加外加約束,用於引用主表中某列的值。比如學生表的專業編號

3、添加約束

(1)添加約束的時機

  • 創建表時
  • 修改表時

(2)約束的添加分類

  • 列級約束:六大約束語法上都支持,但是外鍵約束沒有效果
  • 表級約束:除了非空、默認,其他的都支持
4、案例
#一、創建表時添加約束  #1、添加列級約束  /*  語法  直接在字段名和類型後面追加 約束類型即可。  只支持:默認、非空、主鍵、唯一  */  CREATE TABLE stuinfo(    id INT PRIMARY KEY,#主鍵    stuName VARCHAR(20) NOT NULL,#非空    gender CHAR(1) CHECK(gender='男' OR gender='女'),#檢查    seat INT UNIQUE,#唯一    age INT DEFAULT 18,#默認約束    majorId INT REFERENCES major(majorid)#外鍵  );  #2.添加表級約束  /*  語法:在各個字段的最下面  【constraint 約束名】 約束類型(字段名)  */  DROP TABLE IF EXISTS stuinfo;  CREATE TABLE stuinfo(    id INT,    stuname VARCHAR(20),    gender CHAR(1),    seat INT,    age INT,    majorid INT,    CONSTRAINT pk PRIMARY KEY(id),#主鍵    CONSTRAINT uq UNIQUE(seat),#唯一鍵    CONSTRAINT ck CHECK(gender='男' OR gender='女'),#檢查    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(majorid)#外鍵  );    #二、修改約束  /*  1、添加列級約束  alter table 表名 modify column 字段名 字段類型 新約束;  2、添加表級約束  alter table 表名 add 【constraint 約束名】 約束類型(字段名) 【外鍵的引用】;  */  #1、添加非空約束  ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;  #2、添加默認約束  ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;  #3、添加主鍵  #(1)列級約束  ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;  #(2)表級約束  ALTER TABLE stuinfo ADD PRIMARY KEY(id);  #4、添加唯一  #(1)列級約束  ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;  #(2)表級約束  ALTER TABLE stuinfo ADD UNIQUE(seat);  #5、添加外鍵  ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(majorid);    #三、修改表時刪除約束  #1、刪除非空約束  ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20);  #2、刪除默認約束  ALTER TABLE stuinfo MODIFY COLUMN age INT;  #3、刪除主鍵  ALTER TABLE stuinfo DROP PRIMARY KEY;  #4、刪除唯一  ALTER TABLE stuinfo DROP INDEX seat;  #5、刪除外鍵  ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

tips:在上面的案例中,我們將每種情況都列出了相應的案例。最主要的語法並沒有特別大的改變,主要是反覆修改相應的約束關鍵字。在列級修改和表級修改中, 主要在於約束類型的限制。