八度

心随所动,勿失所爱!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Insert into ‘msa’ (id,dd)values(‘dsf’dsf);   Update msg set id=2,name=’j’ where co=2;

Delete from msg where id=2;   Select  *from msg  where 

条件语句:if 条件 then sql语句; end if;  while 条件 do   end while;

列的增Alter table 表名 add lie int; Alter table name add 列声明 ( after列之后)/(first)最前;

列的改alter table 表名change 被改的列名 列声明 ;        列声明--name int(4)

列的删alter table 表名 drop 列名;

 

解select name,sum(score<60) as gk,avg(score) as pj from stu group by name having gk>=2

 

Select  五种子句 之where

where  in (1,3)        where between 20 and 30  where sd>30 or sd<11 and sd>0

模糊查询 where name like ‘na%__’   %通配任意字符  _ 通配单一字符

Select  五种子句 之group by 分组  与聚合函数一起用

    Max求最大  min求最小   sum求总和   avg求平均  count求总行数 as 别名

Select id,max(price) from tb1 group by good_id; select sum(id) as zong from tb1 group by s_id

Select  五种子句 之having

having是在查询结果后再查询 select id,price as sheng from tb1 where sheng>200;错

select id,price-sprice as sheng from tb1 where id=3 having sheng>200;

Select  五种子句 之order by 排序  之limit

  desc降序  asc升序—默认 select id,price from tb1 where id=3 order by price,id desc limit 0,3

 

子查询:

Where型子查询:指把内层查询的结果作为外层查询的比较条件

Select go_id,cat_id,price from tb1 where price in(select max(price) from tb1 group by cat_id);

From型子查询:指把内层查询的结果当成临时表,供外层sql再次查询

select * from (select sum(score<60)as gk from tb1 group by name )as temp;加 ’as’临时表名

  exists子查询:把外层的查询结果拿到内层,看内层的查询是否成立

    select*from tb1 where exists(select * from tb2 where tb1.id=tb2.id);

 

union:联合

   作用------把多次查询结果合并起来      要求-----可以来自于多张表,但表列数要一致

   Select *…………… union select …………….;    列名以第一个sql语句的列名为准

   如果不同的语句中取出的行,有完全相同(每个列的值都相同),那么相同的行会合并(去重复);如果想不去重复,可以加all来指定。

比如:select count(id) from (select * from tb1 union all select * from tb2)as tp group by name;

   如果子句中含有order by, limit,子句需加小括号.

左连接:以左连接为准,去右表找匹配数据,找不到匹配用Null补齐

   Select 列1,列N from

tableA left join tableB on tableA.列 = tableB   [此处表连接成一张大表,完全当普通表看]

右连接

   Select 列1,列N from

tableA right join tableB on tableA.列 = tableB

  相互转换 A left join B======B right join A

内连接:查询左右表都有的数据,即左右连接的交集。

   Select 列1,列N from tableA inner join tableB on tableA.列 = tableB

面试题:

 

 

 

 

视图:create view 视图名 as select语句   删drop view 名  改alter view 名 as select…

  视图与表的关系:视图是表的查询结果,表的数据改变了会影响视图的结果,视图的增删改也会影响表,但是视图并不是总是能增删改的。比如视图中的平均值 改不了。

视图的数据与表的数据一一对应时可以修改,对于视图的insert操作,视图必须包含表中没有默认值得列。

视图的Algorithm: Algorithm=merge/temptable/undefined

  Merge:当引用视图时,引用视图的语句与定义视图的语句合并。当创建一个视图时,然后视图里进行分组查询,两语句会合并起来对原表进行操作。

  Temptable:当引用视图时,根据视图的创建语句建立一个临时表。当创建一个视图时,然后视图里进行分组查询,前者对原表操作,后者则只会对临时表操作。如:create algorith=temptable view g2 as select go_id from tb1 order by id; select* from g2 group by ca_id;

  Undefined:未定义,自动,让系统帮你选。

 

