mysql 总结

#1.显示所有的表
show TABLES
#2.显示表结构
 desc student
#3.导入pet.txt
drop table  if EXISTS A;
create table A
(
  id int  auto_increment,
  name VARCHAR(36),
  age  int default 18,#设置默认值
  borndate datetime,
  primary key(id)
)
#命令模式下
mysql>load data local infile 'd:/pet.txt' into table A

#4.AND和OR可以混用,但AND比OR具有更高的优先级

#5.修改表为A表增加一个sex字段 alter table   table1 add id int unsigned not Null auto_increment primary key
 alter  table A add column  sex  char(1);
#6.修改表的age类型
   alter table A modify column age  varchar(36)
   #原字段age  现修必为newage  int型
   alter  table A change age  newage int  
   #删除表的newage字段
   alter  table A    drop  newage; 
   #修改表名  
   ALTER TABLE A RENAME TO newa;     




#7.DISTINCT检索出每个唯一的输出记录:
#8.为了排序结果,使用ORDER BY子句默认排序是升序要想以降序排序DESC(降序 )关键字:。
#9.常用的函数
SELECT  CURDATE();#当前日期2015-06-29
select  CURTIME();#当前时间 10:55:05
SELECT  now();    #当前日期和时间2015-06-29 10:55:49
SELECT RIGHT(CURDATE(),5)#提取当前日期最右边的5个字符

SELECT year('2015-06-01')#当前日期的年
SELECT MONTH('2015-06-01')#当前日期的月
SELECT  day('2015-06-01') #当前日期的日
SELECT  DAYOFMONTH('2015-06-1')#当前日期是这个月的第几天

SELECT DATE_ADD('2015-06-01',INTERVAL 1 month)#当前日期加1月
 
SELECT DATE_ADD('2015-06-01',INTERVAL -1 month)#当前日期减1个月
 
#10.NULL意味着“没有值”或“未知值”,你不能使用算术比较 操作符例如=、<或!=。
#只能用 is null 或 is not null

#11.SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)
#而应使用LIKE或NOT LIKE比较操作符。

#12.由MySQL提供的模式匹配的其它类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)

CREATE TABLE t1 
(
 year YEAR(4), 
 month INT(2) UNSIGNED ZEROFILL,
 day INT(2) UNSIGNED ZEROFILL
);
INSERT INTO t1 VALUES(2000,1,1),
                     (2000,1,20),
                     (2000,1,30),
                     (2000,2,2),
                     (2000,2,23),
                     (2000,2,23);
#
drop table  t1
create table  t1
(
  name varchar(36),
  socre  int
)
SELECT  * from t1

insert  into t1 (name) VALUES ('赵七'),('李四',60),('王五',55);

SELECT  name ,(CASE  when socre>80 then '优秀' when socre>=60 then '良好'when socre is null then '缺考' else '不及格' end ) as socre  from t1

SELECT  * from t1

drop table  t1

create  table t1
(
  id  int auto_increment,
  name varchar(36),
  dept  int ,
  primary key(id)
)

create  table dept2
(
  dept int auto_increment,
  deptname varchar(36),
 primary key(dept)
)

insert into t1 (name,dept) values ('张三',1),('李四',2),('王五',5)

insert into  dept2 (deptname)VALUES('一号部门'),('二号部门')

#如果查内空为null设置默认值
select  name,IFNULL(deptname,'未加入部门')deptname from t1  LEFT JOIN  dept2 on t1.dept=dept2.dept

select IF(1<2,'yes','no');#表达式为真yes,若为假no

#控制语句
#if --end if;
drop procedure if exists t_pro;
create procedure t_pro()
BEGIN
   if 2<3 then 
     SELECT 2;
   end if;
end;

# if elseif  end if;
drop procedure if exists t_pro;
create procedure t_pro()
begin
 set @a=5;
 if @a>3 then
    select @a;
 elseif @a<2 then
    select 2;
 else 
    select 1;
 end if;
end
call t_pro()
#case ..end;
 SELECT name,case when dept=1 then '一号部门' when dept=2 then '二号部门' else '其他部门' end from t1
