久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      本篇文章給大家?guī)鞰ySQL的基礎(chǔ)的相關(guān)知識整理分享,知識點雖然簡單,但是比較多,方便自己以后查找,希望對大家有幫助。

      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      一、SQL簡述

      1.SQL的概述

      Structure Query Language(結(jié)構(gòu)化查詢語言)簡稱SQL,它被美國國家標準局(ANSI)確定為關(guān)系型數(shù)據(jù)庫語言的美國標準,后被國際化標準組織(ISO)采納為關(guān)系數(shù)據(jù)庫語言的國際標準。數(shù)據(jù)庫管理系統(tǒng)可以通過SQL管理數(shù)據(jù)庫;定義和操作數(shù)據(jù),維護數(shù)據(jù)的完整性和安全性。

      2.SQL的優(yōu)點

      1、簡單易學,具有很強的操作性
      2、絕大多數(shù)重要的數(shù)據(jù)庫管理系統(tǒng)均支持SQL
      3、高度非過程化;用SQL操作數(shù)據(jù)庫時大部分的工作由DBMS自動完成

      3.SQL的分類

      1、DDL(Data Definition Language) 數(shù)據(jù)定義語言,用來操作數(shù)據(jù)庫、表、列等; 常用語句:CREATE、 ALTER、DROP
      2、DML(Data Manipulation Language) 數(shù)據(jù)操作語言,用來操作數(shù)據(jù)庫中表里的數(shù)據(jù);常用語句:INSERT、 UPDATE、 DELETE
      3、DCL(Data Control Language) 數(shù)據(jù)控制語言,用來操作訪問權(quán)限和安全級別; 常用語句:GRANT、DENY
      4、DQL(Data Query Language) 數(shù)據(jù)查詢語言,用來查詢數(shù)據(jù) 常用語句:SELECT

      二、數(shù)據(jù)庫的三大范式

      1、第一范式(1NF)是指數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)線;也就是說:每列的值具有原子性,不可再分割。
      2、第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來得,滿足第二范式(2NF)必須先滿足第一范式(1NF)。如果表是單主鍵,那么主鍵以外的列必須完全依賴于主鍵;如果表是復合主鍵,那么主鍵以外的列必須完全依賴于主鍵,不能僅依賴主鍵的一部分。
      3、第三范式(3NF)是在第二范式的基礎(chǔ)上建立起來的,即滿足第三范式必須要先滿足第二范式。第三范式(3NF)要求:表中的非主鍵列必須和主鍵直接相關(guān)而不能間接相關(guān);也就是說:非主鍵列之間不能相關(guān)依賴。

      三、數(shù)據(jù)庫的數(shù)據(jù)類型

      使用MySQL數(shù)據(jù)庫存儲數(shù)據(jù)時,不同的數(shù)據(jù)類型決定了 MySQL存儲數(shù)據(jù)方式的不同。為此,MySQL數(shù)據(jù)庫提供了多種數(shù)據(jù)類型,其中包括整數(shù)類型、浮點數(shù)類型、定點 數(shù)類型、日期和時間類型、字符串類型、二進制…等等數(shù)據(jù)類型。

      1.整數(shù)類型

      根據(jù)數(shù)值取值范圍的不同MySQL 中的整數(shù)類型可分為5種,分別是TINYINT、SMALUNT、MEDIUMINT、INT和 BIGINT。下圖列舉了 MySQL不同整數(shù)類型所對應的字節(jié)大小和取值范圍而最常用的為INT類型的,

      數(shù)據(jù)類型 字節(jié)數(shù) 無符號數(shù)的取值范圍 有符號數(shù)的取值范圍
      TINYINT 1 0~255 -128~127
      SMALLINT 2 0~65535 -32768~32768
      MEDIUMINT 3 0~16777215 -8388608~8388608
      INT 4 0~4294967295 -2147483648~ 2147483648
      BIGINT 8 0~18446744073709551615 -9223372036854775808~9223372036854775808

      2.浮點數(shù)類型和定點數(shù)類型

      在MySQL數(shù)據(jù)庫中使用浮點數(shù)和定點數(shù)來存儲小數(shù)。浮點數(shù)的類型有兩種:單精度浮點數(shù)類型(FLOAT)和雙精度浮點數(shù)類型(DOUBLE)。而定點數(shù)類型只有一種即DECIMAL類型。下圖列舉了 MySQL中浮點數(shù)和定點數(shù)類型所對應的字節(jié)大小及其取值范圍:

      數(shù)據(jù)類型 字節(jié)數(shù) 有符號的取值范圍 無符號的取值范圍
      FLOAT 4 -3.402823466E+38~-1.175494351E-38 0和1.175494351E-38~3.402823466E+38
      DOUBLE 8 -1.7976931348623157E+308~2.2250738585072014E-308 0和2.2250738585072014E-308~1.7976931348623157E+308
      DECIMAL(M,D) M+2 -1.7976931348623157E+308~2.2250738585072014E-308 0和2.2250738585072014E-308~1.7976931348623157E+308

      從上圖中可以看出:DECIMAL類型的取值范圍與DOUBLE類型相同。但是,請注意:DECIMAL類型的有效取值范圍是由M和D決定的。其中,M表示的是數(shù)據(jù)的長 度,D表示的是小數(shù)點后的長度。比如,將數(shù)據(jù)類型為DECIMAL(6,2)的數(shù)據(jù)6.5243 插人數(shù)據(jù)庫后顯示的結(jié)果為6.52

      3.字符串類型

      在MySQL中常用CHAR 和 VARCHAR 表示字符串。兩者不同的是:VARCHAR存儲可變長度的字符串。
      當數(shù)據(jù)為CHAR(M)類型時,不管插入值的長度是實際是多少它所占用的存儲空間都是M個字節(jié);而VARCHAR(M)所對應的數(shù)據(jù)所占用的字節(jié)數(shù)為實際長度加1

      插入值 CHAR(3) 存儲需求 VARCHAR(3) 存儲需求
      ‘’ ‘’ 3個字節(jié) ‘’ 1個字節(jié)
      ‘a(chǎn)’ ‘a(chǎn)’ 3個字節(jié) ‘a(chǎn)’ 2個字節(jié)
      ‘a(chǎn)b’ ‘a(chǎn)b’ 3個字節(jié) ‘a(chǎn)b’ 3個字節(jié)
      ‘a(chǎn)bc’ ‘a(chǎn)b’ 3個字節(jié) ‘a(chǎn)bc’ 4個字節(jié)
      ‘a(chǎn)bcd’ ‘a(chǎn)b’ 3個字節(jié) ‘a(chǎn)bc’ 4字節(jié)

      4.字符串類型

      文本類型用于表示大文本數(shù)據(jù),例如,文章內(nèi)容、評論、詳情等,它的類型分為如下4種:

      數(shù)據(jù)類型 儲存范圍
      TINYTEXT 0~255字節(jié)
      TEXT 0~65535字節(jié)
      MEDIUMTEXT 0~16777215字節(jié)
      LONGTEXT 0~4294967295字節(jié)

      5.日期與時間類型

      MySQL提供的表示日期和時間的數(shù)據(jù)類型分別是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。下圖列舉了日期和時間數(shù)據(jù)類型所對應的字節(jié)數(shù)、取值范圍、日期格式以及零值:

      數(shù)據(jù)類型 字節(jié)數(shù) 取值范圍 日期格式 零值
      YEAR 1 1901~2155 YYYY 0000
      DATE 4 1000-01-01~9999-12-31 YYYY-MM-DD 0000-00-00
      TIME 3 -838:59:59~ 838:59:59 HH:MM:SS 00:00:00
      DATETIME 8 1000-01-01 00:00:00~9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 0000-00-00 00:00:00
      TIMESTAMP 4 1970-01-01 00:00:01~2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 0000-00-00 00:00:00

      5.1 YEAR類型

      YEAR類型用于表示年份,在MySQL中,可以使用以下三種格式指定YEAR類型 的值。
      1、使用4位字符串或數(shù)字表示,范圍為’1901’—'2155’或1901—2155。例如,輸人 ‘2019’或2019插人到數(shù)據(jù)庫中的值均為2019。
      2、使用兩位字符串表示,范圍為’00’—‘99’。其中,‘00’—'69’范圍的值會被轉(zhuǎn)換為 2000—2069范圍的YEAR值,‘70’—'99’范圍的值會被轉(zhuǎn)換為1970—1999范圍的YEAR 值。例如,輸人’19’插人到數(shù)據(jù)庫中的值為2019。
      3、使用兩位數(shù)字表示,范圍為1—99。其中,1—69范圍的值會被轉(zhuǎn)換為2001— 2069范圍的YEAR值,70—99范圍的值會被轉(zhuǎn)換為1970—1999范圍的YEAR值。例 如,輸人19插入到數(shù)據(jù)庫中的值為2019。
      請注意:當使用YEAR類型時,一定要區(qū)分’0’和0。因為字符串格式的’0’表示的YEAR值是2000而數(shù)字格式的0表示的YEAR值是0000。

      5.2 TIME類型

      TIME類型用于表示時間值,它的顯示形式一般為HH:MM:SS,其中,HH表示小時, MM表示分,SS表示秒。在MySQL中,可以使用以下3種格式指定TIME類型的值。
      1、以’D HH:MM:SS’字符串格式表示。其中,D表示日可取0—34之間的值, 插人數(shù)據(jù)時,小時的值等于(DX24+HH)。例如,輸入’2 11:30:50’插人數(shù)據(jù)庫中的日期為59:30:50。
      2、以’HHMMSS’字符串格式或者HHMMSS數(shù)字格式表示。 例如,輸人’115454’或115454,插入數(shù)據(jù)庫中的日期為11:54:54
      3、使用CURRENT_TIME或NOW()輸人當前系統(tǒng)時間。

      5.3 DATETIME類型

      DATETIME類型用于表示日期和時間,它的顯示形式為’YYYY-MM-DD HH: MM:SS’,其中,YYYY表示年,MM表示月,DD表示日,HH表示小時,MM表示分,SS 表示秒。在MySQL中,可以使用以下4種格式指定DATETIME類型的值。
      ?以’YYYY-MM-DD HH:MM:SS’或者’YYYYMMDDHHMMSS’字符串格式表示的日期和時間,取值范圍為’1000-01-01 00:00:00’—‘9999-12-3 23:59:59’。例如,輸人’2019-01-22 09:01:23’或 ‘20140122_0_90123’插人數(shù)據(jù)庫中的 DATETIME 值都為 2019-01-22 09:01:23。
      1、以’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和時間,其中YY表示年,取值范圍為’00’—‘99’。與DATE類型中的YY相同,‘00’— '69’范圍的值會被轉(zhuǎn)換為2000—2069范圍的值,‘70’—'99’范圍的值會被轉(zhuǎn)換為1970—1999范圍的值。
      2、以YYYYMMDDHHMMSS或者YYMMDDHHMMSS數(shù)字格式表示的日期 和時間。例如,插入20190122090123或者190122090123,插人數(shù)據(jù)庫中的DATETIME值都 為 2019-01-22 09:01:23。
      3、使用NOW來輸人當前系統(tǒng)的日期和時間。

      5.4 TIMESTAMP類型

      TIMESTAMP類型用于表示日期和時間,它的顯示形式與DATETIME相同但取值范圍比DATETIME小。在此,介紹幾種TIMESTAMP類型與DATATIME類型不同的形式:
      1、使用CURRENT_TIMESTAMP輸人系統(tǒng)當前日期和時間。
      2、輸人NULL時系統(tǒng)會輸人系統(tǒng)當前日期和時間。
      3、無任何輸人時系統(tǒng)會輸入系統(tǒng)當前日期和時間。

      6.二進制類型

      在MySQL中常用BLOB存儲二進制類型的數(shù)據(jù),例如:圖片、PDF文檔等。BLOB類型分為如下四種:

      數(shù)據(jù)類型 儲存范圍
      TINYBLOB 0~255字節(jié)
      BLOB 0~65535字節(jié)
      MEDIUMBLOB 0~16777215字節(jié)
      LONGBLOB 0~4294967295字節(jié)

      四、數(shù)據(jù)庫、數(shù)據(jù)表的基本操作

      1.數(shù)據(jù)庫的基本操作

      MySQL安裝完成后,要想將數(shù)據(jù)存儲到數(shù)據(jù)庫的表中,首先要創(chuàng)建一個數(shù)據(jù)庫。創(chuàng) 建數(shù)據(jù)庫就是在數(shù)據(jù)庫系統(tǒng)中劃分一塊空間存儲數(shù)據(jù),語法如下:

      create database 數(shù)據(jù)庫名稱;

      創(chuàng)建一個叫db1的數(shù)據(jù)庫MySQL命令:

      -- 創(chuàng)建一個叫db1的數(shù)據(jù)庫show create database db1;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      創(chuàng)建數(shù)據(jù)庫后查看該數(shù)據(jù)庫基本信息MySQL命令:

      show create database db1;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      刪除數(shù)據(jù)庫MySQL命令:

      drop database db1;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      查詢出MySQL中所有的數(shù)據(jù)庫MySQL命令:

      show databases;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      將數(shù)據(jù)庫的字符集修改為gbk MySQL命令:

      alter database db1 character set gbk;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      切換數(shù)據(jù)庫 MySQL命令:

      use db1;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      查看當前使用的數(shù)據(jù)庫 MySQL命令:

      select database();

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.數(shù)據(jù)表的基本操作

      數(shù)據(jù)庫創(chuàng)建成功后可在該數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表(簡稱為表)存儲數(shù)據(jù)。請注意:在操作數(shù)據(jù)表之前應使用“USE 數(shù)據(jù)庫名;”指定操作是在哪個數(shù)據(jù)庫中進行先關(guān)操作,否則會拋出“No database selected”錯誤。
      語法如下:

       create table 表名(          字段1 字段類型,          字段2 字段類型,          …          字段n 字段類型);

      2.1 創(chuàng)建數(shù)據(jù)表

      示例:創(chuàng)建學生表 MySQL命令:

       create table student(  id int,  name varchar(20),  gender varchar(10),  birthday date  );

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.2 查看數(shù)據(jù)表

      示例:查看當前數(shù)據(jù)庫中所有表 MySQL命令:

      show tables;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      示例:查表的基本信息 MySQL命令:

      show create table student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      示例:查看表的字段信息 MySQL命令:

      desc student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.3 修改數(shù)據(jù)表

      有時,希望對表中的某些信息進行修改,例如:修改表名、修改字段名、修改字段 數(shù)據(jù)類型…等等。在MySQL中使用alter table修改數(shù)據(jù)表.
      示例:修改表名 MySQL命令:

      alter table student rename to stu;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      示例:修改字段名 MySQL命令:

      alter table stu change name sname varchar(10);

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      示例:修改字段數(shù)據(jù)類型 MySQL命令:

      alter table stu modify sname int;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      示例:增加字段 MySQL命令:

      alter table stu add address varchar(50);

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      示例:刪除字段 MySQL命令:

      alter table stu drop address;

      運效果展示:

      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.4 刪除數(shù)據(jù)表

      語法:

      drop table 表名;

      示例:刪除數(shù)據(jù)表 MySQL命令:

      drop table stu;

      運行效果展示:

      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      五、數(shù)據(jù)表的約束

      為防止錯誤的數(shù)據(jù)被插入到數(shù)據(jù)表,MySQL中定義了一些維護數(shù)據(jù)庫完整性的規(guī)則;這些規(guī)則常稱為表的約束。常見約束如下:

      約束條件 說明
      PRIMARY KEY 主鍵約束用于唯一標識對應的記錄
      FOREIGN KEY 外鍵約束
      NOT NULL 非空約束
      UNIQUE 唯一性約束
      DEFAULT 默認值約束,用于設置字段的默認值

      以上五種約束條件針對表中字段進行限制從而保證數(shù)據(jù)表中數(shù)據(jù)的正確性和唯一性。換句話說,表的約束實際上就是表中數(shù)據(jù)的限制條件。

      1.主鍵約束

      主鍵約束即primary key用于唯一的標識表中的每一行。被標識為主鍵的數(shù)據(jù)在表中是唯一的且其值不能為空。這點類似于我們每個人都有一個身份證號,并且這個身份證號是唯一的。
      主鍵約束基本語法:

      字段名 數(shù)據(jù)類型 primary key;

      設置主鍵約束(primary key)的第一種方式
      示例:MySQL命令:

      create table student(id int primary key,name varchar(20));

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      設置主鍵約束(primary key)的第二·種方式
      示例:MySQL命令:

      create table student01(id intname varchar(20),primary key(id));

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.非空約束

      非空約束即 NOT NULL指的是字段的值不能為空,基本的語法格式如下所示:

      字段名 數(shù)據(jù)類型 NOT NULL;

      示例:MySQL命令:

      create table student02(id intname varchar(20) not null);

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      3.默認值約束

      默認值約束即DEFAULT用于給數(shù)據(jù)表中的字段指定默認值,即當在表中插入一條新記錄時若未給該字段賦值,那么,數(shù)據(jù)庫系統(tǒng)會自動為這個字段插人默認值;其基本的語法格式如下所示:

      字段名 數(shù)據(jù)類型 DEFAULT 默認值;

      示例:MySQL命令:

      create table student03(id int,name varchar(20),gender varchar(10) default 'male');

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      5.唯一性約束

      唯一性約束即UNIQUE用于保證數(shù)據(jù)表中字段的唯一性,即表中字段的值不能重復出現(xiàn),其基本的語法格式如下所示:

      字段名 數(shù)據(jù)類型 UNIQUE;

      示例:MySQL命令:

      create table student04(id int,name varchar(20) unique);

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      6.外鍵約束

      外鍵約束即FOREIGN KEY常用于多張表之間的約束?;菊Z法如下:

      -- 在創(chuàng)建數(shù)據(jù)表時語法如下:CONSTRAINT 外鍵名 FOREIGN KEY (從表外鍵字段) REFERENCES 主表 (主鍵字段)-- 將創(chuàng)建數(shù)據(jù)表創(chuàng)號后語法如下:ALTER TABLE 從表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY (從表外鍵字段) REFERENCES 主表 (主鍵字段);

      示例:創(chuàng)建一個學生表 MySQL命令:

      create table student05(id int primary key,name varchar(20));

      示例:創(chuàng)建一個班級表 MySQL命令:

      create table class(classid int primary key,studentid int);

      示例:學生表作為主表,班級表作為副表設置外鍵, MySQL命令:

      alter table class add constraint fk_class_studentid foreign key(studentid) references student05(id);

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      6.1 數(shù)據(jù)一致性概念

      大家知道:建立外鍵是為了保證數(shù)據(jù)的完整和統(tǒng)一性。但是,如果主表中的數(shù)據(jù)被刪除或修改從表中對應的數(shù)據(jù)該怎么辦呢?很明顯,從表中對應的數(shù)據(jù)也應該被刪除,否則數(shù)據(jù)庫中會存在很多無意義的垃圾數(shù)據(jù)。

      6.2 刪除外鍵

      語法如下:

      alter table 從表名 drop foreign key 外鍵名;

      示例:刪除外鍵 MySQL命令:

      alter table class drop foreign key fk_class_studentid;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      外鍵的那個字段不在了證明刪除成功了

      6.3 關(guān)于外鍵約束需要注意的細節(jié)

      1、從表里的外鍵通常為主表的主鍵
      2、從表里外鍵的數(shù)據(jù)類型必須與主表中主鍵的數(shù)據(jù)類型一致
      3、主表發(fā)生變化時應注意主表與從表的數(shù)據(jù)一致性問題

      六、數(shù)據(jù)表插入數(shù)據(jù)

      在MySQL通過INSERT語句向數(shù)據(jù)表中插入數(shù)據(jù)。在此,我們先準備一張學生表,代碼如下:

       create table student(  id int,  name varchar(30),  age int,  gender varchar(30)  );

      1. 為表中所有字段插入數(shù)據(jù)

      每個字段與其值是嚴格一一對應的。也就是說:每個值、值的順序、值的類型必須與對應的字段相匹配。但是,各字段也無須與其在表中定義的順序一致,它們只要與 VALUES中值的順序一致即可。
      語法如下:

      INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

      示例:向?qū)W生表中插入一條學生信息 MySQL命令:

      insert into student (id,name,age,gender) values (1,'bob',16,'male');

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2. 為表中指定字段插入數(shù)據(jù)

      語法如下:

      INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

      插入數(shù)據(jù)的方法基本和為表中所有字段插入數(shù)據(jù),一樣,只是需要插入的字段由你自己指定

      3. 同時插入多條記錄

      語法如下:

      INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;

      在該方式中:(字段名1,字段名2,…)是可選的,它用于指定插人的字段名;(值 1,值 2,…),(值 1,值 2,…)表示要插人的記錄,該記錄可有多條并且每條記錄之間用逗號隔開。
      示例:向?qū)W生表中插入多條學生信息 MySQL命令:

      insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male');

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      七、更新數(shù)據(jù)

      在MySQL通過UPDATE語句更新數(shù)據(jù)表中的數(shù)據(jù)。在此,我們將就用六中的student學生表

      1. UPDATE基本語法

      UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 條件表達式];

      在該語法中:字段名1、字段名2…用于指定要更新的字段名稱;值1、值 2…用于表示字段的新數(shù)據(jù);WHERE 條件表達式 是可選的,它用于指定更新數(shù)據(jù)需要滿足的條件

      2. UPDATE更新部分數(shù)據(jù)

      示例:將name為tom的記錄的age設置為20并將其gender設置為female MySQL命令:

      update student set age=20,gender='female' where name='tom';

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      3. UPDATE更新全部數(shù)據(jù)

      示例:將所有記錄的age設置為18 MySQL命令:

      update student set age=18;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      八、刪除數(shù)據(jù)

      在MySQL通過DELETE語句刪除數(shù)據(jù)表中的數(shù)據(jù)。在此,我們先準備一張數(shù)據(jù)表,代碼如下:

      -- 創(chuàng)建學生表  create table student(  id int,  name varchar(30),  age int,  gender varchar(30)  );  -- 插入數(shù)據(jù)  insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male'),(5,'sal',19,'female'),(6,'sun',20,'male'),(7,'sad',13,'female'),(8,'sam',14,'male');

      1. DELETE基本語法

      在該語法中:表名用于指定要執(zhí)行刪除操作的表;[WHERE 條件表達式]為可選參數(shù)用于指定刪除的條件。

      DELETE FROM 表名 [WHERE 條件表達式];

      2. DELETE刪除部分數(shù)據(jù)

      示例:刪除age等于14的所有記錄 MySQL命令:

      delete from student where age=14;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      3. DELETE刪除全部數(shù)據(jù)

      示例:刪除student表中的所有記錄 MySQL命令:

      delete from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      4. TRUNCATE和DETELE的區(qū)別

      TRUNCATE和DETELE都能實現(xiàn)刪除表中的所有數(shù)據(jù)的功能,但兩者也是有區(qū)別的:
      1、DELETE語句后可跟WHERE子句,可通過指定WHERE子句中的條件表達式只刪除滿足條件的部分記錄;但是,TRUNCATE語句只能用于刪除表中的所有記錄。
      2、使用TRUNCATE語句刪除表中的數(shù)據(jù)后,再次向表中添加記錄時自動增加字段的默認初始值重新由1開始;使用DELETE語句刪除表中所有記錄后,再次向表中添加記錄時自動增加字段的值為刪除時該字段的最大值加1
      3、DELETE語句是DML語句,TRUNCATE語句通常被認為是DDL語句

      九、MySQL數(shù)據(jù)表簡單查詢

      1.簡單查詢概述

      簡單查詢即不含where的select語句。在此,我們講解簡單查詢中最常用的兩種查詢:查詢所有字段和查詢指定字段。
      在此,先準備測試數(shù)據(jù),代碼如下:

      -- 創(chuàng)建數(shù)據(jù)庫DROP DATABASE IF EXISTS mydb;CREATE DATABASE mydb;USE mydb;-- 創(chuàng)建student表CREATE TABLE student (     sid CHAR(6),     sname VARCHAR(50),     age INT,     gender VARCHAR(50) DEFAULT 'male');-- 向student表插入數(shù)據(jù)INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

      2.查詢所有字段(方法不唯一只是舉例)

      查詢所有字段 MySQL命令:

      select * from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      3.查詢指定字段(sid、sname)

      查詢指定字段(sid、sname) MySQL命令:

      select sid,sname from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      4.常數(shù)的查詢

      在SELECT中除了書寫列名,還可以書寫常數(shù)??梢杂糜跇擞?br />常數(shù)的查詢?nèi)掌跇擞?MySQL命令:

      select sid,sname,'2021-03-02' from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      5.從查詢結(jié)果中過濾重復數(shù)據(jù)

      在使用DISTINCT 時需要注意:
      在SELECT查詢語句中DISTINCT關(guān)鍵字只能用在第一個所查列名之前。
      MySQL命令:

      select distinct gender from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      6.算術(shù)運算符(舉例加運算符)

      在SELECT查詢語句中還可以使用加減乘除運算符。
      查詢學生10年后的年齡 MySQL命令:

       select sname,age+10 from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      十、函數(shù)

      在此,先準備測試數(shù)據(jù),代碼如下:

      -- 創(chuàng)建數(shù)據(jù)庫DROP DATABASE IF EXISTS mydb;CREATE DATABASE mydb;USE mydb;-- 創(chuàng)建student表CREATE TABLE student (     sid CHAR(6),     sname VARCHAR(50),     age INT,     gender VARCHAR(50) DEFAULT 'male');-- 向student表插入數(shù)據(jù)INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

      1.聚合函數(shù)

      在開發(fā)中,我們常常有類似的需求:統(tǒng)計某個字段的最大值、最小值、 平均值等等。為此,MySQL中提供了聚合函數(shù)來實現(xiàn)這些功能。所謂聚合,就是將多行匯總成一行;其實,所有的聚合函數(shù)均如此——輸入多行,輸出一行。聚合函數(shù)具有自動濾空的功能,若某一個值為NULL,那么會自動將其過濾使其不參與運算。
      聚合函數(shù)使用規(guī)則:
      只有SELECT子句和HAVING子句、ORDER BY子句中能夠使用聚合函數(shù)。例如,在WHERE子句中使用聚合函數(shù)是錯誤的。
      接下來,我們學習常用聚合函數(shù)。

      1.1、count()

      統(tǒng)計表中數(shù)據(jù)的行數(shù)或者統(tǒng)計指定列其值不為NULL的數(shù)據(jù)個數(shù)
      查詢有多少該表中有多少人
      MySQL命令:

      select count(*) from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      1.2、max()

      計算指定列的最大值,如果指定列是字符串類型則使用字符串排序運算

      查詢該學生表中年紀最大的學生
      MySQL命令:

      select max(age) from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      1.3、min()

      計算指定列的最小值,如果指定列是字符串類型則使用字符串排序運算

      查詢該學生表中年紀最小的學生 MySQL命令:

      select sname,min(age) from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      1.4、sum()

      計算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型則計算結(jié)果為0
      查詢該學生表中年紀的總和 MySQL命令:

      select sum(age) from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      1.5、avg()

      計算指定列的平均值,如果指定列類型不是數(shù)值類型則計算結(jié)果為

      查詢該學生表中年紀的平均數(shù) MySQL命令:

      select avg(age) from student;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.其他常用函數(shù)

      這里我就不一一舉例了,基本混個眼熟,以后用到再細說

      2.1、時間函數(shù)

      SELECT NOW();SELECT DAY (NOW());SELECT DATE (NOW());SELECT TIME (NOW());SELECT YEAR (NOW());SELECT MONTH (NOW());SELECT CURRENT_DATE();SELECT CURRENT_TIME();SELECT CURRENT_TIMESTAMP();SELECT ADDTIME('14:23:12','01:02:01');SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);SELECT DATEDIFF('2019-07-22','2019-05-05');

      2.2、字符串函數(shù)

      --連接函數(shù)SELECT CONCAT ()--SELECT INSTR ();--統(tǒng)計長度SELECT LENGTH();

      2.3、數(shù)學函數(shù)

      -- 絕對值SELECT ABS(-136);-- 向下取整SELECT FLOOR(3.14);-- 向上取整SELECT CEILING(3.14);

      十一、條件查詢

      數(shù)據(jù)庫中存有大量數(shù)據(jù),我們可根據(jù)需求獲取指定的數(shù)據(jù)。此時,我們可在查詢語句中通過WHERE子句指定查詢條件對查詢結(jié)果進行過濾。
      在開始學習條件查詢之前,我們先準備測試數(shù)據(jù),代碼如下:

      -- 創(chuàng)建數(shù)據(jù)庫DROP DATABASE IF EXISTS mydb;CREATE DATABASE mydb;USE mydb;-- 創(chuàng)建student表CREATE TABLE student (     sid CHAR(6),     sname VARCHAR(50),     age INT,     gender VARCHAR(50) DEFAULT 'male');-- 向student表插入數(shù)據(jù)INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1012', 'lili', 14, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1013', 'wang', 15, 'female');

      1.使用關(guān)系運算符查詢

      在WHERE中可使用關(guān)系運算符進行條件查詢,常用的關(guān)系運算符如下所示:

      關(guān)系運算符 說明
      = 等于
      <> 不等于
      != 不等于
      < 小于
      <= 小于等于
      > 大于
      >= 大于等于

      查詢年齡等于或大于17的學生的信息 MySQL命令:

      select * from student where age>=17;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.使用IN關(guān)鍵字查詢

      IN關(guān)鍵字用于判斷某個字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,則將字段所在的記錄將査詢出來。

      查詢sid為S_1002和S_1003的學生信息 MySQL命令:

      select * from student where sid in ('S_1002','S_1003');

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      查詢sid為S_1001以外的學生的信息 MySQL命令:

      select * from student where sid not in ('S_1001');

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      3.使用BETWEEN AND關(guān)鍵字查詢

      BETWEEN AND用于判斷某個字段的值是否在指定的范圍之內(nèi)。如果字段的值在指定范圍內(nèi),則將所在的記錄將查詢出來
      查詢15到18歲的學生信息 MySQL命令:

      select * from student where age between 15 and 18;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      查詢不是15到18歲的學生信息 MySQL命令:

      select * from student where age not between 15 and 18;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      4.使用空值查詢

      在MySQL中,使用 IS NULL關(guān)鍵字判斷字段的值是否為空值。請注意:空值NULL不同于0,也不同于空字符串
      由于student表沒有空值就不演示查詢空值的了
      查詢sname不為空值的學生信息 MySQL命令:

      select * from student where sname is not null;

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      5.使用AND關(guān)鍵字查詢

      在MySQL中可使用AND關(guān)鍵字可以連接兩個或者多個查詢條件。
      查詢年紀大于15且性別為male的學生信息 MySQL命令:

      select * from student where age>15 and gender='male';

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      6.使用OR關(guān)鍵字查詢

      在使用SELECT語句查詢數(shù)據(jù)時可使用OR關(guān)鍵字連接多個査詢條件。在使用OR關(guān)鍵字時,只要記錄滿足其中任意一個條件就會被查詢出來
      查詢年紀大于15或者性別為male的學生信息 MySQL命令:

      select * from student where age>15 or gender='male';

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      7.使用LIKE關(guān)鍵字查詢

      MySQL中可使用LIKE關(guān)鍵字可以判斷兩個字符串是否相匹配

      7.1 普通字符串

      查詢sname中與wang匹配的學生信息 MySQL命令:

      select * from student where sname like 'wang';

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      7.2 含有%通配的字符串

      %用于匹配任意長度的字符串。例如,字符串“a%”匹配以字符a開始任意長度的字符串
      查詢學生姓名以li開始的記錄 MySQL命令:

      select * from student where sname like 'li%';

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      查詢學生姓名以g結(jié)尾的記錄 MySQL命令:

      select * from student where sname like '%g';

      運行效果展示:
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      查詢學生姓名包含s的記錄 MySQL命令:

      select * from student where sname like '%s%';

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      7.3 含有_通配的字符串

      下劃線通配符只匹配單個字符,如果要匹配多個字符,需要連續(xù)使用多個下劃線通配符。例如,字符串“ab_”匹配以字符串“ab”開始長度為3的字符串,如abc、abp等等;字符串“a__d”匹配在字符“a”和“d”之間包含兩個字符的字符串,如"abcd"、"atud"等等。
      查詢學生姓名以zx開頭且長度為4的記錄 MySQL命令:

      select * from student where sname like 'zx__';

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      查詢學生姓名以g結(jié)尾且長度為4的記錄 MySQL命令:

      select * from student where sname like '___g';

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      8.使用LIMIT限制查詢結(jié)果的數(shù)量

      當執(zhí)行查詢數(shù)據(jù)時可能會返回很多條記錄,而用戶需要的數(shù)據(jù)可能只是其中的一條或者幾條
      查詢學生表中年紀最小的3位同學 MySQL命令:

      select * from student order by age asc limit 3;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      9.使用GROUP BY進行分組查詢

      GROUP BY 子句可像切蛋糕一樣將表中的數(shù)據(jù)進行分組,再進行查詢等操作。換言之,可通俗地理解為:通過GROUP BY將原來的表拆分成了幾張小表。
      接下來,我們通過一個例子開始學習GROUP BY,代碼如下

      -- 創(chuàng)建數(shù)據(jù)庫DROP DATABASE IF EXISTS mydb;CREATE DATABASE mydb;USE mydb;-- 創(chuàng)建員工表CREATE TABLE employee (     id int,     name varchar(50),     salary int,     departmentnumber int);-- 向員工表中插入數(shù)據(jù)INSERT INTO employee values(1,'tome',2000,1001); INSERT INTO employee values(2,'lucy',9000,1002); INSERT INTO employee values(3,'joke',5000,1003); INSERT INTO employee values(4,'wang',3000,1004); INSERT INTO employee values(5,'chen',3000,1001); INSERT INTO employee values(6,'yukt',7000,1002); INSERT INTO employee values(7,'rett',6000,1003); INSERT INTO employee values(8,'mujk',4000,1004); INSERT INTO employee values(9,'poik',3000,1001);

      9.1 GROUP BY和聚合函數(shù)一起使用

      統(tǒng)計各部門員工個數(shù) MySQL命令:

      select count(*), departmentnumber from employee group by departmentnumber;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      統(tǒng)計部門編號大于1001的各部門員工個數(shù) MySQL命令:

      select count(*), departmentnumber from employee where departmentnumber>1001 group by departmentnumber;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      9.2 GROUP BY和聚合函數(shù)以及HAVING一起使用

      統(tǒng)計工資總和大于8000的部門 MySQL命令:

      select sum(salary),departmentnumber from employee group by departmentnumber having sum(salary)>8000;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      10.使用ORDER BY對查詢結(jié)果排序

      從表中査詢出來的數(shù)據(jù)可能是無序的或者其排列順序不是我們期望的。為此,我們可以使用ORDER BY對查詢結(jié)果進行排序
      其語法格式如下所示:

      SELECT 字段名1,字段名2,…FROM 表名ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC];

      在該語法中:字段名1、字段名2是查詢結(jié)果排序的依據(jù);參數(shù) ASC表示按照升序排序,DESC表示按照降序排序;默認情況下,按照ASC方式排序。通常情況下,ORDER BY子句位于整個SELECT語句的末尾。
      查詢所有學生并按照年紀大小升序排列 MySQL命令:

      select * from student order by age asc;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      查詢所有學生并按照年紀大小降序排列 MySQL命令:

      select * from student order by age desc;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      十二、別名設置

      在査詢數(shù)據(jù)時可為表和字段取別名,該別名代替表和字段的原名參與查詢操作。
      操作的表事先已準備

      1.為表取別名

      在查詢操作時,假若表名很長使用起來就不太方便,此時可為表取一個別名,用該別名來代替表的名稱。語法格式如下所示:

      SELECT * FROM 表名 [AS] 表的別名 WHERE .... ;

      將student改為stu查詢整表 MySQL命令:

      select * from student as stu;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.為字段取別名

      在查詢操作時,假若字段名很長使用起來就不太方便,此時可該字段取一個別名,用該別名來代替字段的名稱。語法格式如下所示:

      SELECT 字段名1 [AS] 別名1 , 字段名2 [AS] 別名2 , ... FROM 表名 WHERE ... ;

      將student中的name取別名為“姓名” 查詢整表 MySQL命令:

      select name as '姓名',id from student;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      十三、表的關(guān)聯(lián)關(guān)系

      在實際開發(fā)中數(shù)據(jù)表之間存在著各種關(guān)聯(lián)關(guān)系。在此,介紹MySQL中數(shù)據(jù)表的三種關(guān)聯(lián)關(guān)系。
      多對一
      多對一(亦稱為一對多)是數(shù)據(jù)表中最常見的一種關(guān)系。例如:員工與部門之間的關(guān)系,一個部門可以有多個員工;而一個員工不能屬于多個部門只屬于某個部門。在多對一的表關(guān)系 中,應將外鍵建在多的一方否則會造成數(shù)據(jù)的冗余。
      多對多
      多對多是數(shù)據(jù)表中常見的一種關(guān)系。例如:學生與老師之間的關(guān)系,一個學生可以有多個老師而且一個老師有多個學生。通常情況下,為了實現(xiàn)這種關(guān)系需要定義一張中間表(亦稱為連接表)該表會存在兩個外鍵分別參照老師表和學生表。
      一對一
      在開發(fā)過程中,一對一的關(guān)聯(lián)關(guān)系在數(shù)據(jù)庫中并不常見;因為以這種方式存儲的信息通常會放在同一張表中。
      接下來,我們來學習在一對多的關(guān)聯(lián)關(guān)系中如果添加和刪除數(shù)據(jù)。先準備一些測試數(shù)據(jù),代碼如下:

      DROP TABLE IF EXISTS student;DROP TABLE IF EXISTS class;-- 創(chuàng)建班級表CREATE TABLE class(     cid int(4) NOT NULL PRIMARY KEY,     cname varchar(30) );-- 創(chuàng)建學生表CREATE TABLE student(     sid int(8) NOT NULL PRIMARY KEY,     sname varchar(30),     classid int(8) NOT NULL);-- 為學生表添加外鍵約束ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid);-- 向班級表插入數(shù)據(jù)INSERT INTO class(cid,cname)VALUES(1,'Java');INSERT INTO class(cid,cname)VALUES(2,'Python');-- 向?qū)W生表插入數(shù)據(jù)INSERT INTO student(sid,sname,classid)VALUES(1,'tome',1);INSERT INTO student(sid,sname,classid)VALUES(2,'lucy',1);INSERT INTO student(sid,sname,classid)VALUES(3,'lili',2);INSERT INTO student(sid,sname,classid)VALUES(4,'domi',2);

      1.關(guān)聯(lián)查詢

      查詢Java班的所有學生 MySQL命令:

      select * from student where classid=(select cid from class where cname='Java');

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.關(guān)于關(guān)聯(lián)關(guān)系的刪除數(shù)據(jù)

      請從班級表中刪除Java班級。在此,請注意:班級表和學生表之間存在關(guān)聯(lián)關(guān)系;要刪除Java班級,應該先刪除學生表中與該班相關(guān)聯(lián)的學生。否則,假若先刪除Java班那么學生表中的cid就失去了關(guān)聯(lián)
      刪除Java班 MySQL命令:

      delete from student where classid=(select cid from class where cname='Java');delete from class where cname='Java';

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      十四、多表連接查詢

      1.交叉連接查詢

      交叉連接返回的結(jié)果是被連接的兩個表中所有數(shù)據(jù)行的笛卡兒積;比如:集合A={a,b},集合B={0,1,2},則集合A和B的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉連接也被稱為笛卡爾連接,其語法格式如下:

      SELECT * FROM 表1 CROSS JOIN 表2;

      在該語法中:CROSS JOIN用于連接兩個要查詢的表,通過該語句可以查詢兩個表中所有的數(shù)據(jù)組合。
      由于這個交叉連接查詢在實際運用中沒有任何意義,所以只做為了解即可

      2.內(nèi)連接查詢

      內(nèi)連接(Inner Join)又稱簡單連接或自然連接,是一種非常常見的連接查詢。內(nèi)連接使用比較運算符對兩個表中的數(shù)據(jù)進行比較并列出與連接條件匹配的數(shù)據(jù)行,組合成新的 記錄。也就是說在內(nèi)連接查詢中只有滿足條件的記錄才能出現(xiàn)在查詢結(jié)果中。其語法格式如下:

      SELECT 查詢字段1,查詢字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.關(guān)系字段=表2.關(guān)系字段

      在該語法中:INNER JOIN用于連接兩個表,ON來指定連接條件;其中INNER可以省略。

      準備數(shù)據(jù),代碼如下:

      -- 若存在數(shù)據(jù)庫mydb則刪除DROP DATABASE IF EXISTS mydb;-- 創(chuàng)建數(shù)據(jù)庫mydbCREATE DATABASE mydb;-- 選擇數(shù)據(jù)庫mydbUSE mydb;-- 創(chuàng)建部門表CREATE TABLE department(   did int (4) NOT NULL PRIMARY KEY,    dname varchar(20));-- 創(chuàng)建員工表CREATE TABLE employee (   eid int (4) NOT NULL PRIMARY KEY,    ename varchar (20),    eage int (2),    departmentid int (4) NOT NULL);-- 向部門表插入數(shù)據(jù)INSERT INTO department VALUES(1001,'財務部');INSERT INTO department VALUES(1002,'技術(shù)部');INSERT INTO department VALUES(1003,'行政部');INSERT INTO department VALUES(1004,'生活部');-- 向員工表插入數(shù)據(jù)INSERT INTO employee VALUES(1,'張三',19,1003);INSERT INTO employee VALUES(2,'李四',18,1002);INSERT INTO employee VALUES(3,'王五',20,1001);INSERT INTO employee VALUES(4,'趙六',20,1004);

      查詢員工姓名及其所屬部門名稱 MySQL命令:

      select employee.ename,department.dname from department inner join employee on department.did=employee.departmentid;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      3.外連接查詢

      在使用內(nèi)連接查詢時我們發(fā)現(xiàn):返回的結(jié)果只包含符合查詢條件和連接條件的數(shù)據(jù)。但是,有時還需要在返回查詢結(jié)果中不僅包含符合條件的數(shù)據(jù),而且還包括左表、右表或兩個表中的所有數(shù)據(jù),此時我們就需要使用外連接查詢。外連接又分為左(外)連接和右(外)連接。其語法格式如下:

      SELECT 查詢字段1,查詢字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.關(guān)系字段=表2.關(guān)系字段 WHERE 條件

      由此可見,外連接的語法格式和內(nèi)連接非常相似,只不過使用的是LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN關(guān)鍵字。其中,關(guān)鍵字左邊的表被稱為左表,關(guān)鍵字右邊的表被稱為右表;OUTER可以省略。
      在使用左(外)連接和右(外)連接查詢時,查詢結(jié)果是不一致的,具體如下:
      1、LEFT [OUTER] JOIN 左(外)連接:返回包括左表中的所有記錄和右表中符合連接條件的記錄。
      2、RIGHT [OUTER] JOIN 右(外)連接:返回包括右表中的所有記錄和左表中符合連接條件的記錄。

      先準備數(shù)據(jù),代碼如下:

      -- 若存在數(shù)據(jù)庫mydb則刪除DROP DATABASE IF EXISTS mydb;-- 創(chuàng)建數(shù)據(jù)庫mydbCREATE DATABASE mydb;-- 選擇數(shù)據(jù)庫mydbUSE mydb;-- 創(chuàng)建班級表CREATE TABLE class(   cid int (4) NOT NULL PRIMARY KEY,    cname varchar(20));-- 創(chuàng)建學生表CREATE TABLE student (   sid int (4) NOT NULL PRIMARY KEY,    sname varchar (20),    sage int (2),    classid int (4) NOT NULL);-- 向班級表插入數(shù)據(jù)INSERT INTO class VALUES(1001,'Java');INSERT INTO class VALUES(1002,'C++');INSERT INTO class VALUES(1003,'Python');INSERT INTO class VALUES(1004,'PHP');-- 向?qū)W生表插入數(shù)據(jù)INSERT INTO student VALUES(1,'張三',20,1001);INSERT INTO student VALUES(2,'李四',21,1002);INSERT INTO student VALUES(3,'王五',24,1002);INSERT INTO student VALUES(4,'趙六',23,1003);INSERT INTO student VALUES(5,'Jack',22,1009);

      準備這組數(shù)據(jù)有一定的特點,為的是讓大家直觀的看出左連接與右連接的不同之處
      1、班級編號為1004的PHP班級沒有學生
      2、學號為5的學生王躍躍班級編號為1009,該班級編號并不在班級表中

      3.1 左(外)連接查詢

      左(外)連接的結(jié)果包括LEFT JOIN子句中指定的左表的所有記錄,以及所有滿足連接條件的記錄。如果左表的某條記錄在右表中不存在則在右表中顯示為空。
      查詢每個班的班級ID、班級名稱及該班的所有學生的名字 MySQL命令:

      select class.cid,class.cname,student.sname from class left outer join student on class.cid=student.classid;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      展示結(jié)果分析:
      1、分別找出Java班、C++班、Python班的學生
      2、右表的王躍躍不滿足查詢條件故其沒有出現(xiàn)在查詢結(jié)果中
      3、雖然左表的PHP班沒有學生,但是任然顯示了PHP的信息;但是,它對應的學生名字為NULL

      3.2 右(外)連接查詢

      右(外)連接的結(jié)果包括RIGHT JOIN子句中指定的右表的所有記錄,以及所有滿足連接條件的記錄。如果右表的某條記錄在左表中沒有匹配,則左表將返回空值。
      查詢每個班的班級ID、班級名稱及該班的所有學生的名字 MySQL命令:

      select class.cid,class.cname,student.sname from class right outer join student on class.cid=student.classid;

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      展示結(jié)果分析:
      1、分別找出Java班、C++班、Python班的學生
      2、?左表的PHP班不滿足查詢條件故其沒有出現(xiàn)在查詢結(jié)果中
      3、?雖然右表的jack沒有對應班級,但是任然顯示王躍躍的信息;但是,它對應的班級以及班級編號均為NULL

      十五、子查詢

      子查詢是指一個查詢語句嵌套在另一個查詢語句內(nèi)部的查詢;該查詢語句可以嵌套在一個 SELECT、SELECT…INTO、INSERT…INTO等語句中。在執(zhí)行查詢時,首先會執(zhí)行子查詢中的語句,再將返回的結(jié)果作為外層查詢的過濾條件。在子査詢中通??梢允褂帽容^運算符和IN、EXISTS、ANY、ALL等關(guān)鍵字。

      準備數(shù)據(jù),代碼如下:

      DROP TABLE IF EXISTS student;DROP TABLE IF EXISTS class;-- 創(chuàng)建班級表CREATE TABLE class(   cid int (4) NOT NULL PRIMARY KEY,    cname varchar(20));-- 創(chuàng)建學生表CREATE TABLE student (   sid int (4) NOT NULL PRIMARY KEY,    sname varchar (20),    sage int (2),    classid int (4) NOT NULL);-- 向班級表插入數(shù)據(jù)INSERT INTO class VALUES(1001,'Java');INSERT INTO class VALUES(1002,'C++');INSERT INTO class VALUES(1003,'Python');INSERT INTO class VALUES(1004,'PHP');INSERT INTO class VALUES(1005,'Android');-- 向?qū)W生表插入數(shù)據(jù)INSERT INTO student VALUES(1,'張三',20,1001);INSERT INTO student VALUES(2,'李四',21,1002);INSERT INTO student VALUES(3,'王五',24,1003);INSERT INTO student VALUES(4,'趙六',23,1004);INSERT INTO student VALUES(5,'小明',21,1001);INSERT INTO student VALUES(6,'小紅',26,1001);INSERT INTO student VALUES(7,'小亮',27,1002);

      1.帶比較運算符的子查詢

      比較運算符前面我們提到過得,就是>、<、=、>=、<=、!=等
      查詢張三同學所在班級的信息 MySQL命令:

      select * from class where cid=(select classid from student where sname='張三');

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)
      查詢比張三同學所在班級編號還大的班級的信息 MySQL命令:

      select * from class where cid>(select classid from student where sname='張三');

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      2.帶EXISTS關(guān)鍵字的子查詢

      EXISTS關(guān)鍵字后面的參數(shù)可以是任意一個子查詢, 它不產(chǎn)生任何數(shù)據(jù)只返回TRUE或FALSE。當返回值為TRUE時外層查詢才會 執(zhí)行
      假如王五同學在學生表中則從班級表查詢所有班級信息 MySQL命令:

      select * from class where exists (select * from student where sname='王五');

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      3.帶ANY關(guān)鍵字的子查詢

      ANY關(guān)鍵字表示滿足其中任意一個條件就返回一個結(jié)果作為外層查詢條件。

      查詢比任一學生所屬班級號還大的班級編號 MySQL命令:

      select * from class where cid > any (select classid from student);

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      4.帶ALL關(guān)鍵字的子查詢

      ALL關(guān)鍵字與ANY有點類似,只不過帶ALL關(guān)鍵字的子査詢返回的結(jié)果需同時滿足所有內(nèi)層査詢條件。

      查詢比所有學生所屬班級號還大的班級編號 MySQL命令:

      select * from class where cid > all (select classid from student);

      運行效果展示
      37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      總結(jié)

      重要(從關(guān)鍵字分析):
      查詢語句的書寫順序和執(zhí)行順序
      select ===> from ===> where ===> group by ===> having ===> order by ===> limit
      查詢語句的執(zhí)行順序
      from ===> where ===> group by ===> having ===> select ===> order by ===> limi

      基于復習,樂于分享 所以有了這篇文章?。。?br />37k字的MySQL基礎(chǔ)整理有這一篇就夠(整理分享)

      【推薦:mysql視頻教程】

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號