MySQL建表約束
約束名稱 | 描述 |
---|---|
not null | 非空約束 |
uniq | 唯一約束 |
default | 默認(rèn)約束 |
primary key | 主鍵約束 |
auto_increment | 自增約束 |
foreign key | 外鍵約束 |
MySQL約束類型
1.[not] null 類型(不為空)
- 要填都必須填上
drop table if EXISTS author; -- 判斷有沒有author這個表嫌拣,有的話刪除原來的新創(chuàng)一個author表,沒有的話直接創(chuàng)一個author表
create table author(
aut_id varchar(8) not null,
aut_name varchar(50) not null,
country varchar(25) not null,
home_city char(20) not null
);
2.unique約束(唯一約束)
- 重復(fù)的值不能插入
方法一:
drop table if EXISTS author;
create table if not EXISTS author(
aut_id varchar(8) not null,
aut_name varchar(50) not null,
country varchar(25) not null,
unique (aut_id)
);
方法二:
drop table if EXISTS author;
create table if not EXISTS author(
aut_id varchar(8) not null unique,
aut_name varchar(50) not null,
country varchar(25) not null
);
3.defaule約束(默認(rèn)約束)
<字段名> <數(shù)據(jù)類型> defaule<默認(rèn)值>;
drop table if EXISTS author;
create table if not EXISTS author(
id INT,
name VARCHAR(20),
age INT DEFAULT 10
);
-- 移除非空約束
alter table author(表名) modtfy age(列名) int;
4.primary key 約束(主鍵約束)
唯一確定一張表中的一條記錄.也就是我們通過給某個字段添加約束,就使得該字段不重復(fù)且不為空;
drop table if EXISTS author;
create table if not EXISTS author(
id int primary key,
name varchar(20)
);
聯(lián)合主鍵
聯(lián)合主鍵中的每個字段都不能為空,并且加起來不能和已設(shè)置的聯(lián)合主鍵重復(fù)
drop table if EXISTS author;
create table if not EXISTS author(
id INT,
name VARCHAR(20),
password VARCHAR(20),
PRIMARY KEY(id, name)
);
5.auto_increment約束(自動增長)
-
需要配合主鍵一起用
drop table if EXISTS author; create table if not EXISTS author( id int primary key auto_increment, name varchar(20) );
如果忘記設(shè)置主鍵灶壶,還可以通過sql語句設(shè)置(兩種方式):
1、 alter table author add primary key(id);
2、 alter table author modify id int primary key;
- 刪除主鍵
alter table author drop primary key;
6.foreign key約束
涉及兩個表:父表和子表
- 外鍵可以建立多個构回,多個外鍵接著寫就可以
- 外鍵會產(chǎn)生的效果:
- 1.刪除表時,如果不刪除引用外鍵的表疏咐,被引用的表不能直接刪除
- 2.外鍵的值必須來源于引用的表的主鍵字段
create table classes(id int primary key,name VARCHAR(20));-- 班級表
create table students(id int primary key,name VARCHAR(20),class_id int,foreign key(class_id) references classes(id));//學(xué)生表
//有三個班
insert into classes value(1,'class1');
insert into classes value(2,'class2');
insert into classes value(3,'class3');
//插入學(xué)生
insert into students value(1001,'Lily',1);
insert into students value(1002,'Ony',2);
insert into students value(1003,'Poy',3);
-- 1. 主表(父表)classes 中沒有的數(shù)據(jù)值纤掸,在副表(子表)中是不可以使用的
-- 主表的記錄被副表引用,是不能被刪除的
MySQL數(shù)據(jù)查詢語言
- 該語言用來查詢記錄浑塞,不會修改數(shù)據(jù)庫和表結(jié)構(gòu)
一借跪、單表查詢
1.帶條件的查詢
以slect開頭:
select * from + 表名稱 + 條件
查詢字段
select 字段 from 表名;
模糊查詢
where 字段 like '%不確定%'
distinct :用distinct來返回不重復(fù)字段的條數(shù)(count(distinct id)),其原因是distinct只能返回他的目標(biāo)字段,而無法返回其他字段
2.排序
基本語法:order by 字段
備注:默認(rèn)是升序酌壕,ASC升序掏愁,DESC降序
3.聚合函數(shù)
count():統(tǒng)計記錄數(shù)
avg():平均數(shù)
max():最大值
min():最小值
sum():求和
4.分組查詢
基本語法:select 字段1,字段2卵牍,聚合函數(shù) from + 表名稱 + group by 字段1果港,字段2
備注:group by和having 一起用,主要是對分組結(jié)果進行過濾
5.LIMT子句(MySQL中獨有的語言)
- 可以被用于強制 SELECT 語句返回指定的記錄數(shù)
- 接受一個或兩個數(shù)字參數(shù)糊昙。參數(shù)必須是一個整數(shù)常量
- 如果給定兩個參數(shù)京腥,第一個參數(shù)指定第一個返回記錄行的偏移量,第二個參數(shù)指定返回記錄行的最大數(shù)目溅蛉。
SELECT * from t LIMIT 1;-- 返回第一條記錄
select * from t LIMIT 3,6;-- 返回六條記錄公浪,從第四條開始計算
- Limit的執(zhí)行效率高,是對于一種特定條件下來說的:即數(shù)據(jù)庫的數(shù)量很大船侧,但是只需要查詢一部分?jǐn)?shù)據(jù)的情況欠气。 高效率的原理是:避免全表掃描,提高查詢效率
- 在sql語句中镜撩,limt關(guān)鍵字是最后才用到的预柒。以下條件的出現(xiàn)順序一般是:where->group by->having->order by->limit
二队塘、多表查詢
union 、 union all
union:用于連接兩個以上的select語句的結(jié)果宜鸯,講結(jié)果組合到一個結(jié)果集中憔古,并刪除重復(fù)數(shù)據(jù)
union all: 用于連接兩個以上的select語句的結(jié)果,講結(jié)果組合到一個結(jié)果集中淋袖,并顯示全部的數(shù)據(jù)
基本語法:
select 字段 from 表1 union[all|distinct] select 字段 from 表2
備注:union即為union distinct鸿市;若為union all,即返回全部結(jié)果集
表結(jié)構(gòu)一致
笛卡爾積:簡單來說就是兩個集合相乘的結(jié)果即碗,集合A和集合B中任意兩個元素結(jié)合在一起
1.內(nèi)連接(inner join)
兩個表重復(fù)的部分
內(nèi)連接即等值連接焰情,獲取兩個表中字段匹配關(guān)系的記錄,可以省略成join剥懒,可理解成集合概念中的交集内舟,關(guān)鍵字段同時存在與兩表的記錄。
2.左連接(left join)
左連接初橘,獲取左邊主表的全部記錄验游,即使右表沒有對應(yīng)的數(shù)據(jù)
3.右連接(right join)
右連接,獲取右邊主表的全部記錄保檐,即使左表沒有對應(yīng)的數(shù)據(jù)
三批狱、子查詢
1.where 型子查詢
將查詢結(jié)果當(dāng)條件
where型子查詢,如果時where列=(內(nèi)層sql)則內(nèi)層sql返回的必須單行單例單個值展东。
where型子查詢赔硫,如果where列in(內(nèi)層sql)則內(nèi)層sq返回的必須是單例,可以是多行
2.from 型子查詢
#如何用子查詢查出掛科兩門及以上同學(xué)的平均分盐肃,where爪膊,from型都可以
select *from stu;
先把掛科2門及以上的同學(xué)找出來
1)不及格的同學(xué):
select name,count(*) from stu where score <60 group by name;
2)然后將掛科兩門以上的同學(xué)找出來:
select name,count(*) as gk from stu where score <60 group by name having gk>=2;
3)將人員抽離出來:
select name from (select name,count(*) as gk from stu where score <60 group by name having gk>=2) as tmp;
4)求平均分:
select name,acg(score) from score stu where name in(select name from (select name,count(*) as gk from stu where score <60 group by name having gk>=2) as tmp) group by name;
判斷是否為空值用
-- 不為空值
is not null
-- 為空值
is null