触发器`:trigger  监视(增删改)---(after/before)---触发(增删改)insert/update/delete

Create trigger name after/before insert/update/delete on 表名

for each row(固定写法)  begin n个sql语句(增删改)范围内 end;

结束符delimiter 默认是分号; 表示遇见;号可以执行。。。更改 delimiter // (各种符号)

删除触发器 drop trigger name;   查看触发器:show triggers;

如何在触发器引用行的值:对于insert而言,新增的行用new来表示,行中每一列的值用new.列名 来表示。对于delete而言,用old.列名 来表示。对于update而言,被修改的行,修改前的数据用old.列名 来表示,修改后的值用new.列名 来表示。

Create trigeer g1 after update on tb1 for each row begin update tb2 set num=num+old.m-new.m where id=old.gid;end//

Create trigger g2 before insert on tb1 for each row begin if new.m>5 then set new.m=5;end if; update tb2 set num=num-new.m where id=new.gid;end//

Before与after的区别:after是完成数据的增删改再触发,触发语句晚于监视的增删改,无法影响前面的增删改动作。before是先完成触发再增删改,有机会判断修改即将发生的操作。

 

存储引擎:crate table t(id int)engine myisam存储引擎 charset utf8 字符集;

常见引擎myisam批量插入速度高,不支持事务安全,支持全文索引,锁机制--表锁

innoDB速度低安全高,支持事务安全 支持全文索引(5.6支持),锁机制—行锁

事务:原子性:一组操作要么都成功执行,要么都不执行。

  隔离性:在所有操作没有执行完毕之前,其他会话不能够看到中间改变的过程。

一致性:事务发生前和发生后,数据的总额依然匹配。

持久性: 事务产生的影响不能撤销。

操作步骤:事务的引擎选用innoDB; à  开启事务start  transaction; à  sql语句;

   à(结束)  commit提交/rollback回滚(取消所有操作);

有一些语句会照成事务的隐性的提交。比如 再次用start transaction

 

备份与恢复

备份:系统自带的备份功能, mysqldump 可以导出库,表;

cmd中cd命令:cd路径 定位到目录 cd\ 返回根目录(c,d,e盘)  cd..返回到上一级目录

在Cmd中进入mysql安装目录下的bin目录下,才可以使用mysqldump命令。先进入cmd然后转到 e:  然后进入mysql安装目录的bin下cd E:\JAY\mysql\bin 再操作以下命令

例1: 导出库下面的表  导出的是建表语句及insert语句  cmd命令行

Mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 地址/备份文件名称

例:备份数据库taobao里的表 mysqldump –uroot –proot taobao tb1 tb2 > D:\\beifen.sql

例2:导出一个库下面的所有表?

Mysqldump -u用户名 -p密码 库名 > 地址/备份文件名称

例3: 如何导出以库为单位导出?

Mysqldump -u用户名 -p密码 -B 库1 库2 库3 > 地址/备份文件名称

例4: 如何导出所有库?

Mysqldump -u用户名 -p密码 -A > 地址/备份文件名称

恢复:

1:登陆到mysql命令行

对于库级的备份文件  Mysql> source 备份文件地址

对于表级的备份文件  Mysql > use 库名   Mysql> source 备份文件地址

2:不登陆到mysql命令行 cmd

针对库级的备份文件  Mysql  -u用户名 -p密码 < 库级备份文件地址

针对表级的备份文件  Mysql  -u用户名 -p密码 库名 < 表级备份文件地址

 

索引与优化

索引:是针对数据所建立的目录.

作用: 可以加快查询速度

负面影响: 降低了增删改的速度.

 

案例:设有新闻表15列,10列上有索引,共500W行数据, 如何快速导入?

1:把空表的索引全部删除

2:导入数据

3:数据导入完毕后,集中建索引.

索引的创建原则:

1:不要过度索引

2:在where条件最频繁的列上加.

3:尽量索引散列值,过于集中的值加索引意义不大.

 

索引的类型

普通索引: index 仅仅是加快查询速度.

唯一索引: unique index 行上的值不能重复

主键索引: primary key 不能重复.

主键必唯一,但是唯一索引不一定是主键.

一张表上,只能有一个主键, 但是可以用一个或多个唯一索引.

全文索引 : fulltext index

 

查看一张表上所有索引

Show index from 表名

建立索引

Alter table 表名 add index /unique/fulltext [索引名(可选默认列名)] (列名) 加括号

Alter table 表名  add primary key (列名)   // 不要加索引名,因为主键只有一个

删除索引

删除非主键索引:Alter table 表名 drop index 索引名;

删除主键: alter table 表名 drop primary key

 

关于全文索引的用法

Match (全文索引名) against ('keyword');

关于全文索引的停止词

全文索引不针对非常频繁的词做索引,如this, is, you, my等等.

全文索引:在mysql的默认情况下, 对于中文意义不大.因为英文有空格,标点符号来拆成单词,进而对单词进行索引.而对于中文,没有空格来隔开单词,mysql无法识别每个中文词.

 

存储过程: procedure

概念类似于函数,就是把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现.在封装的语句体里面,可以用if/else, case,while等控制结构.可以进行sql编程.

查看现有的存储过程:

Show procedure status;

删除存储过程

Drop procedure 存储过程的名字

调用存储过程

Call 存储过程名字();

例子:

第1个存储过程 ,体会"封装sql"

delimiter $;

create procedure p1()

begin

   select * from g;

end$

第2个存储过程, 体会"参数"

create procedure p2(n int)

begin

   select * from g where num>n;

end$

第3个存储过程,体会"控制结构"

create procedure p3(n int,j char(1))

begin

  if  j=’h’ then

select * from g where num>n;

  else

select * from g where num<n;

end if;

end$

第4个存储过程,体会"循环"

create procedure p4(n smallint)

begin

  declare i int;   // declare 声明变量

  declare sum int;

  set i=1;

  set sum=0;

  while i<n do

set sum=sum+I;

set i=i+1;

  end while;

  select sum;

end$

 

在mysql中,存储过程和函数的区别,

一个是名称不同,

二个就是存储过程没有返回值.

 

posted on 2012-11-04 23:54  八度  阅读(172)  评论(0)    收藏  举报