#或
 SELECT name,case dept when 1 then '一号部门' when 2 then '二号部门' else '其他部门' end from t1

# loop  end loop;循环
drop procedure if exists t_pro;
create procedure t_pro()
begin
 declare a int default 1;
 label1: loop
    if a<6 then
     select a;
     set a=a+1;
  iterate label1;
    end if;
    leave label1;
   end loop label1;
end
#repeat ...end repeat
drop procedure if exists t_pro;
create procedure t_pro()
begin
  declare a int default 3;
  repeat
   select a;
   set a=a+1;
  UNTIL a>5 end repeat;
end

call t_pro()

create procedure pro()
begin
  declare a int default 3;
  repeat
   select a;
   set a=a+1;
  UNTIL a>5;
 end repeat;
end
#while
drop procedure if exists t_pro;
create procedure t_pro()
begin
 declare a int default 4;
 while a<10 do
   select a;
   set a=a+1;
 end while;
end
call t_pro()

#游标和存储过程==========================================================================
SELECT  * from t1
drop procedure if exists t_pro;
create  procedure t_pro()
BEGIN
  declare t_id int;
  declare t_name varchar(36);
  declare t_dept int;
  DECLARE cur_name_t1 CURSOR FOR SELECT  id,name,dept from t1;#游标
  OPEN cur_name_t1;#打开游标
  FETCH cur_name_t1 into t_id,t_name,t_dept;
  while t_name is not NULL do 
     update t1 set dept=dept+10 where id=t_id;
      FETCH cur_name_t1 into t_id,t_name,t_dept;
  end WHILE;
end;

#视图--表里-增加,删除,改对视图没有影响数据会同步(一张表或多张表)=========================== 
create view v_t1 as select id,name,dept from t1
create view v_t1 as SELECT  id,name,deptname from t1 LEFT JOIN dept2 on t1.dept=dept2.dept

#删除视图v_t1
drop view v_t1


#存储过程 in代表输入参数,out 输出参数=========================================================
drop procedure if exists pro;
CREATE PROCEDURE pro(IN num INT,OUT total INT)
BEGIN
    if num>0 THEN
       SELECT  dept into total  from dept2 where dept=num;
    end if;
    SELECT total;
END;

drop procedure if exists p_pro;
create procedure p_pro()
BEGIN
set  @num=2;
set @total=0;
call pro(@num, @total);
select @total;
end;
call p_pro()


#====函数========================================================================================
#格式化日期
drop function if exists f_getdate;
create function f_getdate(gdate datetime)
returns varchar(255)#返回值
BEGIN
  declare x varchar(255) default '';
  set x=date_format(gdate,'%Y年%m月%d日%h时%i分%s秒');
return x;
end;
#调用
SELECT f_getdate('2009-06-23 00:00:00');

#表分区============================================================================================
#表分区四种方式Range,List,Hash,KEY

#Range: values后的值只能递增2012,2013,2014,如果有主键分区字段必段放进去
drop table if exists t_student;
create table t_student
(
  id int(11) auto_increment,
  name varchar(36),
  born  datetime,
  primary key(id,born)
)partition by range(year(born))(
  partition p2012 values less than (2012),
  partition p2013 values less than (2013),
  partition p2014 values less than (2014),
  partition p2015 values less than  MAXVALUE
);
 insert  into t_student (name,born) VALUES ('张七','2011-02-02 00:00:00');
 insert  into t_student (name,born) VALUES ('李四','2013-02-02 00:00:00');
 insert  into t_student (name,born) VALUES ('王五','2014-02-02 00:00:00');
 insert  into t_student (name,born) VALUES ('赵六','2015-02-02 00:00:00');

#查看表分区根据表名
SELECT partition_name part,partition_expression expr,partition_description descr,table_rows 
FROM
  INFORMATION_SCHEMA.partitions 
WHERE
  TABLE_SCHEMA = schema() 
  AND TABLE_NAME='t_student';  


