MySQL數(shù)據(jù)庫基本操作(中)

一. having子句的使用(結(jié)合聚合函數(shù),gruop by 使用)

1.聚合函數(shù)

  • max(字段名) 獲取某字段中的最大值
  • min(字段名) 獲取某字段中的最小值
  • sum(字段名) 計算某字段值的和
  • avg(字段名) 計算某字段的平均值
  • count(字段名) 計算某字段值中不為null的記錄數(shù)
  • count(*) 計算表中的總記錄數(shù)

格式:
select 字段 fun_name from [where 條件] [group by filed1,fild2...] [with rollup] [having 條件]

(1). fun_name 表示要做的集合函數(shù)操作,也就是數(shù)集合函數(shù).
(2). group by 關(guān)鍵字 表示進行分類聚合的字段.比如要按照部門分類統(tǒng)計員工數(shù)量,部門就應該寫在group by 后面。
(3). with rollup 是可選語法,表明是否對分類聚合后的結(jié)果進行再匯總
(4). having 關(guān)鍵字表示對分類后的結(jié)果再進行條件過濾。

示例:


員工表A.png

統(tǒng)計總?cè)藬?shù)
select count(1) from A;
統(tǒng)計各個姓的人數(shù)
select xing,count(1) from A group by xing;
既要統(tǒng)計各個姓的人數(shù),又統(tǒng)計總?cè)藬?shù)
select xing,count(1) from A group by xing with rollup;
統(tǒng)計人數(shù)大4的姓
select xing,count(1) from A group by xing having count(1)>4;
統(tǒng)計薪水總額,最低薪資,最高薪資
select count(1),min(salary),max(salary) from A;

2.WHERE 子句作用于表和視圖,HAVING 子句作用于組。

WHERE 在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算), 而 HAVING 在分組和聚集之后選取分組的行。
  因此,WHERE 子句不能包含聚集函數(shù),因為試圖用聚集函數(shù)判斷那些行輸入給聚集運算是沒有意義的。相反,HAVING子句總是包含聚集函數(shù)。
例如:
select name,email,count(*) as ct from 表名 group by email HAVING ct > 1
先用group by 對email進行分組,在用having來過濾大于1的,這樣查找出來的就是重復的記錄了.

二. 視圖的應用


MYSQL中視圖的操作>>>
MySQL視圖解析>>>


視圖保存的并不是真實的數(shù)據(jù),而是一張?zhí)摂M的表,不占用內(nèi)存空間,只是保存了計算需要的sql語句,每次調(diào)用的的時候都會自己調(diào)用封存的sql語句,從而提高了重用性。并且視圖顯示的內(nèi)容會跟原文件同步。視圖 不可以與視圖進行聯(lián)結(jié) 可以與其他表聯(lián)結(jié) 索引的話都是跟普通表查詢一樣的 會產(chǎn)生作用

1. 創(chuàng)建視圖

create view 視圖名 as select 查詢語句
示例:

create view test_test1(name) as select name from test_function;

2. 查詢視圖

select * from 視圖名
示例:

select * from test_test1

name
tom
alice

3. 插入數(shù)據(jù)

insert into 視圖名 (列名) values(列值);
示例:

insert into test_function (name) values("張三")

name
tom
alice
張三

4. 刪除視圖

drop view 視圖名

三. MySQL的約束

約束是一種限制,它通過對表的行或列的數(shù)據(jù)做出限制,來確保表的數(shù)據(jù)的完整性、唯一性。
MySQL中,常見的集中約束:

約束類型 關(guān)鍵字 說明
主鍵 primary key 唯一,且不為空
外鍵 froeign key 關(guān)聯(lián)外表中的主鍵,可以為空。一旦關(guān)聯(lián)之后,主表中的數(shù)據(jù)不能先刪除,必須先解除關(guān)聯(lián)
唯一 unique 此列值在整個表都是唯一的,除了空(空和空不相等),可以兩個列組合為唯一約束
非空 not null 確保當前列的值不為空值,非空約束只能出現(xiàn)在表對象的列上。
自增 auto_increment 自動增加,默認步長為1,一張表只能有一個自動增加字段
默認值 default 確保當前列的值不為空值

1. 主鍵約束( primary key)

