數據庫的基本操作

數據庫的基本操作

數據庫的操作:
#增加數據庫
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;
//子連接方式的操作數據記錄數遠小於內連接方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章