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中,存储过程和函数的区别,
一个是名称不同,
二个就是存储过程没有返回值.
浙公网安备 33010602011771号