第一章、數(shù)據(jù)庫原理概述
1.1.2 數(shù)據(jù)庫、數(shù)據(jù)字典、數(shù)據(jù)庫管理系統(tǒng)、數(shù)據(jù)庫系統(tǒng)
1. 數(shù)據(jù)庫(DB)---
(1)概念:按一定結(jié)構(gòu)組織并長期存儲(chǔ)在計(jì)算機(jī)內(nèi)的、在邏輯上保持一致的、可共享的大量相關(guān)數(shù)據(jù)的集合---存儲(chǔ)數(shù)據(jù)倉庫
(2)屬性:較小的冗余度、較高的數(shù)據(jù)獨(dú)立性、易擴(kuò)展性
2. 數(shù)據(jù)字典(DD)-----系統(tǒng)數(shù)據(jù)
????數(shù)據(jù)庫中的數(shù)據(jù)分為用戶數(shù)據(jù)、系統(tǒng)數(shù)據(jù)
(1)概念:系統(tǒng)數(shù)據(jù)稱為數(shù)據(jù)字典---還將其稱為系統(tǒng)目錄或數(shù)據(jù)
(2)屬性:包括數(shù)據(jù)庫的描述信息、數(shù)據(jù)庫的儲(chǔ)存管理信息、數(shù)據(jù)庫的控制信息、用戶管理信息、系統(tǒng)事務(wù)管理信息
3. 數(shù)據(jù)庫管理系統(tǒng)(DBMS)----存放三級(jí)結(jié)構(gòu)
(1)概念:數(shù)據(jù)庫管理系統(tǒng)是位于用戶與操作系統(tǒng)之間的一個(gè)定義、操作、管理、構(gòu)建和維護(hù)數(shù)據(jù)庫的系統(tǒng)軟件
(2)屬性:可對(duì)數(shù)據(jù)庫執(zhí)行查詢、插入、刪除、更新等基本操作
4. 數(shù)據(jù)庫系統(tǒng)(DBS)
(1)概念:由用戶數(shù)據(jù)庫、操作系統(tǒng)、數(shù)據(jù)庫管理系統(tǒng)、應(yīng)用開發(fā)工具、應(yīng)用系統(tǒng)、數(shù)據(jù)庫管理人員、數(shù)據(jù)庫用戶構(gòu)成
(2)
1.3 數(shù)據(jù)庫管理技術(shù)的發(fā)展歷程
---- 早期數(shù)據(jù)庫系統(tǒng)、關(guān)系型數(shù)據(jù)庫系統(tǒng)、對(duì)象-關(guān)系型數(shù)據(jù)庫系統(tǒng)、大數(shù)據(jù)時(shí)代存儲(chǔ)系統(tǒng)和NOSQL數(shù)據(jù)庫 ?----
1. 早期數(shù)據(jù)庫系統(tǒng)---格式化數(shù)據(jù)庫系統(tǒng)、
(1)主要類型:層次、網(wǎng)狀模型的數(shù)據(jù)庫系統(tǒng),倒排文件系統(tǒng)
2. 關(guān)系型數(shù)據(jù)庫----數(shù)學(xué)化模型
?優(yōu)點(diǎn)(1)采用人們習(xí)慣使用的表格作為基本的數(shù)據(jù)庫結(jié)構(gòu),簡單明了;
?????(2)一次查詢僅使用一條命令或語句,即可以訪問整個(gè)“關(guān)系(或二維表)”。通過多表聯(lián)合操作,
?????對(duì)互有聯(lián)系的若干二維表實(shí)現(xiàn)“關(guān)聯(lián)查詢”
?????
3. 對(duì)象-關(guān)系型數(shù)據(jù)庫系統(tǒng)
(1)概念:它是建立在關(guān)系型數(shù)據(jù)庫的基礎(chǔ)之上,將數(shù)據(jù)庫技術(shù)與面向?qū)ο蠹夹g(shù)相結(jié)合,
可以直接繼承關(guān)系型數(shù)據(jù)庫系統(tǒng)原有的技術(shù)喝用戶基礎(chǔ)。
4. 大數(shù)據(jù)時(shí)代存儲(chǔ)系統(tǒng)和NOSQL數(shù)據(jù)庫
(1)概念:用于存儲(chǔ)大型數(shù)據(jù)并且進(jìn)行操作的新型數(shù)據(jù)庫;
------------------------------------------------------------------
第二章、數(shù)據(jù)模型和數(shù)據(jù)庫系統(tǒng)的模式結(jié)構(gòu)
1.數(shù)據(jù)庫的核心和基礎(chǔ)----------------------------------數(shù)據(jù)模型
2.----------------------------------數(shù)據(jù)庫系統(tǒng)的模式
3.概念模型--------------------------------------E-R圖
4.邏輯數(shù)據(jù)模型----------------------------------層次模型、網(wǎng)狀模型、關(guān)系模型、面向?qū)ο竽P?、?duì)象-關(guān)系模型
5.本章重點(diǎn):數(shù)據(jù)庫系統(tǒng)的三級(jí)模式和兩層映像體系,以及數(shù)據(jù)的邏輯獨(dú)立性和物理獨(dú)立性
2.1 數(shù)據(jù)模型和數(shù)據(jù)模型組成的要素
2.1.1 數(shù)據(jù)模型的概念
1. 數(shù)據(jù)模型需滿足的三點(diǎn)要求
(1)能容易的模擬現(xiàn)實(shí)世界
(2)能讓人輕松理解
(3)方便于在計(jì)算機(jī)上實(shí)現(xiàn)
2.1.2 數(shù)據(jù)模型組成的要素(數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作、數(shù)據(jù)約束)
1.數(shù)據(jù)結(jié)構(gòu)-----數(shù)據(jù)模型的靜態(tài)行為
(1)數(shù)據(jù)模型的基礎(chǔ):靜態(tài)特性
2.數(shù)據(jù)操作---數(shù)據(jù)模型的動(dòng)態(tài)行為
主要操作類型:檢索和修改(插入(insert into 表名 values(值))、刪除(alter table 表名 drop)、更新(updat 表名 set 字段=值 where 條件))
3.數(shù)據(jù)約束
數(shù)據(jù)約束:完整性約束、數(shù)據(jù)安全性約束、并發(fā)控制
2.2 數(shù)據(jù)模型的分類---(概念層模型、邏輯層模型、物理層模型)
1.概念層模型
最常用的概念層模型:實(shí)體-聯(lián)系模型(E-R模型)
2.邏輯層模型
層次模型、網(wǎng)狀模型、關(guān)系模型、面向?qū)ο竽P?、?duì)象-關(guān)系數(shù)據(jù)模型
3.物理層模型
含義:數(shù)據(jù)庫最底層的抽象
2.3 E-R數(shù)據(jù)模型
一、信息世界中的基本概念
1.實(shí)體
2.屬性
(1)E-R屬性類型:簡單屬性、復(fù)合屬性、單值屬性、多值屬性、存儲(chǔ)屬性、派生屬性
簡單屬性:不可再分屬性(比如年齡、性別)
復(fù)合屬性:可以被分為更小的子部分(可再分)
單值屬性:對(duì)于特定的實(shí)體,大多數(shù)屬性只有一個(gè)值(比如學(xué)生的年齡)
多值屬性:同一個(gè)實(shí)體的某個(gè)屬性可能具有多個(gè)值
存儲(chǔ)屬性:某個(gè)屬性能夠存儲(chǔ)另外一個(gè)屬性的信息
派生屬性:某根據(jù)個(gè)屬性能夠推出另一個(gè)屬性的信息(如一個(gè)人的年齡屬性和出生日期屬性,
其中年齡屬性可以從出生日期中派生出,故出生日期為存儲(chǔ)屬性)
3.實(shí)體性
4.實(shí)體集
5.碼或者鍵
6.域
含義:屬性的取值范圍
7.空值(NULL)
8.聯(lián)系
二、E-R圖---提供實(shí)體型、屬性、聯(lián)系
1、E-R圖的表示方法
(1)實(shí)體性:用矩陣表示
(2)屬性:用橢圓表示
(3)多值屬性:雙線橢圓表示
(4)派生屬性:虛橢圓表示
(5)碼屬性的名稱下面有下劃線,并位于橢圓中
2.聯(lián)系:用菱形表示(將其和實(shí)體聯(lián)系起來)
2.4 常用的邏輯數(shù)學(xué)模型
邏輯數(shù)據(jù)模型主要包括:層次數(shù)據(jù)模型、網(wǎng)狀數(shù)據(jù)模型、關(guān)系數(shù)據(jù)模型、面向?qū)ο髷?shù)據(jù)模型、對(duì)象-關(guān)系數(shù)據(jù)模型
一、層次數(shù)據(jù)模型和網(wǎng)狀數(shù)據(jù)模型
1. 層次模型(記錄型):反應(yīng)現(xiàn)實(shí)世界中實(shí)體間的層次關(guān)系。
???(1)數(shù)據(jù):用記錄的集合表示
???(2)數(shù)據(jù)間的聯(lián)系:用鏈接表示
???(3)記錄:用樹型結(jié)構(gòu)表示
???樹狀結(jié)構(gòu)節(jié)點(diǎn)---記錄型
?(4)層次模型的存儲(chǔ)結(jié)構(gòu)包括:鄰接法、鏈接法、鄰接-鏈接混合法
2. 網(wǎng)狀數(shù)據(jù)模型(反應(yīng)非層次關(guān)系、記錄型):
??注:它允許多個(gè)節(jié)點(diǎn)沒有父節(jié)點(diǎn), 一個(gè)結(jié)點(diǎn)可有多個(gè)父節(jié)點(diǎn)
二、關(guān)系模型(記錄型)
1.表現(xiàn)形式:用二維表結(jié)構(gòu)表示各類實(shí)體及實(shí)體間的聯(lián)系(SQL語言就是一種關(guān)系型數(shù)據(jù)庫)
三、面向?qū)ο髷?shù)據(jù)模型(不是記錄型)
1.內(nèi)涵:將面向?qū)ο蠓椒ㄅc數(shù)據(jù)庫相結(jié)合的數(shù)據(jù)模型
四、對(duì)象-關(guān)系數(shù)據(jù)模型
1.內(nèi)涵:將關(guān)系模型與面向?qū)ο竽P瓦M(jìn)行結(jié)合,進(jìn)而形成如今的對(duì)象關(guān)系模型;
2.常見的關(guān)系對(duì)象數(shù)據(jù)模型:Oracle、Sybase、DB2、Informix
2.5 數(shù)據(jù)庫系統(tǒng)的模式結(jié)構(gòu)
一、數(shù)據(jù)庫系統(tǒng)的三級(jí)模式結(jié)構(gòu)
三級(jí)模式包括:模式、外模式、內(nèi)模式
1. 模式(概念模式\邏輯模式)---數(shù)據(jù)庫的中心與關(guān)鍵
(1)內(nèi)涵:模式實(shí)際上就是一個(gè)數(shù)據(jù)庫數(shù)據(jù)的邏輯視圖,且處于中間層;
(2)基礎(chǔ):數(shù)學(xué)模型
2. 外模式(子模式\用戶模式)
(1)內(nèi)涵:它是數(shù)據(jù)庫用戶能夠看見和使用的局部的邏輯結(jié)構(gòu)和特征的描述,是數(shù)據(jù)庫用戶的數(shù)據(jù)視圖;
(2)一個(gè)數(shù)據(jù)庫可以有多個(gè)外模式
3.內(nèi)模式(物理模式\存儲(chǔ)模式)
(1)一個(gè)數(shù)據(jù)庫只有一個(gè)內(nèi)模式;
(2)內(nèi)涵:它是數(shù)據(jù)物理結(jié)構(gòu)和存儲(chǔ)方式的描述,是數(shù)據(jù)庫內(nèi)部的表示方法
二、數(shù)據(jù)庫的兩層映像與數(shù)據(jù)獨(dú)立
注:為了能夠在內(nèi)部實(shí)現(xiàn)三級(jí)模式之間的聯(lián)系和轉(zhuǎn)換,數(shù)據(jù)庫管理系統(tǒng)提供了兩層映像:外模式/模式映像、模式/內(nèi)模式映像;
1、外模式/模式映像
(1)內(nèi)涵:定義定義外模式和模式之間的對(duì)用關(guān)系,對(duì)于每一個(gè)外模式,數(shù)據(jù)庫系統(tǒng)都有一個(gè)外模式/模式映像;
(2)作用:保證了數(shù)據(jù)與程序的邏輯獨(dú)立性;
2、模式/內(nèi)模式映像
(1)內(nèi)涵:定義數(shù)據(jù)庫的全局邏輯結(jié)構(gòu)與存儲(chǔ)結(jié)構(gòu)之間的對(duì)應(yīng)關(guān)系;
(2)作用:保證了較高的物理獨(dú)立性;
(3)模式/內(nèi)模式映像在數(shù)據(jù)庫中是唯一的;
---------------------------------------------------------------------------
第三章 關(guān)系數(shù)據(jù)模型和關(guān)系數(shù)據(jù)庫系統(tǒng)
關(guān)系數(shù)據(jù)模型的三要素:關(guān)系數(shù)據(jù)結(jié)構(gòu)、關(guān)系操作集合、關(guān)系完整性約束;
關(guān)系模型的三類完整性約束:實(shí)體完整性約束、參照完整性約束、用戶定義完整性約束;
關(guān)系型數(shù)據(jù)庫,突出的優(yōu)勢(shì):
(1)保持?jǐn)?shù)據(jù)的一致性;
(2)數(shù)據(jù)的更新開銷很?。?/p>
(3)可以進(jìn)行JOIN等復(fù)雜的查詢;
(4)可以存放很多實(shí)際成果和商業(yè)技術(shù)信息;
3.1.2 關(guān)系數(shù)據(jù)模型
(一)關(guān)系數(shù)據(jù)結(jié)構(gòu)
1.表現(xiàn)形式:邏輯結(jié)構(gòu)是一張二維表;
(二)關(guān)系操作集合
1. 常用的關(guān)系操作包括:選擇、投影、連接、除、并、交、差
2. 關(guān)系能力的表達(dá)方式:代數(shù)方式、邏輯方式
3. 抽象的查詢語言:關(guān)系代數(shù)、元組關(guān)系演算、域關(guān)系演算
4. 關(guān)系數(shù)據(jù)語言:
(1)關(guān)系代數(shù)語言:例如ISBL
(2)關(guān)系演算語言:元組關(guān)系演算語言(例如APLHA,QUEL)、域關(guān)系演算語言(例如OBE)
(3)具有代數(shù)關(guān)系和關(guān)系演算雙重特點(diǎn)的語言:例如SQL
(三)關(guān)系的完整性約束
1.內(nèi)涵:指數(shù)據(jù)庫中數(shù)據(jù)的正確性、相容性、一致性
3.2 關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)
(一)笛卡爾積(關(guān)系數(shù)據(jù)庫的定義)
1. 笛卡爾積:可以表示為一張二維表
2. 表示形式:R(D1,D2,D3,D4,...,)
3. 笛卡爾積計(jì)算:R*S={t|t=<tr,ts>^tr屬于R^ts屬于S}(笛卡爾積有k1*k2個(gè)元組)
(二)一元的專門關(guān)系操作
1. 選擇
選擇又稱為限制,它是在關(guān)系R中選擇滿足給定條件的元組,記作:
2. 映射
-----------------------------------------------------------------------
第四章、關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL
主要講述內(nèi)容:定義語言(DDL),包括基本表、索引、閾的定義和刪除語句以及對(duì)基本表定義的修改語句;
??????數(shù)據(jù)操縱語言(DML),數(shù)據(jù)查詢語句的基本結(jié)構(gòu)及其強(qiáng)大的檢索能力,包括數(shù)據(jù)插入、刪除、更新語句
??????控制語言(DCL):包括權(quán)限授予和收回語句
4.1.2 SQL的語言特點(diǎn)
?SQL是集數(shù)據(jù)查詢(DQL)、數(shù)據(jù)操作(DML)、數(shù)據(jù)定義(DDL)、數(shù)據(jù)控制(DCL)于一體
?1. 綜合統(tǒng)一
?2. 高度非過程化
?3. 面向集合的操作方式
?4. 靈活的使用方式
?5. 語言簡介,易學(xué)易用,功能強(qiáng)大
------ SOL語言的動(dòng)詞:---------
?數(shù)據(jù)查詢 ??SELECT
?數(shù)據(jù)定義 ??CREATE,DROP,ALTER
?數(shù)據(jù)操縱 ??INSERT,UPDATE,DELETE
?數(shù)據(jù)控制 ??GRANT,REVOKE
?4.1.3 SQL的數(shù)據(jù)類型
?4.2.2 基本表的定義、刪除和修改
?1. 刪除表---采用drop
?2. 擴(kuò)充和修改基本表 ---alter table
?(1)增加表的列: alter table 表名 add 新列名
?(2) 修改表的列:alter table 表名 change 舊列名 新列名 類型
?(3) 刪除表的列:alter table 表名 drop 列名
?(4) 修改表數(shù)據(jù)(修改類型或者修改數(shù)據(jù)):alter table 表名 modify 字段名1 類型
?3. 刪除基本表
??drop table 表名 [約束]
?4.2.3 索引的建立和刪除
?4.3 SQL的數(shù)據(jù)查詢(SQL)---提供SELECT語句進(jìn)行數(shù)據(jù)查詢
---------------------------------------------------------------------------------------------------
# 一、數(shù)據(jù)庫的基本操作DML
-- 1、創(chuàng)建表
USE mydbl;
CREATE TABLE ?IF NOT EXISTS `Gou`(
`name` VARCHAR(20),
`years` INT,
`high` DOUBLE) ;
-- 2、修改表的列名(語法:alter table 表明 change 舊列名 新列名 類型)
ALTER TABLE Gou CHANGE `name3` `name` VARCHAR(20)
-- 3.插入數(shù)據(jù)(語法:insert into 表名(列表1,列表2,....) values(值1,值2,...,))
INSERT INTO Gou(`name`,`years`,`high`) VALUES('Gou huipeng',26,170);
-- 4. 刪除指定列(語法:alter table 表名 drop 列名)
ALTER TABLE gouhuipeng DROP id;
-- 5.增加列(指定位置,第一列)---運(yùn)用非空的自增長約束
ALTER TABLE Gou ADD COLUMN id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
-- 6. 修改表名 (rename table 舊表名 to 新表名)
RENAME TABLE Gou TO students;
-- 7.增加學(xué)生信息---插入數(shù)據(jù)
INSERT INTO students(`name`,`years`,`high`) VALUES('張三',20,175.9);
-- 8.修改表中數(shù)據(jù)信息 (語法:update 表名 set 字段名1=值1,字段名2=值2,...,where 條件)---可以整體修改
UPDATE students SET `name`='李四' WHERE id=1;
DQL
/*
?定義SQL模式:
?create schema <模式名> authorization <用戶名>
?數(shù)據(jù)查詢(DQL)的使用
*/
#創(chuàng)建數(shù)據(jù)庫mydb2
create database if not exists mydb2
#使用數(shù)據(jù)庫
use mydb2
#創(chuàng)建商品表product
create table `product`(
`pid` int primary key auto_increment, ???#添加自增長約束
`pname` varchar(20) not null, ???????????#添加非空約束
`price` double, ?????????????????????????#添加商品價(jià)格
`category_id` varchar(20) ??? ?#商品所屬分類
);
#插入數(shù)據(jù)--給表product
insert into product values(null,'海爾冰箱',5000,'c001');
INSERT INTO product VALUES(NULL,'美的冰箱',3000,'c001');
INSERT INTO product VALUES(NULL,'格里空調(diào)',5000,'c001');
INSERT INTO product VALUES(NULL,'九陽電飯煲',5000,'c001');
INSERT INTO product VALUES(NULL,'啄木鳥襯衣',500,'c002');
INSERT INTO product VALUES(NULL,'恒源祥西褲',300,'c002');
INSERT INTO product VALUES(NULL,'花花公子夾克',500,'c002');
INSERT INTO product VALUES(NULL,'勁霸休閑褲',40,'c002');
INSERT INTO product VALUES(NULL,'海藍(lán)之家衛(wèi)衣',80,'c002');
INSERT INTO product VALUES(NULL,'蘭蔻面霜',300,'c001');
INSERT INTO product VALUES(NULL,'雅思蘭黛精華水',200,'c001');
INSERT INTO product VALUES(NULL,'香奈兒香水',350,'c001');
INSERT INTO product VALUES(NULL,'sk-11神仙水',180,'c001');
INSERT INTO product VALUES(NULL,'資深堂粉底液',200,'c001');
INSERT INTO product VALUES(NULL,'老北京方面面',60,'c001');
INSERT INTO product VALUES(NULL,'糧袋鋪?zhàn)雍Ыz',70,'c001');
INSERT INTO product VALUES(NULL,'三只松鼠堅(jiān)果',35,'c001');
UPDATE product SET `pname`='海爾冰箱' WHERE pid=8;
#執(zhí)行查詢操作
/*
select 語句后面可以是字段名,可以是字段和常數(shù)組成的算術(shù)表達(dá)方式,也可以是字符串常數(shù)
查詢操作,類似于我們的尋找操作
--------常用的查詢操作--------------------
1. 查詢?nèi)?-select *from 表名
2. 指定查找---select 選擇列表 ?from 表名
3. 條件查詢--- select 字段1,字段2,...., from 表名 where 約束條件
4. 條件區(qū)間查詢(between)--- select 字段1,字段2,....,from 表名 ?where 字段1 between 約束變量 ?and 約束變量
5. 前端部分字段搜索(like)--- ?列名 [not] like 字符串常數(shù)
注:字符串常數(shù)中字符的含義如下:
字符_(下劃線)表示可以和任意的單個(gè)字符進(jìn)行匹配。如x_y表示以x開頭,以y結(jié)尾長度為3的任意字符串;
字符%(百分號(hào))表示可以和任意長度的字符串匹配。
6. in查詢---用于查找屬性值屬于指定集合的元組
7. order by---排序查詢
8. group by---分組查詢---根據(jù)相同進(jìn)行分組
語法:select 字段1,字段2,... from 表名 group by 分組字段 having 分組條件
注:對(duì)于select當(dāng)中后面的字段只能為分組字段和聚合函數(shù)
注:having用于分組之后的條件選擇
9. limit---分頁查詢
語法1:select 字段1,... from 表名 limit n ----顯示前n條
語法2:select 字段1,... from 表名 limit n,m----顯示從第n條開始顯示后m條
10. insert into select 語句
簡介:將一張表的數(shù)據(jù)導(dǎo)入到另一張表中,可以采用insert into select
語法1:insert into 新表名(field1,field2,...)select value1,value2,... from 舊表名;
語法2:insert into 新表名 select *from 舊表名;
-------------------------------------------------------------------------------
(二)使用聚集函數(shù)進(jìn)行查詢
SQL主要提供的聚集函數(shù)有:
count([distinct|all]*)------------統(tǒng)計(jì)元組個(gè)數(shù)
count([distinct|all]<列名>)-------統(tǒng)計(jì)一列中值的個(gè)數(shù)
sum([distinct|all]<列名>)---------計(jì)算一列值的總和(此列必須是數(shù)值型)
avg([distinct|all]<列名>)---------計(jì)算一列值的平均值(此列必須是數(shù)值型)
max([distinct|all]<列名>)---------求一列值中的最大值
min([distinct|all]<列名>)---------求一列值中的最小值
注:這里的約束條件關(guān)鍵詞采用group by;having
--------------------------------------------------------------------------------
(三)連接查詢
從多個(gè)表中選取數(shù)據(jù),稱之為連接查詢。其中連接查詢是數(shù)據(jù)庫中最重要的部分,
包括等值連接、非等值連接、復(fù)合條件連接、自身連接和多表連接。
1. 等值連接和非等值連接
(1)當(dāng)連接運(yùn)算符為“=”時(shí),稱為等值連接;
(2)使用其它運(yùn)算符時(shí),稱為非等值連接;
注:其中連接謂詞中的列名稱稱為連接字段。連接條件中的各連接字段的數(shù)據(jù)類型必須是可比的。
(四)正則表達(dá)式(REGEXP--關(guān)鍵字)
格式:
模式 ??????????????????描述
^ ????????????匹配輸入字符串的開始位置
$ ????????????匹配輸入字符串的結(jié)束位置
. ????????????匹配除“\n”之外的任何單個(gè)字符
[...] ????????字符集合。匹配所包含的任意一個(gè)字符。例如,'[abc]'可以匹配“paln”中的'a'
[^...] ???????負(fù)值字符串集合。匹配未包含的任意字符。例如,‘[^abc]’可以匹配“paln”中的'p'
p1|p2|p3 ?????匹配p1或p2或p3.例如,‘z|food’能匹配“z”或“food”
a* ???????????匹配0個(gè)或多個(gè)a,包含空字符串
a+ ???????????匹配1個(gè)或多個(gè)a,但是不包含空字符串
a? ???????????匹配0個(gè)或1個(gè)a
a1|a2 ????????匹配a1或a2
a{m} ?????????匹配m個(gè)a
a{m,} ????????匹配至少m個(gè)a
a{m,n} ???????匹配m到n個(gè)a,包含m和n
注:正則表達(dá)可以組合使用
*/
-- 1.查詢指定表的全部信息(select * from 表名)
select * from product;
-- 2. 指定查找---指定條件查找
select ?*from product where ?pname='海爾冰箱' and price=5000;
-- 運(yùn)算符操作----
select 6+2;
select 6-2;
-- 將所有的商品價(jià)格加10元---as 可以進(jìn)行替換--整體選擇--制定列加條件選擇
select pname,price+10 as new_price from product;
-- 將商品的價(jià)格上調(diào)百分之10
select pname,price*1.1 as new_price from product;
-- 3. 使用比較運(yùn)算符進(jìn)行查詢------有條件的篩選
select pname,price from product WHere price>=5000;
-- 選擇價(jià)格不是800的所有商品--不等的表示“!= ” 、“<>”、“not 字段=數(shù)值”
select *from product WHERE price !=800;
SELECT *FROM product WHERE price <>800;
SELECT *FROM product WHERE not price=5000;
-- 4. 使用between進(jìn)行區(qū)間選擇---當(dāng)然可以利用wehere進(jìn)行條件篩選
select pname,price from product where price between 50 and 1000;
-- 5. 其中利用where進(jìn)行邏輯篩選與between效果是一樣的
SELECT pname,price FROM product WHERE price>=50 and price<=1000;
-- 6. 使用like進(jìn)行篩選---這里的like類似與像什么類型,做一個(gè)前端搜索
#查詢所有冰箱的信息--這里“%”可以匹配任意字符,“-”代表單個(gè)字符
select * from product where pname like '%冰箱';
#查詢所有褲的相關(guān)信息
SELECT * FROM product WHERE pname LIKE '%褲';
#查詢表中價(jià)格在500-6000的冰箱有那些??? 遇到多重條件怎么解決
select *from product where pname like '%冰箱' and (price >=500 and price<5000);
-- 7. 使用in進(jìn)行指定集合的元組進(jìn)行查找
#查找產(chǎn)品中的編號(hào)c002的產(chǎn)品名稱和序號(hào)
select pid,pname from product where category_id ='c002';
#按照商品的價(jià)格進(jìn)行排序--desc(降序)---不寫時(shí)默認(rèn)升序(order by)
select *from product order by price desc; ?-- 降序
select *from product order by price;
#在價(jià)格排序的基礎(chǔ)上,以分類進(jìn)行排序--只能執(zhí)行price的降序,不能執(zhí)行標(biāo)簽的降序
SELECT *FROM product ORDER BY price DESC, category_id DESC;
# 顯示商品的價(jià)格(去重),并排序(降序)----去掉重復(fù)的價(jià)格--去重(distinct)
select distinct price ?from product order by price desc;
-- 8. 多重條件查詢--使用 and or 關(guān)鍵詞----根據(jù)邏輯選擇進(jìn)行選擇
#尋找編號(hào)c001中價(jià)格在100以上的產(chǎn)品
select pid,pname from product where category_id='c001' and price>100;
-- 9.統(tǒng)計(jì)產(chǎn)品總數(shù)(count(*))---兩種不同的方式起到相同的作用
select count(*) from product;
select count(pid) from product;
# 查詢價(jià)格大于200的商品的總條數(shù)
select count(pid) from product where price>200;
# 求商品分類為‘c001’的總和
SELECT sum(price) FROM product WHERE category_id='c001';
#查詢最貴的商品,當(dāng)有最大的相同時(shí)全部顯示
select pname,max(price) max_price from product where category_id='c001';
-- 10. group by---將查詢結(jié)果按某一列或多列值分組,值相等的為一組
#查詢每一個(gè)產(chǎn)品的編號(hào)和平均價(jià)格
select category_id,pname,avg(price) from product group by pname;
#統(tǒng)計(jì)各個(gè)分類商品的個(gè)數(shù)
select category_id, count(*) from product group by category_id;
#查詢編號(hào)確定大于2的產(chǎn)品名
select pname from product group by pname having count(*)>=2;
#統(tǒng)計(jì)各個(gè)分類商品的個(gè)數(shù),且只顯示個(gè)數(shù)大于4的信息
SELECT category_id, COUNT(*) cnt FROM product GROUP BY category_id having ?cnt>2 order by cnt;
-- 11.分頁查詢
#查詢product的前5條記錄
select *from product limit 5;
#從第四條開始顯示,顯示5條
select *from product limit 3,5;
-- 12.insert into select語句
#創(chuàng)建一個(gè)表
create table product2(
pname varchar(20),
price double
);
insert into product2(pname,price) select pname,price from product;
#查看表product2
select * from product2;
#將商品類型存入到product3
create table ?product3(
category_id varchar(20),
count_product int
);
insert into product3 select category_id,count(*) cnt from product group by category_id order by cnt;
select *from product3;
-- 注:當(dāng)表存在的時(shí)候,再進(jìn)行存儲(chǔ)只能選擇疊加;
-- 正則表達(dá)式----------
-- ^ 在字符串開始處進(jìn)行匹配
select 'abc' regexp '^a';
SELECT * from product where pname REGEXP '^海';
select *from product where pname like '海%'; ????#這兩種起到的效果一樣
#查看表格中是否有以水結(jié)尾的商品
select *from product where pname regexp '水$';
# [...] ????匹配所包含的任意一個(gè)字符
select 'abc' regexp '[xyz]';
多表操作
/*
目的:項(xiàng)目的實(shí)現(xiàn)需要利用多表才能進(jìn)行操作
多表之間關(guān)系包括:一對(duì)一,一對(duì)多/多對(duì)一,多對(duì)多
一、一對(duì)多
(一)外鍵約束:經(jīng)常與主鍵約束一起使用,相關(guān)聯(lián)字段中主鍵所在表就是主表(父表),外鍵所在的表就是從表(子表)
1.創(chuàng)建方式:關(guān)鍵字 foreign key 關(guān)鍵字來指定外鍵,語法如下:
[constrain <外鍵名>] foreign key 字段名 [,字段名2,...] references <主表名> 主鍵列1 [,主鍵列2]
?外鍵約束也可以在修改表的時(shí)候添加,但是添加外鍵約束的前提是:從表中外鍵列中的數(shù)據(jù)必須與主表中
?主鍵中的數(shù)據(jù)一致或者是沒有數(shù)據(jù)
2.創(chuàng)建方式2: alter table <數(shù)據(jù)表名> add constraint <外鍵名> foreign key(<列名>) references <主表名> (<列名>)
3. 刪除表的外鍵約束
???alter table <表名> drop foreign key <外鍵約束名>
???
?二、多對(duì)多
?多個(gè)外鍵約束
?三、多表聯(lián)合查詢(從多張表進(jìn)行查詢)
?(一)交叉連接查詢【產(chǎn)生笛卡爾積,了解】
語法:select *from A,B;
?(二)內(nèi)連接查詢(使用的關(guān)鍵字 inner join --inner 可以省略)---交集
隱式內(nèi)連接(SQL92):select *from A,B where 條件;
顯示內(nèi)連接(SQL99): select *from A inner join B on 條件;
(三)外連接查詢(使用的關(guān)鍵字 outer join -- outer 可以省略)
左外連接:left outer join
???select *from A left outer join B on 條件;
右外連接:right outer join
???select *from A right outer join B on 條件;
?滿外連接:full outer join
???select *from A full outer join B on 條件;
(四)子查詢
??????select 的嵌套
??????-- 特點(diǎn)
??????子查詢可以返回的數(shù)據(jù)類型一共分為四種:
??????1. 單行單列
??????2. 單行多列
??????3. 多行單列
??????4. 多行多列
??????
(五)表自關(guān)聯(lián)
??????將一張表當(dāng)成多張表用
??
(六)子查詢關(guān)鍵字
1. ALL
2. any
3. some
4. in
5. exists
----------------------------------------------------
1. all關(guān)鍵字
??
*/
-- ---------- -- 以方法1進(jìn)行實(shí)現(xiàn)---------------
# 實(shí)現(xiàn)
CREATE DATABASE mydb3;
#創(chuàng)建部門表
USE mydb3;
CREATE TABLE IF NOT EXISTS dept(
`detpno` VARCHAR(20) PRIMARY KEY, ?#部門編號(hào)
`name` VARCHAR(20) ????????????#部門名字
);
INSERT INTO dept VALUES('c001','張三');
INSERT INTO dept VALUES('c002','李四');
INSERT INTO dept VALUES('c003','王五');
UPDATE dept SET detpno='項(xiàng)目部' WHERE `name`='張三';
UPDATE dept SET detpno='人事部' WHERE `name`='李四';
UPDATE dept SET detpno='后勤部' WHERE `name`='王五';
# 再進(jìn)行修改
UPDATE dept SET detpno='1001' WHERE `name`='張三';
UPDATE dept SET detpno='1002' WHERE `name`='李四';
UPDATE dept SET detpno='1003' WHERE `name`='王五';
UPDATE dept SET `name`='研發(fā)部' WHERE ?detpno='1001';
UPDATE dept SET ?`name`='銷售部' WHERE detpno='1002';
UPDATE dept SET `name`='財(cái)務(wù)部' WHERE detpno='1003';
INSERT INTO dept VALUES('1004','人事部');
INSERT INTO dept VALUES('1005','項(xiàng)目部');
#創(chuàng)建一個(gè)子表--員工表,并創(chuàng)建dept_id外鍵約束
CREATE TABLE IF NOT EXISTS emp(
`eid` VARCHAR(20) PRIMARY KEY, ?# 員工編號(hào)
`ename` VARCHAR(20),
`age` INT,
`dept_id` VARCHAR(20), ?-- 員工所屬部門
CONSTRAINT emp_fk FOREIGN KEY(dept_id) REFERENCES dept(detpno)
);
# 插入數(shù)據(jù)---給所在從表
INSERT INTO emp ?VALUES('1','張小三',23,'1001');
INSERT INTO emp ?VALUES('2','喬峰',21,'1001');
INSERT INTO emp ?VALUES('3','段譽(yù)',23,'1003');
INSERT INTO emp ?VALUES('4','虛竹',23,'1002');
INSERT INTO emp VALUES('5','令狐沖',30,'1004');
# 注:從數(shù)據(jù)受到主表的約束
# 刪表的數(shù)據(jù)---針對(duì)主表
DELETE FROM dept WHERE detpno='1004'; ??-- 不可以刪除,因?yàn)閺谋懋?dāng)中有受1004主鍵約束的變量
DELETE FROM dept WHERE detpno='1005'; ??-- 可以刪除
DELETE FROM dept; ??????????????????????-- 不可以刪除
# 刪除從表
DELETE FROM emp WHERE eid='5'; -- 可以刪除
-- 4.刪除外鍵約束
ALTER TABLE emp DROP FOREIGN KEY emp_fk;
-- ---------------二 多對(duì)多----------------------------------------
#創(chuàng)建學(xué)生表
CREATE TABLE IF NOT EXISTS students (
`sid` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(20),
`age` INT,
`gender` VARCHAR(20)
);
#創(chuàng)建課程表
CREATE TABLE IF NOT EXISTS course(
cid INT PRIMARY KEY AUTO_INCREMENT,
cidname VARCHAR(20)
);
#創(chuàng)建中間表student_course/score
CREATE TABLE score(
sid INT,
cid INT,
score DOUBLE
);
#建立外鍵約束--2次
ALTER TABLE score ADD FOREIGN KEY(sid) REFERENCES students(sid);
ALTER TABLE score ADD FOREIGN KEY(cid) REFERENCES course(cid);
#給學(xué)生表students添加數(shù)據(jù)
INSERT INTO students VALUES(1,'小龍女',18,'女'),(2,'阿紫',19,'女'),(3,'楊過',23,'男');
#給課程表course添加數(shù)據(jù)
INSERT INTO course VALUES(1,'語文'),(2,'數(shù)學(xué)'),(3,'英語');
#給中間表添加數(shù)據(jù)
INSERT INTO score VALUES(1,1,98),(1,2,93),(2,1,89),(2,3,91),(3,2,97),(3,3,90);
#修改和刪除時(shí),中間從表可以隨便刪除和修改,但是兩邊的右側(cè)主表不能隨便刪除或修改
-- ------------------------------------------------------------------------------
-- ?-------多表聯(lián)合查詢(外鍵約束對(duì)多表查詢并無影響)------------------------------
USE mydb3;
#創(chuàng)建一個(gè)部門表
CREATE TABLE IF NOT EXISTS dep13(
deplno VARCHAR(20) PRIMARY KEY, ?-- 部門號(hào)
`name` VARCHAR(20) ??-- 部門名稱
);
-- 由于表名寫錯(cuò),對(duì)其進(jìn)行修改(rename table 舊表名 to 新表明)
RENAME TABLE depl3 TO dept3;
#創(chuàng)建員工表
CREATE TABLE IF NOT EXISTS emp3(
eid VARCHAR(20) PRIMARY KEY, -- 員工編號(hào)
ename VARCHAR(20), -- 員工名字
age INT, ??????????-- 員工年齡
dept_id VARCHAR(20) ??-- 員工所屬部門
);
#給dept3添加數(shù)據(jù)
INSERT INTO dept3 VALUES('1001','研發(fā)部');
INSERT INTO dept3 VALUES('1002','銷售部');
INSERT INTO dept3 VALUES('1003','財(cái)務(wù)部');
INSERT INTO dept3 VALUES('1004','人事部');
#給emp3添加數(shù)據(jù)
INSERT INTO emp3 VALUES('1','喬峰',20,'1001');
INSERT INTO emp3 VALUES('2','段譽(yù)',21,'1001');
INSERT INTO emp3 VALUES('3','虛竹',23,'1001');
INSERT INTO emp3 VALUES('4','阿紫',18,'1001');
INSERT INTO emp3 VALUES('5','掃地僧',85,'1002');
INSERT INTO emp3 VALUES('6','李秋水',33,'1002');
INSERT INTO emp3 VALUES('7','鳩摩智',50,'1002');
INSERT INTO emp3 VALUES('8','天山童姥',60,'1003');
INSERT INTO emp3 VALUES('9','慕容博',58,'1003');
INSERT INTO emp3 VALUES('10','丁春秋',71,'1005');
# 交叉連接查詢(select * from 表1,表2,表3,...,)---直接拼接
SELECT *FROM dept3,emp3;
# 內(nèi)連接查詢(select *from A,B where 條件;select *from A inner join B on 條件)
-- 查詢每個(gè)部門的所屬員工(一一對(duì)應(yīng))
# 隱式內(nèi)連接
SELECT *FROM dept3 a,emp3 b WHERE a.deplno=b.dept_id; ?-- 隱式內(nèi)連接
# 顯示內(nèi)連接
SELECT *FROM dept3 JOIN emp3 ON deplno=dept_id;
-- 查詢研發(fā)部門的所有員工
SELECT *FROM dept3 JOIN emp3 ON deplno=dept_id AND `name`='研發(fā)部';
-- 查詢研發(fā)部門和銷售部的所有員工
SELECT *FROM dept3 JOIN emp3 ON deplno=dept_id AND (`name`='研發(fā)部' OR `name`='銷售部');
SELECT *FROM dept3 JOIN emp3 ON deplno=dept_id AND `name` IN('研發(fā)部' ,'銷售部'); ?-- 對(duì)上一個(gè)的改寫
-- 查詢每一個(gè)部門的員工數(shù),并升序排序(使用分組函數(shù))
SELECT `name`,deplno, COUNT(1) FROM dept3 JOIN emp3 ON deplno=dept_id GROUP BY deplno,`name`;
-- 查詢?nèi)藬?shù)大于等于3的部門,并按照降序排序(合理運(yùn)用各個(gè)命令的組合)
SELECT
????????`name`,
????????deplno,
????????COUNT(1) AS total_cnt
FROM dept3
JOIN emp3 ON dept3.deplno=emp3.dept_id
GROUP BY
`name`,deplno
HAVING
total_cnt>=3
ORDER BY
total_cnt DESC;
-- 外連接查詢
/*
左外連接:left outer join
???select *from A left outer join B on 條件;
*/
# 查詢那些部門又員工,那些部門沒員工
USE mydb3;
SELECT *FROM dept3 LEFT OUTER JOIN emp3 ON dept3.`deplno`=emp3.`dept_id`; -- 以左表為主,進(jìn)行匹配
# 查詢那些員工有對(duì)應(yīng)部門,那些沒有
SELECT *FROM dept3 RIGHT OUTER JOIN emp3 ON dept3.`deplno`=emp3.`dept_id`; -- 以右表為主,進(jìn)行匹配
-- 實(shí)現(xiàn)滿外連接:full join
-- 使用union關(guān)鍵字實(shí)現(xiàn)左外連接和右外連接的并集
-- SELECT *FROM dept3 RIGHT OUTER full JOIN emp3 ON dept3.`deplno`=emp3.`dept_id`; (不可以)
SELECT *FROM dept3 LEFT OUTER JOIN emp3 ON dept3.`deplno`=emp3.`dept_id`
UNION
SELECT *FROM dept3 RIGHT OUTER JOIN emp3 ON dept3.`deplno`=emp3.`dept_id`
-- 注:join是將左右查詢的結(jié)果上下拼接
-- 子查詢
# 查詢年齡最大的員工信息,顯示信息包含工號(hào)、員工名字、員工年齡
SELECT eid ,ename,age FROM emp3 WHERE age=(SELECT MAX(age) FROM emp3); ?-- 也就是查詢具有多個(gè)子查詢(單行單列)
# 查詢研發(fā)部和銷售部的員工信息,包含員工號(hào)、員工名字
-- 方式1:多表查詢
SELECT *FROM dept3 JOIN emp3 ON deplno=dept_id AND (`name`='研發(fā)部' OR `name`='銷售部'); -- 多表查詢
-- 方式2:子表查詢(條件篩選查找)文章來源:http://www.zghlxwxcb.cn/news/detail-451696.html
SELECT *FROM
emp3
WHERE
dept_id
IN (
SELECT
deplno
FROM
dept3
WHERE
`name`='研發(fā)部' OR `name`='銷售部'); ?-- 多行單列
# 查詢研發(fā)部20歲以下的員工信息,包括員工工號(hào)、員工姓名、員工名字
?文章來源地址http://www.zghlxwxcb.cn/news/detail-451696.html
-- 方式1:關(guān)聯(lián)查詢(因?yàn)閮蓚€(gè)部門之間有一定的關(guān)系)
SELECT *FROM dept3 JOIN emp3 ON deplno=dept_id AND (`name`='研發(fā)部' AND age<20);
-- 方式2:子查詢(對(duì)于使用子查詢,需要多考慮怎樣進(jìn)行步驟能夠查到所需要的內(nèi)容)
#2.1 在部門表中查詢部門的信息
SELECT *FROM dept3 WHERE `name`='研發(fā)部';
#2.2 在員工表中查詢員工信息
SELECT *FROM emp3 WHERE age<20;
SELECT *FROM (SELECT *FROM dept3 WHERE `name`='研發(fā)部') t1 JOIN (SELECT *FROM emp3 WHERE age<30) t2 ON t1.deplno=t2.dept_id;
到了這里,關(guān)于找工作所需數(shù)據(jù)庫基礎(chǔ)知識(shí)與實(shí)際操作(以MySQL為例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!