****MySQL* ***下 ( 基本操做 )
insert into user_auths values(1, ‘martin’, md5(‘123456qweQWE’));**** *#使用内部函数md5 加密,一亿年马老师都无法破解*
*简单查询*
select 模板名 from class 另一个模板名=xxx;**** *#查询表class 中某一个字段的记录*
SELECT field1,field2,…,fieldn FROM tablename; //列出所有的字段,也可用*
SELECT DISTINCT field1,field2,…,fieldn FROM tablename;//某一模板列去重复的查询
select * from class where teacher in (‘Martin’,‘Rock’)**** *;* ****#查询class表中的teacher 域是martin 和Rock 的记录 查询表中teacher 模板含有martin ,Rock 的记录 使用NO T IN 来反向查询 也就是说不在这个集合中的数据
SELECT field1,field2,…,fieldn
FROM tablename WHERE fieldm BETWEEN minvalue AND maxvalue
select * from class where chinese between 80 and 90;**** *#查询成绩表中语文成绩在80 和 90 之间的学员记录* BETWEEN AND 为查询一个区间的关键字可以为时间为条件int数据为条件 不可以以中文字符为条件 NOTBETWEEN AND为反向查询 TBETWEEN OR 表示或的意思这个两个条件符合一个即可 比如 **
select * from class where chinese between xx<80 OR xx>90;或者操做
*LIKE模糊查询*
SELECT teacher FROM class WHERE teacher LIKE ‘%Ma%’;#查询class表中的teacher 域,包含重复记录****%为通配符可匹配0个或多个字符 必须添加通配符或者_(仅可以匹配一个字符); 条件中也可以添加 and 条件 NOT LIKE 取反查找不是以这个的所有数据
*对查询结果排序*
ELECT teacher FROM class WHERE teacher LIKE ‘%Ma%’ ORDER BY teacher ;对查询的结果配许 默认为从小到大排序 【[ASC|DESC]】ASC 升序DESC 降序
*.* *简单分组查询*****
利用group by 模板 来进行分组 这个模板最好是int类型
selsct sum(模板)from 表名;sum求和 对这个模板列求和 所有的数据为一组
selsct sum(模板)from 表名 group by 另一个模板;按照另一个模板来分组 求和 group by 条件 ****注意:****在具体进行分组查询时,分组所依据的字段上的值一定要具有重复值,否则分组没有任何意义。
selsct count(模板)from 表名 group by 另一个模板;求另一个模板的数据分别有几条 记录为空不统计 count(*)记录空值也算一条也进行统计
selsct 模板, avg(模板),avg(模板) from 表名 group by 另一个模板;可统计多个模板的平均值avg 为平均值 统计时忽略null的值
selsct 模板, max(模板),max(模板) from 表名 group by 另一个模板;按照分组来统计最大值 max为最大值
selsct 模板, min(模板),min(模板) from 表名 group by 另一个模板;按照分组来统计最大值 min为最小值
统计记录查询
selsct count(*)GROUP_CONCAT(模板 是字符类型) from 表名 group by 另一个模板;求另一个模板的数据分别有几条 记录为空不统计 GROUP_CONCAT()用来把这个字符类型的数据显示全面 当使用分组查询时如果查询的模板是一个字符型的会显示不全面 这个时候可以用统计查询
联合查询****
内连接
select *from 表名 inner join 另一个表名on 表名.模板名=另一个表名.模板名;注两个模板名必须 一个为另一个的外键必须有相同的 两个表联合起来查询
select *from 表名 AS xxxx inner join 另一个表名 AS xxxxx on 表名.模板名=另一个表名.模板名;AS给这两张表取别名 如果不想显示同样的数据可指定select选择的模板
自链接就是给自己这张表定义别名然后在和自己链接用and 添加条件
外连接
select *from 表名 AS xxxx LEFT join 另一个表名 AS xxxxx on 表名.模板名=另一个表名.模板名;左外链接
select *from 表名 AS xxxx RIGHT join 另一个表名 AS xxxxx on 表名.模板名=另一个表名.模板名;右外链接 顾名思义就是把两张表对接在一起无需条件 左外链接 以左边的表为准 右边长度不一样就制空 如果超出就 省略多的长度
合并查询(竖着)
SELECT field1,field2,…,fieldn FROM tablename1
UNION | UNION ALL
SELECT field1,field2,…,fieldn FROM tablename2; UNION | UNION ALL的区别就是不去重和去重 注查询时两个表的列数必须一样
子表查询
select teacher from class where id = (select class_id from student where name=‘小花’);#查询“小花”所在班级班主任的姓名*只能查询一条 在一张表中加入另一张表查询 条件为父表进行 子查询使用比较运算符时,select 子句获得的记录数不能大于*1条****!!!
带关键字IN的子查询 in表示在什么里面 not in 表示取反比如
select teacher from class where id in (select class_id from student where name=‘小花’);#查询“小花”所在班级班主任的姓名**** 可以查询多条
带关键字EXISTS的子查询 判断是否存在
select * from class where id=102 and exists (select * from student where class_id=102);**** *#如果102班存在学生记录,就查询102班的班级信息* 判断某个表中是否存在记录 如果存在就返回真否则返回假
带关键字ANY的子查询 关键字ANY表示满足其中任一条件。
select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ANY (select score from scholarship);**** *#查询能获得奖学金的学院记录*
带关键字ALL的子查询 关键字ALL表示满足所有条件
select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ALL (select score from scholarship);**** *#查询能获得一等奖学金的同学记录*
*****创建视图* 视图就是形成一个新的表(临时的)
select user, Select_priv, Create_view_priv FROM mysql.user;********#查询数据库用户创建和选择视图权限****
alter table student add privacy varchar(64);********# 增加私隐列****为这个表增加一列
CREATE VIEW view_student AS select id, class_id, name from student ;********#为学生表创建视图**** 基于student表来创建视图 VIEW视图的关键字 view_student视图的名字
dese view_student;查看视图的结构
select * from view_student;**** *#根据视图进行查询* 更新视图就等于是更新原表
CREATE VIEW view_student_class AS select student.id, student.name, class.name, class.teacher from class inner join student on class.id = student.class_id;********#为学生表创建视图**** 联合多个表创建视图(内联)
alter table 表名 change coumn 列名 要修改的列名 varchar(64);修改模板列的名字
ALTER VIEW view_student_class AS select student.id, student.name, class.name, class.id as class_id, class.teacher from class inner join student on class.id = student.class_id;********#为学生班级表视图增加 class_id 字段**** ALTER VIEW修改视图的语句 追加 删除模板(就是少写那个模板名)
drop view view_student_class;********#删除视图****
*****触发器*
create trigger 触发器的名字 BEFORE|AFIER 事件 on 表名 FOR EACH ROW 执行的语句; trigger 触发器 BEFORE|AFIER在什么之前或之后 事件可以是插入更新销毁 FOR EACH ROW对表的每一行 定义触发器 比如
create trigger tri_insert_srudent agter insert on student for each row update class set count= count+1 where NEW.id=student.id; update class set count= count+1 where NEW.id=student.id;这一段时触发器所执行的语句 insert 用NEW delete 用OLD 才合法 更新的话都可用 更新前用new(更新后)old(更新前)
drop trigger tri_insert_srudent;干掉触发器
show triggers 查看触发器
DELIMITER $$ 设置美元符为结束符
create trigger tri_delete_srudent agter delete on student for each row
begin
DELETE from grade where id =OLD.id;
update class set count=count-1 where OLD.class_id;
end;
$$ 创建触发器 执行两条语句中间用begin ; end 连接
DELIMITER ; 设置回分号为结束符
*****存储过程* 可一次性添加删除多张表的内容
DELIMITER $$ 设置美元符为结束符
create procedure proc_xxxx(in sid int)//创建储存过程 in为输入 out为输出
begin
declare cid int;//声明一个变量 用来保存id;declare cid int default 0;默认值为0
select class_id into cid from student where id=sid;用声明的变量保存id
delete from geade where id=sid;//删除geade表中id等于=sid的那条记录
delete from strdent where id=sid;//删除strdent 表中id等于 sid的那条记录
update class set count =count-1 where id=cid;更新 class表中的数据
end; $$
DELIMITER ;
call proc_xxxx(1);调用这个存储过程
drop procedure proc_xxxx;删除这个存储过程
drop procedure if exists proc_xxxx;如果存在就删除这个存储过程
变量 声明在begin之后 end 之前
declare cid int default 0;定义变量默认值为0
set cid=5;赋值操做 set 为关键字 值也可以为一个表达式
@xxx;定义用户变量用来接收储存过程输出的值
call 存储过程 (4,@xxx);调用存储过程
select @xxx;查看这个用户变量的值
*****光标* 在存储过程中使用 声明在begin之后 end 之前
declare cur_srudent cursor for select 条件;声明一个光标并指定他的条件declare cursor for为关键字
DELIMITER $$ 设置美元符为结束符
create procedure proc_xxxx(in sid int,out cname varchar(128),out cid int)//创建储存过程定义了一个输入的变量和两个输出的变量
begin
declare tmp_name varchar(128);定义临时变量
declare tmp_cid int;注变量需定义在光标之前
// declare done int default 0;//定义一个游标结束的标志(这个变量默认为0 配合if语句使用)
declare cur_srudent cursor for selectname,class_id from student where id=sid;创建光标并指定他的条件
// decalre continue handler for not found set done=1;如果游标读完数据就改变done的值(固定这样写)
open cur_srudent;打开这个光标
fetch cur_srudent into tmp_name,tmp_cid;取出光标里的东西放入临时变量fetch是取出的意思(每次读取一行,需加循环语句)
select tmp_name,tmp_cid;选择这两哥变量可直接打印出光标里的信息
close cur_srudent ;关闭这个光标
set cname =tmp_name,cid=tmp_cid;将这两个临时变赋值给输出的参数
end;
$$
DELIMITER ;
call proc_xxxx(4,@a,@b);//调用这个储存的方法
select @a;查看这个用户变量的值
*****if语句*
DELIMITER $$ 设置美元符为结束符
create procedure proc_xxxx(in sid int,out cname varchar(128),out cid int)//创建储存过程定义了一个输入的变量和两个输出的变量
begin
if sid>20 then set sid=sid+20; then那么 set 设置
elseif sid<20 then set sid=sid+40;
else sid=sid+30;
end if; if语句结束
set cid=sid;
end;
$$
DELIMITER ;
call proc_xxxx(4,@a,@b);//调用存储过程
select @b;显示输出的值
后续敬请期待 😀*******