#List:按照部门分区10,20,30,但40部门没有此分区不能插入数据
create table emp
(
  empno varchar(20) not null,
  empname varchar(20),
  deptno   int,
  birthdate date,
  salary int
)partition by list(deptno)
(
 partition p1 values in (10),
 partition p2 values in (20),
 partition p3 values in (30)
)
insert into emp values('1000','张三',10,'19870202',8000);
insert into emp values('1000','李三',20,'19870202',8000);
insert into emp values('1000','王三',30,'19870202',8000);
insert into emp values('1000','赵三',40,'19870202',8000);
 
#HASH分区主要用来确保数据在预先确定数目的分区中平均分布
drop table if exists emp;
create table emp
(
  empno varchar(20) not null,
  empname varchar(20),
  deptno   int,
  birthdate date,
  salary int
)partition by hash(year(birthdate))
 partitions 4;


SELECT  * from emp

insert into emp values('1000','张三',10,'19860202',8000);
insert into emp values('1000','李三',20,'19870202',8000);
insert into emp values('1000','王三',30,'19880202',8000);
insert into emp values('1000','赵三',40,'19890202',8000);
SELECT partition_name part,partition_expression expr,partition_description descr,table_rows 
FROM
  INFORMATION_SCHEMA.partitions 
WHERE
  TABLE_SCHEMA = schema() 
  AND TABLE_NAME='emp';
  
#key分区按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用户定义的表达式,
#而KEY分区的哈希函数是由MySQL 服务器提供,服务器使用其自己内部的哈希函数,这些函数是基于与PASSWORD()一样的运算法则。
#并且KEY分区只采用一个或多个 列名的一个列表
drop table if exists emp;
create table emp
(
empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by key(birthdate)
partitions 4;

#======触发器==============================================================================================================
SELECT  * from emp
drop table tmp_b
create table tmp_b
(
  name varchar(36)
)

delimiter $
drop trigger if exists tri_emp;
create trigger tri_emp after insert 
on emp for each ROW
BEGIN
  insert into tmp_b VALUES (NEW.deptno); 
end$

insert into emp values('1008','刘易',50,'1999-02-02',6000);


create table g
(
 id int primary key auto_increment,
 name varchar(20),
 num int
)

create table o
(
  oid int primary key auto_increment,
  gid int,
  much int
)
insert into g(name,num)values('商品1',10),('商品2',10),('商品3',10);

#如果我们在没使用触发器之前:假设我们现在卖了3个商品1,我们需要做两件事
#1.往订单表插入一条记录.
#2.更新商品表商品的剩余数量
drop trigger if exists tg1;
create trigger tg1 after insert on o for each ROW
BEGIN
  update g set num=num-3 where id=1;
end;

SELECT * from o;
SELECT * from g;
DELETE from o

#对于insert而言,新插入的行用new来表示,行中的每一列的值用new.列名来表示。
drop trigger if exists tg2;
create trigger tg2
after insert on o
for each row 
begin
update g set num=num-new.much where id=new.gid;
end;

#第二种情况更新
#对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表示,old.列名可以引用被删除的行的值。;
#修改的后的数据,用new来表示,new.列名引用被修改之后行中的值。
drop trigger if exists tg3;
create trigger tg3 after delete on o for each row 
begin 
    update g set num=num+old.much where id=old.gid;
end;

#对于update而言:被修改的行,修改前的数据,用old来表示,old.列名引用被修改之前行中的值;
#修改的后的数据,用new来表示,new.列名引用被修改之后行中的值。
drop trigger if exists tg4;
create trigger tg4 after update on o for each row 
begin 
    update g set num=num+old.much-new.much where id=old.gid;
end;

#after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;

#before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作;

#创建索引
#1.添加PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
#2.添加UNIQUE(唯一索引)
ALTER TABLE `table_name` ADD UNIQUE (`column`)
#3.添加INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
#4.添加FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
#5.添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` ) 

#分析索引效率
EXPLAIN SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age='17'; 

#查看索引
show index from tblname;

#6.like语句操作

一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

#7.不要在列上进行运算

select * from users where YEAR(adddate)=2015

#8不使用NOT IN和操作

NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id


你可能感兴趣的:(存储过程,索引,游标,表分区)