數據庫的基本操作
數據庫的基本操作
數據庫的操作:
#增加數據庫
create database database_name;
#查看數據庫
show databases;
use database_name;
#刪除數據庫
drop database database_name;
引擎:
#查看存儲引擎
show engines;
表的操作:
#增加表(先指定在那個數據庫下use database_name)
create table table_name(
id int(10),
name varchar(20),
birth date
);
#查看錶定義(describe=desc)
desc table_name;
#查看錶詳細定義
show create table table_name;(\G)
#用查詢語句查看錶內的數據
select * from table_name;
#修改表名
alter table old_table_name rename new_table_name;
#增加字段
alter table tab_name add detail varchar(80) after ...;
#刪除字段
alter table tab_name drop detail;
#修改字段數據類型
alter table tab_name modify detail int(10);
#修改字段位置
alter table tab_name modify detail int(10) after.../first;
#修改字段名稱
alter table tab_name change detail detailer varchar(20);
#添加表的約束
create table table_name(
id int(20) primary key auto_increment,
name char(20) not null,
age int(10) default 20,
address varchar(80),
class varchar(20),
constraint uk_address unique(address)
/constraint fk_class foregin key(class) references othertable_name(class_id)
);
索引的操作:
#創建唯一索引
create table table_name(
id int(10),
name char(10),
age int(8),
unique index index_id(id)
);
#創建全文索引
create table table_name(
id int not null,
name char(30) not null,
info varchar(255),
fulltext index FullTxtIdx(info)
)engine=MyISM;
只有MyISAM存儲引擎支持FULLTEXT索引,並且只爲CHAR、VARCHAR和TEXT列。索引總是對整個列進行,不支持局部(前綴)索引。
#在已經存在的表中創建索引
create index index_id
on table_name(info);
或alter table table_name
add index index_id(info);
#在已經建立的表中創建多列索引
alter table table_name
add index index_MuitiIdx(id,name,age);
由結果可以看到,id、name和age字段上已經成功建立了一個名爲MultiIdx的組合索引。
組合索引可起幾個索引的作用,但是使用時並不是隨便查詢哪個字段都可以使用索引,而是遵從“最左前綴”:利用索引中最左邊的列集來匹配行,這樣的列集稱爲最左前綴。例如這裏由id、name和age 3個字段構成的索引,索引行中按id/name/age的順序存放,索引可以搜索下面字段組合:(id, name, age)、(id,name)或者id。如果列不構成索引最左面的前綴,MySQL不能使用局部索引,如(age)或者(name,age)組合則不能使用索引查詢。
在table_name表中,查詢id和name字段,使用EXPLAIN語句查看索引的使用情況:
explain select * from table_name where id=1 AND name='joe' \G
#校驗索引是否創建成功
show create table table_name\G
#校驗索引是否被使用#
explain
select * from table_name where id=1\G
#查詢語句
select * from table_name where id=1\G
#刪除索引
drop index index_id on table_name;
視圖:
#創建view數據庫
create database view; //創建view數據庫
use view; //使用view數據庫
#創建視圖
create view view_name
as select * from book; //創建名爲view_name的視圖,封裝了查詢語句
select * from view_name; //查詢視圖,將視圖當表一樣執行查詢語句
#創建各種視圖
create view view1
as
select name
from t_student order by id desc; //降序排列顯示
select * from view1;
create view view2
as select count(name)
from t_student; //聚合(sum、min、max、count等函數)
select * from view2;
#表內連接查詢
create view view4
as select s.name
from t_student as s,t_group as g
where s.group_id=g.id and g.id=2;
select * from view4;
#表外連接
create view view5
as select s.name
from t_student as s left join t_group as g on s.group_id=g.id
where g.id=2;
select * from view5;
#記錄聯合(union/union all)
create view view6
as
select id,name from t_student
union all
select id,name from t_group;
select * from view6;
#查看視圖(在選擇該視圖數據庫後use view)
#查看視圖名(show tables)
show tables;
#查看視圖詳細信息(包括數據庫裏的所有表和視圖)
show table status
from view
like "view_name" \G //可不要
#查看視圖定義信息
show create view view_name;
#查看視圖設計信息
desc view_name;
#用查詢語句查看視圖內的數據
select * from view_name;
#利用系統表information_schema查看視圖信息
use information_schema;
select * from views
where table_name='view_name';
#修改視圖(create or replace)
create or replace view view_name
as select * from table_name;
select * from view_name;
或(alter)
alter view view_name
as select * from table_name;
select * from view_name;
#刪除視圖
drop view view_name,view2;
#操作表內數據
#利用視圖更新數據
如果對視圖增加或者刪除記錄,實際上是對其基本表增加或者刪除記錄。
當視圖來自多個基本表時,不允許添加、刪除數據。
#增加數據
insert into view_name (id,name) values (1,'yx'),(2,'wq');
#刪除數據
delete from view_name
where id=1;
#更新數據
update view_name
set name='wq'
where id=1;
使用MySQL執行update或delete的時候報錯:Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.
在使用mysql執行update的時候,如果不是用主鍵(primary key)當where語句,會報如下錯誤,使用主鍵用於where語句中正常。
修改數據庫模式:
SET SQL_SAFE_UPDATES = 0;
如果想要提高數據庫安全等級,可以在恢復回原有的設置,執行命令:SET SQL_SAFE_UPDATES = 1;
例子:創建視圖來自兩個表
create table student(
s_id int,
name varchar(40)
);
create table stu_info(
s_id int,
glass varchar(40),
addr varchar(90)
);
insert into student values(1,'wq'),(2,'yx'),(3,'wxq');
insert into stu_info values(1,'1ban','yuhuan'),(2,'2ban','linhai'),(3,'3ban','taizhou');
create view stu_glass(id,name,glass)
as
select student.s_id,student.name,stu_info.glass
from student,stu_info
where student.s_id=stu_info.s_id;
select * from stu_glass;
觸發器:
#創建觸發器
create trigger tri_name
before/after insert
on table_name for each row
insert into ...
#多條執行語句
delimiter $$
create trigger tri_name
before/after insert
on table_name for each row
begin
insert into...;
...
end
$$
先執行上面語句,再執行最後一行(delimiter和;間有空格)
delimiter ;
#查看觸發器
show triggers \G
通過系統表查看觸發器
select * from triggers where trigger_name ='...' \G
#刪除觸發器
drop trigger tri_name;
數據操作:
#插入數據
insert into t_name (id,name) values(1,'yx');
#插入多條記錄
insert into t_name values(......),(......),(.......);
#插入查詢結果
insert into t_name(id,name)
select id,name
from t_name2;
#刪除表內數據
delete from t_name; //所有數據
delete from t_name
where id=1;
#更新表內特定數據記錄
update t_name
set name='yx'
where id=1;
#表內查詢記錄
select * from t_name;
select distinct job from t_name; //避免重複數據查詢
select name sal*12 as yearsalary from t_name; //實現四則運算並修改字段
select concat(name,'的年薪爲:',sal*12)yearsalary from t_name; //設置固定格式顯示
where id=1 or id=2 or id=3 or id=4 or id=5;
等價於where id in(1,2,3,4,5);
#模糊查詢
select name from t_name
where not name like '_A%'; //第二個字符不是A
where name like '%A%'; //包含A的所有字符
order by id asc(desc),name desc; //默認升序asc
limit 5; //限制數據條數
limit 5,5; //從第6條數據開始顯示5條數據
#統計函數
#統計數量(namber、average、sumvalue、maxval、minval爲字段名稱)
select count(*) number from t_name;
select count(loc) number from t_name where not loc='shanghai'; //條件記錄條數
#統計平均值
select avg(comm) average from t_name (where...);
#統計求和
select sum(comm) sumvalue from t_name (where...);
#統計最大值、最小值
select max(sal) maxval, min(sal) minval from t_dept;
#統計分組
select id,group_concat(name) names from t_name group by id; //設置固定格式
#多表數據記錄查詢(不建議,建議用子查詢)
內連接(inner join...on)
select e.dname empoyeename,e.job, l.dname loadername
from t_employee e inner join t_employee l //取別名
on e.mgr=l.empno;
inner join。。。on=from。。。where
外連接(left/right/full [outer] join...on)
select e.dname,e.job,l.dname loadername
from t_employee e left join t_employee l
on e.MGR=l.empno; //按e建立連接,即使e.mgr對應爲空,也要顯示出來
select e.empno,e.dname,e.job,d.dname,d.loc
from t_dept d right join t_employee e
on e.deptno=d.deptno;
#合併查詢
select * from t_name1
union (all)
select * from t_name2;
#子查詢
select * from t_employee
where sal>(
select sal from t_employee where dname='wq');
#多列子查詢
select dname,sal,job from t_employee
where (sal,job)=(
select sal,job from t_employee where dname='wq');
(in)
select * from t_employee
where deptno not in(
select deptno from t_dept);
(any)
select dname,sal
from t_employee
where sal>any(
select sal from t_employee where job='manager');
(all)
(exists)
select d.deptno,d.dname
from t_dept d
where exists( //當()裏存在時
select * from t_employee where deptno=d.deptno);
#多行多列子查詢
(內連接方式)
select d.deptno,d.dname,d.loc,count(e.empno) number,avg(e.sal) average
from t_employee e inner join t_dept d
on e.deptno=d.deptno
group by d.deptno desc,d.dname,d.loc;
select count(*) number from t_employee e ,t_dept d;
(子連接方式)
select d.deptno,d.dname,d.loc,number,average
from t_dept d inner join(
select deptno,count(empno) number,avg(sal) average
from t_employee
group by deptno desc) e
on d.deptno=e.deptno;
select count(*)number
from t_dept d,(select deptno,count(empno) number,avg(sal) average
from t_employee
group by deptno) e;
//子連接方式的操作數據記錄數遠小於內連接方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.