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)