1.数据库相关
创建数据库
create database 数据库名称;
查询数据库
show databases;
使用数据库
use 数据库名称
删除数据库
drop database 数据库名称
2.表相关
创建表
create table 表名(
字段名1 数据类型,
字段2 数据类型);
数据类型:int,bigint,char,varchar,data等
查询表
show tables;
改表结构
增加字段
alter table 表名 add 字段名 数据类型;
删除字段
alter table 表名 drop 字段名;
改字段
alter table 表名 change 旧字段名 新字段名 数据类型;
查询表结构
desc 表名;
删除表
drop table 表名;
3.数据相关
插入数据
inster into 表名(字段名1,字段名2)value(数据1,数据2),(第二条数据);
删除数据
delete from 表名 where 条件;
truncate test;快速删除表中数据
修改数据
update 表名 set 字段名 = 新数据 where 条件;
查询数据
普通查询
select 查询的字段 from 表名 where 条件;
包含和不包含
in 和 not in
如
select * from student where class in (1833,1835); ==》查询班级为1833或1835的信息
select * from student where class not in (1833,1835); ==》查询班级不是1833或1835的信息
在.....之间
between的值包含自身
select * from student where age between 24 and 31; ==》查询年龄在24-31之间的信息
分组查询
select 查询的字段 from 表名 where 条件 group by 分组的字段;
注意点:group by
1.分组函数 group by 只能和聚合函数一起使用,还有分组的字段
2.where后面可以接group by 但是group by后面不能接where
3.group by 前面加where是为了先过滤在分组,where条件中不能包含聚合函数 统计,求和.....
4.where后面接group by 是为了先过滤在分组,having是跟group by连在一起用的,放在group by的后面,此时having的作用是先分组在过滤
常用的聚合函数:
count(*) 统计
sum(math) 求和
avg(math) 求平均
max(math) 求最大值
min(math) 求最小值
distinct(math) 去重
模糊匹配
like ‘%_’
%查询零个或多个
_查询零个或一个
如
select * from student where name like "%ao%";-===》查询姓名中带有ao的信息
select * from student where name like "xiaoli_"; ===》查询xiaoli_后面有一个字符的人名
排序
order by
默认为升序,即和order by 用于排序的字段 asc;同一效果
order by xxx desc;为降序
子查询
子查询就是查询的嵌套,在一个查询中使用另一个查询作为条件
如emp为员工表,dept为部门表
-- 求财务部门最低工资的员工姓名;
SELECT name from emp where incoming = (SELECT max(emp.incoming) from emp join dept on emp.dept2 = dept.dept1 where dept_name = '财务');
连接
内连接
innoer join,join 两者有同样的效果
只统计表与表之间相同的部分,不统计不同部分
如一个表有5条数据,另一个相关的表有4条数据,只统计有关联的4条数据
1)普通内连接:
格式:select * from 表1 inner join 表2 on 表1.关联字段1=表2.关联字段2 ;
案例:select * from dept inner join emp on dept.dept1=emp.dept2 ;
2)隐藏内连接
格式:select * from 表1 , 表2 where 表1.关联字段1=表2.关联字段2 ;
案例:select * from dept ,emp where dept.dept1=emp.dept2
左连接
显示左表独有数据,不显示右表独有数据
格式:select * from 表1 left join 表2 on 表1.关联字段1=表2.关联字段2 ;
案例:select * from dept left join emp on dept.dept1=emp.dept2;
右连接
显示右表独有数据,不显示左表独有数据
格式:select * from 表1 right join 表2 on 表1.关联字段1=表2.关联字段2 ;
案例:select * from dept right join emp on dept.dept1=emp.dept2;
全连接
union
合并两个或多个 SELECT 语句的结果,
如
select * from dept inner join emp on dept.dept1=emp.dept2
UNION
select * from dept left join emp on dept.dept1=emp.dept2 where name is null
UNION
select * from dept right join emp on dept.dept1=emp.dept2 where dept1 is null;
视图
视图就是一种虚拟表,它并不实际存储在物理数据库中,而是在我们用的时候临时生成
视图的优点
1、提高查询效率
数据库中的数据查询非常复杂,可以简化sql语句
2、安全
有些保密字段,可以通过创建视图限制用户对某些字段进行操作
3、简单
不需要关心后面对应的表结构
视图的缺点
1、性能差
把视图查询结果转换成对表的查询
2、修改限制
修改视图数据,必须把它转化为对基础表的修改
操作视图
创建一个视图
create view 视图名称 as(查询语句);
删除一个视图
drop view 视图名称
查询创建视图的语句
show create view 视图名;
查询视图内容
select * from 视图名
视图的特点
1、视图是由基础表产生的虚拟表
2、视图的创建不影响基础表
3、 删除视图不影响基础表
4、视图删除数据,基础表也同时删除数据(合表的表无法删除,单表可以删除)
5、基础表删除数据,视图也同时删除
6、视图不能修改表字段,不能对表字段删除
索引
索引是一种数据结构,一个索引在存储的表中的数据结构;索引是在表的字段上创建的;索引存储了一列值
索引作用
(1)保证数据记录的唯一性
(2)实现表与表之间的参照性
(3)减少排序和分组的时间(例如在使用order by ,group by 查询语句中进行数据检索)
(4)可以使用索引快速访问数据库中指定信息
索引的缺点
(1)索引要占物理内存
(2)索引对表进行增删改查,索引要动态维护,降低数据的维护速度
索引的分类
(1)普通索引
index 简称 mul 最基本的索引,没有任何限制
(2)主键索引
primary key 简称 pri 是一种唯一索引,不能为空
(3)唯一索引
unique 简称 uni 是一种唯一索引,可为空,一个表中可以有多个唯一索引
外键
让一张表记录的数据不要太过于冗余,在数据库中对表的关系进行解耦,尽量让数据的单一化
外键作用
保持数据的一致性和完整性
mysql 的存储引擎
(1)MyISAM 默认引擎
(2)innodb (外键需要用到innodb存储格式)
格式:
show table status from 库名 where name=表名
语句:
show table status from dcs where name="student"
新建外键
建表时添加外键
父表
create table 表名(id int(5) primary key,name varchar(10))engine = innodb;
子表
create table s(sid int(10) PRIMARY key,sname varchar(20),CONSTRAINT 外键名 FOREIGN key(子表字段) REFERENCES f(父表字段))ENGINE=INNODB ;
个人理解:两表都有主键,才能添加外键
或者通过修改表结构的方法添加外键
alter table z add CONSTRAINT wjm1 FOREIGN key (zid) REFERENCES f(id) ;
删除外键
格式:
alter table 表名 drop FOREIGN key 外键名;
语句:
alter table s drop FOREIGN key wj;
外键特点
父表不存在的数据,子表无法插入,父表存在的数据,子表才能插入对应的数据
存在外键,无法直接删除父表的数据,要先删除子表的数据,才能删除父表
约束
即对表中某些字段添加的数据进行一定的约束
如非空 not null
主键 primary key
唯一 unique
默认值 default
自增 auto_increment
外键 foreign key
存储过程
存储过程是实现某个特点功能的sql语句的集合,编译后的存储过程会保存在数据中,通过存储过程的名称反复的调用执行。
存储过程的优点
(1)存储过程创建后,就可以反复的调用和使用,不需要重新写复杂的语句
(2)创建,修改存储过程不会对数据有任何的影响
(3)存储过程可以通过输入参数返回输出值
(4)通过存储过程中加入控制语句,可以加强sql语句的功能性和灵活性
(5)对于单个l语句增删改查,可以直接封装一个集合中,存储过程一旦创建就可以直接调用,且可可以重复调用
(6)单个sql语句每一次执行都需要对数据进行编译,而存储过程被创建只需要编译一次,后续即可调用
(7)创建的存储过程,可以重复进行调用,可以减少数据库开发人员的工作量
(8)防止sql 注入
存储过程操作
格式:
delimiter // #分隔符 符号 //
create PROCEDURE 存储名( 参数名:in out inout)
BEGIN 开始
sql语句 执行语句
END 结束
// 分隔符号
call 存储名(参数) 调用一个存储过程
案例:
撰写一个存储过程,求1+2+3+…x的值
delimiter//
drop PROCEDURE if EXISTS st9;
CREATE PROCEDURE st9(in a int)
begin
DECLARE i,b int DEFAULT 0;
set a=a+1;
while(i<a) DO
set b=b+i;
set i=i+1;
end WHILE;
SELECT b;
end
//
call st9(10);
查看单个存储过程的详情
格式
show create procedure 存储过程;
案例:
show create procedure hz001;
查看所有已经建好的存储过程详情
格式:show procedure status
查询指定数据库里创建的存储过程
格式:
show procedure status where db="数据库名"
案例:show procedure status where db="hz017"
带有in参数的存储
in表示输入数据
格式:
delimiter //
create PROCEDURE 存储名(in x int ) #in参数,是括号
BEGIN
sql语句
END
//
call 存储过程(入参)
带out 的参数(输出参数)
delimiter //
create PROCEDURE 存储名(out x int ) #in参数,是括号
BEGIN
sql语句
END
//
call 存储过程(@出参)
select @出参
用户变量
定义语法L
set @ 变量名
赋值的方法:
(1)方式一
set @ 变量名:=值 或 set @变量名=值;
select @变量名:=值;
(2)方式二
通过查询结果为变量赋值:
select 字段 into 变量名 from 表名 where 条件
(3)
declare 声明变量
例如:
declare i int default 0 ;
循环语句
三种:
(1)while ......do ......end where
while 循环语句:
格式:
wile 条件 do
sql语句
end while
(2) loop ......end loop
(3) repeat.......until ,,,,,end repeat
判断语句
if 的单分支
if 条件 then
执行sql1
else
执行sql2
end if ;
if 多分支
在if 判断语句汇总,有几个判断分支if,就有几个结束语 end if ;
if 条件 1 then
执行sql1
else if 条件2 then
执行sql2
else if 条件3 then
执行sql3
end if ;
end if ;
end if;
end