主鍵約束相當于 唯一約束 + 非空約束 的組合,主鍵約束列不允許重復,也不允許出現(xiàn)空值。
每個表最多只允許一個主鍵,建立主鍵約束可以在列級別創(chuàng)建,也可以在表級別創(chuàng)建。
當創(chuàng)建主鍵的約束時,系統(tǒng)默認會在所在的列和列組合上建立對應的唯一索引。

-- 基本模式
create table temp(
id int primary key [auto_increment],
name varchar(20)
);
-- 組合模式
create table temp(
id int ,
name varchar(20),
pwd varchar(20),
primary key(id, name)
);
-- 刪除主鍵約束
alter table temp drop primary key;
-- 添加主鍵約束
alter table temp add primary key(id,name);
-- 修改主鍵約束
alter table temp modify id int primary key;

2. 外鍵約束 (foreign key)

外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構(gòu)建于一個表的兩個字段或是兩個表的兩個字段之間的參照關(guān)系.

-- 基本模式
-- 主表
create table temp(
id int primary key,
name varchar(20)
);
-- 副表
create table temp2(
id int,
name varchar(20),
classes_id int,
foreign key(id) references temp(id)
);
-- 多列外鍵組合,必須用表級別約束語法
-- 刪除外鍵約束
alter table student drop foreign key student_id;
-- 主表
create table classes(
id int,
name varchar(20),
number int,
primary key(name,number,ON DELETE CASCADE = True)
);
-- 副表
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/表級別聯(lián)合外鍵/
foreign key(classes_name, classes_number) references classes(name, number)
);
-- 刪除外鍵約束
alter table student drop foreign key student_id;
-- 增加外鍵約束
alter table student add foreign key(classes_name, classes_number) references classes(name, number);
級聯(lián)操作的屬性:

  • ON DELETE CASCADE 刪除主表中的數(shù)據(jù)時,從表中的數(shù)據(jù)隨之刪除
  • ON UPDATE CASCADE 更新主表中的數(shù)據(jù)時,從表中的數(shù)據(jù)隨之更新
  • ON DELETE SET NULL 刪除主表中的數(shù)據(jù)時,從表中的數(shù)據(jù)置為空

3. 唯一約束(unique)

唯一約束是指定table的列或列組合不能重復,保證數(shù)據(jù)的唯一性。

唯一約束不允許出現(xiàn)重復的值,但是可以為多個null。

同一個表可以有多個唯一約束,多個列組合的約束。

在創(chuàng)建唯一約束時,如果不給唯一約束名稱,就默認和列名相同。

唯一約束不僅可以在一個表內(nèi)創(chuàng)建,而且可以同時多表創(chuàng)建組合唯一約束。

-- 創(chuàng)建表時設置,表示用戶名、密碼不能重復
create table temp(
id int not null ,
name varchar(20),
password varchar(10),
unique(name,password)
);
-- 添加唯一約束
alter table temp add unique (name, password);
-- 修改唯一約束
alter table temp modify name varchar(25) unique;

-- 刪除約束
alter table temp drop index name;

4. 非空約束 not null 與 默認值 default

非空約束用于確保當前列的值不為空值,非空約束只能出現(xiàn)在表對象的列上。

Null類型特征:
  所有的類型的值都可以是null,包括int、float 等數(shù)據(jù)類型

-- 創(chuàng)建table表,ID 為非空約束,name 為非空約束 且默認值為abc
create table temp(
id int not null,
name varchar(255) not null default 'abc',
sex char null
);
-- 增加非空約束
alter table temp
modify sex varchar(2) not null;
-- 取消非空約束
alter table temp modify sex varchar(2) null;
-- 取消非空約束,增加默認值
alter table temp modify sex varchar(2) default 'abc' null;

5. 查看指定表的所有約束

show create table 表名

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 觀其大綱 page 01 基礎知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 M...
    周少言閱讀 3,255評論 0 33
  • MYSQL 基礎知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 8,060評論 5 115
  • 第一天 7月13日OCP筆記: Oracle Ocp11g準備資料: OracleFundmentals 書 管理...
    fjxCode閱讀 2,885評論 0 4
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,964評論 0 9
  • 文/細嗅薔薇88 六月初伏暑濕蒸 故國洗象動京城 臨街廟會祈豐年 大戶施粥連草棚 女兒省親勤梳妝 秀才搭床忙曬經(jīng) ...
    夜雨殘燈閱讀 506評論 2 10

友情鏈接更多精彩內(nèi)容