Mysql(三)約束

1、視圖java

      視圖是虛擬的數據表,自己不存儲數據,而是提供數據的邏輯 展現。數據庫

      一、建立視圖oop

create view stu_view as
select s1.id, s1.name, s2.room, s2.stay_time
from student s1, stay s2
where s1.id = s2.id;

建立視圖後,就能夠像查詢數據表同樣查詢視圖。  視圖的字段就是咱們從數據表中查詢而來的字段。性能

select id from stu_view   desc stu_view
      二、修改視圖spa

alter view stu_view as
select s1.id, s1.name, s2.room, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id;
select * from stu_view

  三、刪除視圖rest

drop view stu_view;對象

       四、 在修改視圖時,咱們能夠不使用alter,而是or replace。 在視圖不存在時,建立視圖,當視圖存在時,替換視圖。blog

create or replace view stu_view as
select s1.id, s1.name, s2.room, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id;索引

       五、視圖只是一個預存儲的查詢語句。(as後面的查詢語句)  當咱們查詢視圖時,視圖的查詢語句就會展開。(就是從 視圖存儲的查詢語句(結果集)中查詢。io

select * from stu_view
select * from (
select s1.id, s1.name, s2.room, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id) x;

  視圖的特徵:

1 視圖做爲預存儲的查詢語句,不能提升性能。
2 視圖能夠簡化咱們的輸入操做。
3 視圖能夠提供相同數據表的不一樣邏輯展現。

 

2、

    視圖默認狀況下,是以咱們查詢的字段命名。
#當視圖的查詢字段出現同名時(命名衝突)時,咱們能夠:
#1 使用別名 當使用別名時,視圖字段會以別名來命名。
#2 自定義視圖字段的名稱

     一、別名

create or replace view stu_view as
select s1.id stu_id, s2.id stay_id, s1.name, s2.room, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id;
desc  stu_view;

 二、自定義視圖字段的名稱,指定的字段數量與查詢的字段數量必須一致。

create or replace view stu_view(field1, field2) as
select s1.id, s2.stay_time
from student s1 left outer join stay s2
on s1.id = s2.id;
desc  stu_view;

 

3、索引

      索引是數據表中一個特殊的對象。

優勢:索引能夠加快記錄的查詢速度。

缺點:
#1 索引須要佔用額外的硬盤空間。
#2 當數據表中記錄發生變更時(增長,修改等),索引須要 進行從新變動(從新維護)。

索引使用的場合:

1 數據量很大(表中的記錄多)
2 查詢操做多
3 增長,刪除等操做少。

      一、建立索引

create index stu_index on student(id);

create index 索引名 on 表名(字段1,字段2……字段n);     能夠指定一列或者多列

      二、刪除索引

drop index 索引名 on 表名

 

drop index stu_index on student

索引這就相似於圖書的目錄同樣,若是咱們想要查詢某些內容, 咱們能夠從第一頁開始,逐頁進行查找,但這勢必會耗費大 量的查找時間。可是,若是咱們經過目錄來查詢,就能夠快 速的定位到相關的頁碼上。 
 
4、數據庫約束
  

約束
約束,就是一種限制,其能夠保證數據的正確性與完整性。
約束能夠分爲以下幾類:
1惟一性約束
2非空約束
3主鍵約束
4外鍵約束
5檢查約束

約束具備字段級語法與表級語法。

一、惟一性約束

惟一性約束保證約束列(一列或多列)的值不能出現重複。惟一性約束容許加入多個null值。由於MySQL中,null不等於任何值,包括其自身。所以,多個null值,彼此也是不等的。

字段級語法:

若是不存在建立表
create table if not exists t(
	id int primary key,
    age int unique
);

  若是表存在,刪除。
  drop table if exists t;

 

insert into t(id, age) values (1, 1);
#錯誤,違法惟一性約束。
#insert into t(id, age) values (2, 1);
insert into t(id, age) values (3, null);
#容許插入多個null值。
insert into t(id, age) values (4, null);
select * from t;

表級語法:

惟一性約束也能夠做用於多個字段。看成用於多個字段時, 只要多個字段的值不全相等,則認爲是不重複的。

create table t(
	id int primary key,
    age int,
    name varchar(20),
    unique key (age, name)
);

與表級語法unique key (age, name)不一樣,對於表級語法, age,name只要有一個字段值不一樣便可,對於字段級語法, age與name兩個字段值都不容許重複。

在建表以後增長惟一性約束:

對於建表以後加入的約束,必定要保證當前表中的數據  沒有破壞該新增的約束,不然,約束就沒法加入成功。

alter table t add unique key(age, name);
alter table t modify age int unique;

刪除惟一性約束
alter table t drop index age;

二、非空約束

非空約束表示字段不容許爲null值,該約束只有字段級語法,沒有表級語法。

create table t(
id int primary key,
age int not null
);

在建表以後指定非空約束

create table t(
    id int primary key,
    age int
);
alter table t modify age int not null;  

刪除(取消)非空約束。
alter table t modify age int null;

三、主鍵約束

主鍵字段既不能爲null,也不能重複。主鍵約束就是惟一性約束+非空約束。

字段級語法:

create table t (
id int primary key
);

表級語法:

create table t (
	id int,
    name varchar(10),
    primary key(id, name)
    #咱們能夠給主鍵命名,但僅僅是語法上支持,功能上不支持。
    #無論咱們如何命名,MySQL主鍵名都是primary。
    #primary key pk(id, name)
);

  當咱們使用多個字段充當主鍵(聯合主鍵),做爲主鍵的多個字段只要不一樣時相同,就認爲是不重複的,可是,每一個字段都不容許爲null。

建表以後增長主鍵:

create table t(
id int
);
alter table t add primary key(id);
alter table t modify id int primary key;

刪除主鍵:

alter table t drop primary key;

四、外鍵約束:

若是B表中B1字段參照A表中的A1字段,則咱們稱B表爲從表,A表爲主表。B1字段的值或者爲null,或者必須是A1字段中存在的值。A1字段必須是主鍵約束,或者是惟一性約束。

圖書表
create table book(
id int primary key,
name varchar(30),
author varchar(30)
);

借書表
#字段級語法,MySQL僅支持語法,不支持功能。
create table borrow(
id int primary key,
book_id int references book(id),
borrow_person varchar(30)
);

#表級語法,MySQL支持
drop table if exists borrow;
create table borrow(
id int primary key,
book_id int,
borrow_person varchar(30),
foreign key(book_id) references book(id)
#也能夠自定義外鍵的名字。
#constraint fk foreign key(book_id) references book(id)
);

insert into book(id, name, author) values(1, 'Java', 'abc');
insert into book(id, name, author) values(2, 'C++', 'def');
insert into book(id, name, author) values(3, 'C#', '張三');
insert into book(id, name, author) values(4, 'Hadoop', '小李');
select * from book;
insert into borrow(id, book_id, borrow_person)
values (1001, 3, '學生A');
#錯誤,違反外鍵約束。
#insert into borrow(id, book_id, borrow_person)
#values (1002, 5, '學生B');
insert into borrow(id, book_id, borrow_person)
values (1002, null, '學生B');

update book set id=10 where id=3
delete from book where id=3;

  在建表以後增長外鍵:

create table borrow(
id int primary key,
book_id int,
borrow_person varchar(30)
);
alter table borrow add foreign key(book_id) references book(id);

指定外鍵名
alter table borrow add constraint fk   foreign key(book_id) references book(id);
刪除外鍵

alter table borrow drop foreign key fk;

當主表的某條記錄被從表所參照時,當主表記錄修改或刪除時,
從表的表現方式(行爲):
1restrict 當主表記錄修改或刪除時,拒絕執行。
2cascade 當主表記錄修改或刪除時,從表隨之也修改或刪除。
3set null 當主表記錄修改或刪除時,從表記錄設置爲null值。
4no action 等價於restrict
默認的行爲爲:restrict

   五、檢查約束(MySQL僅支持語法,不支持功能)

create table t(
    id int primary key,
    age int,
    check (age > 0)
);
insert into t (id, age) values (1, -2);
select * from t;

  

約束的表級語法與字段級語法。

1 相對於表級語法,字段級語法更簡單些。
2 字段級語法只能做用於單個字段,而表級語法能夠做用於多個 字段。例如:聯合主鍵。
3 字段級語法不能爲約束命名,而表級語法能夠爲約束命名。

 

5、union

union 用於合併多個結果集。

要求多個結果集的字段類型與字段數量一致。

union distinct 會去掉結果集中的重複記錄。

union all 不會去掉結果集中的重複記錄。

默認爲union distinct

優先考慮使用union all(性能會好一些)。

select * from student
select * from stay;
select id from student union select id from stay;
select id from student union all select id from stay;

6、子查詢

子查詢即查詢中還有查詢(嵌套查詢)
根據子查詢出現的位置,能夠將子查詢分爲兩類:
1 出如今from以後,做爲臨時的數據表。
2 出如今where(having)以後,做爲過濾條件。

子查詢須要使用()括起。

子查詢根據查詢結果記錄條數,能夠將子查詢分爲:
1 單行子查詢 返回一條記錄
2 多行子查詢 返回多條(一條)記錄。

select id from (select id, name from student) x;
#查詢與張三年齡相等的學生
#select id, name from student where age = 張三的年齡
#張三(id爲1)的年齡?
#select age from student where id = 1;
#改進:
#select id, name from student where age =
#(select age from student where id = 1)
select * from student
select age from student where id = 2;
select id, name from student where age = 20;
select id, name from student where age =
(select age from student where id = 2);

  

#=, >, <, >=, <=, <>(!=),要求後面的子查詢是單行子查詢
#即最多隻能返回一條記錄。

#錯誤
#select id, name from student where age =
#(select age from student )

#any 表示任意一個(隨便一個)
select id from student where id >
any (select id from stay)
#大於任意一個,至關於大於最小的。
select id from student where id >
(select min(id) from stay);

#all表示全部的select id from student where id >all (select id from stay);#大於全部的,至關於大於最大的。select id from student where id >(select max(id) from stay);#some 任意一個,等價於any#in 在集合中(與集合中任意一個值相等)select id from stayselect id from student where id in (1, 2, 3);select id from student where id in(select id from stay);#exists 返回true或false,子查詢有記錄返回true,沒有記錄返回false。select id from student s where exists(select id from stay where id = s.id)

相關文章
相關標籤/搜索