首页 > 代码库 > mysql的复习与进阶
mysql的复习与进阶
-- mysql的复习与进阶
-- 创建一个结构完整的表
create table tab1(
id int(5) not null auto_increment primary key comment "这是ID",
name varchar(20) not null default "ran",
age int(2) not null
);
-- 在id不能加default
-- 复制表
create table tab2 select * from tab1;
-- 只复制结构,不复制内荣
create table tab2 like tab1;
-- 增加字段
alter table tab1 add sex varchar(2) not null;
-- 删除字段
alter table tab1 drop sex;
-- 修改字段
alter table tab1 change name myname varchar(20) not null;
-- 增加主键
alter table tab1 add primary key (id);
-- 修改表明
alter table tab1 rename to tab11;
-- 插入数据
insert into tab1 values(null,"zhangran","23");
-- 查询数据
-- limit
select * from tab1 limit 1;
-- 从第一个开始显示,显示一个
select * from tab1 limit 1,1;
-- 排序
--order by asc|desc
select * from tab1 order by name asc;
-- 更新数据
update tab1 set name="zhangranran",age="111" where name="zhangran" [order by][limit]
-- 删除数据
delete from tab1 where name="zhangran";
-- 此处要注意一点,truncated也可以当delete使用,而且比delete要快,是一种数据定义语言,但是不能摆正数据的安全性
-- truncated之后的自增长是重新开始的。
-- 连接
-- 交叉连接
select * from tab1,tab2;
-- 所有的都能查出来,冗余的部分特别多
-- 内连接
select tab1.name,tab2.myname from tab1 join tab2 on tab1.id=tab2.id;
-- 加一个别名select * from tab1 a join tab2 b where tab1.id=tab2.id;
-- 左连接跟右连接此处略了啊
-- 自连接
-- 需要加一个别名
select a.name,b.name from tab1 a,tab1 b where a.id=b.id;
-- 子查询
select * from tab1 where name=(select name from tab2 where name="zhangran");
-- 子查询做派生表
select * e.name from (select name from tab2) as e;
-- 查询中的IN应用
select * from tab1 where name in(select name from tab2);
-- exists的使用,此时子查询作为条件,如果有返回值说明是真,无返回值是假
select * from tab1 where exists (select name from tab1 where id=1);
-- 事务处理
-- 把几条语句作为一个整体
-- 每一个都执行成功了才算是事务的成功处理
-- 否则返回最初状态
start transaction
insert into tab1 values(null,"zhangdayi",22);
update tab1 set age=11 where name="zhangdayi";
commit
-- 想要撤销这个事务
rollback
-- MySQL管理
-- 数据备份
-- 用户权限
-- 访问控制
-- 性能优化
-- 数据备份
-- 备份某个数据库的一个表
mysqldump -u root -p111111 wangluo tab1 >D:/mysql.sql
-- 备份某个数据库里面的所有的表
mysqldump -u root -p111111 wangluo >D:/mysql.sql
-- 一次性备份多个数据库
mysqldump -u root -p111111 --database db1 db2 >D:/mysql1.sql
-- 需要特别注意的是database是单数而且它的前面是双横杠
-- 将数据库中的所有的表备份
mysqldump -u root -p111111 --all --database >D:/mysql2.sql
-- 将SQL文件导入到数据库
source d:/aaa/bbb/ccc.sql;
-- 用户的权限及访问控制
-- 简单的举两个例子
grant all privileges on *.* to ‘newuser‘ identified by ‘111111‘ with grant option;
grant update,select on *.* to ‘newuser‘ identified by ‘111111‘;
-- 性能优化
-- 加索引,在查询操作时优化
-- 优化数据库服务
mysql -verbose -help
-- 记住,该指令不是在mysql环境下输入的是在cmd下输入的
-- MySQL的基础知识大概就这么多,关键是勤练,多琢磨,以后记得常回过头来看看!!!!!!!!!!!!!!!!!!!!
-- MySQL的存储过程
-- declare生命局部变量
delimiter //
CREATE PROCEDURE pro(IN myid INT);
BEGIN
DECLARE name VARCHAR(20);
SELECT id INTO myid FROM tab1 WHERE name="zhangran";
SELECT myid;
END
//
CALL pro(1);
//
-- 用set命令赋值
delimiter //
CREATE PROCEDURE pro(IN num1 INT,IN num2 INT);
DECLARE num INT;
SET num=num1+num2;
SELECT num;
END
//
-- 流程控制语句 IF
delimiter //
CREATE PROCEDURE pro(IN type VARCHAR(20));
IF type="a" THEN SELECT "a等级";
ELSEIF type="b" THEN SELECT "b等级";
ELSE SELECT "c等级";
END IF;
END
//
-- 流程控制语句 CASE
delimiter //
CREATE PROCEDURE pro(IN num INT);
BEGIN
CASE num
WHEN 1 THEN SELECT "1等级";
WHEN 2 THEN SELECT "2等级";
WHEN 3 THEN SELECT "3等级";
END CASE;
END
//
-- 循环语句之LOOP
delimiter //
CREATE PROCEDURE pro(IN num INT);
BEGIN
lable : LOOP
SET num=num+1;
IF num>10 THEN LEAVE lable;
END IF;
END LOOP;
SET @a=num;
END
//
CALL pro(2);
//
SELECT @a;
//
-- 循环之WHILE
delimiter //
CREATE PROCEDURE pro();
BEGIN
DECLARE num INT DEFAULT 0;
WHILE num<10 DO;
SET num=num+1;
END WHILE;
SELECT i;
END
//
-- 循环之REPEAT
-- 类似于do while循环,无论如何都是先执行一步的
delimiter //
CREATE PROCEDURE pro();
BEGIN
SET @num=0;
REPEAT @num=@num+1 UNTIL @num>10;
END REPEAT;
END
//
-- 查看存储过程的相关信息
-- 查看创建语法信息
show create procedure pro\G
--查看存储过程的特征
show procedure status;
-- 修改存储过程 用alter,这一部分掌握的不太全面!!!!!!!!!!!!!
alter procedure mypro
sql security invoker
-- 删除存储过程 用drop
DROP PROCEDURE IF EXISTS pro;
-- 触发器-------------------
-- MySQL5 开始计入了触发器技术
-- 触发器无参数
-- 同一个动作不能触发两次
delimiter //
CREATE TRIGGER myter
BEFORE INSERT
ON tab1
FOR EACH ROW
BEGIN
INSERT INTO tab2 SET name=NEW.name;
UPDATE tab3 SET name="newname" WHERE name=NEW.name;
END
//
-- 上面的触发器经过验证无任何错误!!!
-- 查看触发器
show triggers\G
-- 删除触发器
drop trigger myter;
-- 另外当前尚无法修改触发器,故只能删除重建的方式来更新
-- 游标--------------
-- 游标部分比较复杂,而且并不常用,以后再逐渐补充吧
-- 视图---
-- 视图是根据已经存在的表,经过一定的筛选所组成的,这样可以有选择的让用户看到或是修改部分数据不至于让数据完全曝光
-- 演示实例
create table user(id int not null,name varchar(20) not null,address varchar(50) not null,age int not null,tel varchar(11) not null);
-- 该表中的个人信息,名称,住址可以公开,但是年龄跟电话不愿意公开,可以建立一个视图
create view myview as select name,address from user;
select * from myview;
-- 这样就达到了目的
-- 查看视图的创建语法
show create view myview\G
-- 删除视图
drop view myview;
-- 差不多就这些吧,以后会慢慢补充的,还是记得有时间多回过头来看看