SQL
structured Query Language:结构化查询语言
定义了操作所有关系型数据库规则:每一种数据库操作方式存在“方言”
SQL通用语法
SQL 语句可以以单行或多行书写,以分号结尾;
可以使用缩进或空格增强语句可读性,不区分大小写
三种注释 单行注释
-- (必须加空格)注释内容; # 注释内容
多行注释 /* 注释内容*/
SQL分类:
DDL :数据库定义语言:用来定义数据库对象
数据库,表,列。关键字:create, drop, alter 等
DML:数据库操作语言 :用来对数据库表中的数据进行增删改
关键字: insert,dalete,update 等
DQL: 数据库查询语言:用来查询数据库表中的记录
关键字:select ,where等
DCL:数据库控制语言:用来定义数据库访问权限和安全级别,及创建用户。
关键字:GRANT, REVOKE 等
**************************************************************
DDL操作数据库:CRUD:1、Create创建2、Retrieve查询3、update 4、dalete
show databases;查看所有数据库
show create database mysql;查看某个数据库的字符集
create database if not exists db2;创建数据库“先判断”
create database if not exists db3 character set gbk;判断数据库是否存在,
并指定字符集为jbk
alter database db3 character set utf8;修改数据库字符集
drop database if exists mymy;判断数据存在再删除数据库
使用数据库use "数据库名称"
查询当前正在使用的数据库 select database();
****************************************************
操作表:CRUD:1、Create创 建2、Retrieve查询3、update 4、dalet
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
...
列表n 数据类型n
);
show tables;查看数据库中所有的 表
desc slow_log;查看表结构
create table stu like student;复制表
drop table if exists 表名;删除表
修改表
1、修改表名 :alter table 表名 rename to 新的表名
2、修改表字符集:alter table 表名character set utf8
3、添加一列:alter table 表名 add 列名 数据类型
4、修改列名,类型:alter table student change 列名 新列名 新类型;
alter table student modify 列名 新数据类型;
5、删除列:alter table 表名 drop 列名;
***************************************************
DML:增删改表中的数据
1、添加数据:insert into 表名(列名1,列名2,...,列名n)values()
注意-->列名 与 类型 --对应
如果表名后 不定义列名,默认给所有列添加值
除了数字类型,其他类型用引号引起里
2、删除数据:delete from 表名 [where 条件]
truncate table 表名 再创建一个一模一样的表
注意 如果不加条件,删除表中所有记录 --不推荐使用
3、修改数据:update 表名 set 列名1 = 值1,列名2 = 值2,... [where 条件];
**********************************************************************************
DQL :查询表中记录
1select * from 表名;
语法: select 字段名列表
from 表名列表
where 条件列表
group by 分组
having 分组之后的条件
order by 排序
limit 分页限定
2、基础查询:
1、多字段查询
select 表达式1,表达式2,...,from 表名;
2、去除重复
select distinct ....
3、计算列
一般可以使用四则运算计算一些列的值
ifnull(表达式1,表达式 2):null 参与运算,结果都为null
4、起别名 as 可以省略
========================================
3条件查询
where子句后跟条件
运算符 >,<,<=,>=,=,<>
between ...and
in(集合)
like模糊查询“_:单个字符,%:多个字符”
is null
and / &&
or / ||
not / !
=============================================
1、查询语句
1.排序查询
语法:order by 排序字段1 排序方式1,排序字段2 排序方式2,.....;
ASC:默认升序 DESC:降序
2.聚合函数 :将一列数据作为一个整体,进行纵向计算
1.count:统计个数
2.max:计算最大值
3.min:计算最小值
4.sum:计算和
5.avg:计算平均值
3.分组查询:将表中的数据按照条件进行分组,每一组是一个整体
语法: group by 分组字段:分组字段/聚合函数
where 后不能跟聚合函数
having后可以跟聚合函数
4.分页查询:
语法:limit 开始的索引,每一页查询的条数
开始的索引=(当前的页码 - 1)* 每页显示的条数
分页操作“limit”是一个“方言”
===========================================
2、约束 对表中的数据进行限定,保证数据的正确性,完整性,有效性。
分类:
1.主键约束:primary key
<注意:含义:非空且唯一;一张表只能有一个字段为主键;主键是表中记录的唯一标识。
<创建表时添加主键约束;
<创建表完成之后添加主键约束:alter table 表名 modify 列名 int primary key;
<删除primary key 约束 :alter table 表名 drop primary key;
<自动增长:如果一列是数值类型的,使用auto_increment 可以来实现值得自动增长。
2.非空约束:not null
创建表时添加非空约束;创建表完成之后添加非空约束
3.唯一约束:unique :值不能重复 可以有多个null
创建表时添加唯一约束;创建表完成之后添加唯一约束
删除unique 约束 alter table 表名 drop index 列名;
4.外键约束:foreign key
在创建表时添加外键
create table 表名(...外键列constraint 外键名称 foreign key 外键列名称 references 主表名称(
主列名称))
<删除外键 alter table 表名 drop foreign key 外键名
<添加外键alter table 表名 add (...外键列constraint 外键名称 foreign key 外键列名称 references 主表名称(
主列名称))
<级联操作 级联更新
添加连操作alter table 表名 add constraint 外键名称
foreign key 外键字段名称 references 主表名称 on update
cascade on delete cascade ;
分类:
1 级联更新:on update cascade
2 级联删除:on delete cascade
========================================================
3、多表之间的关系
4、范式
5、数据库的备份和还原
++++++++++++++++++++++++++++++++++++++++++++++++
事务与存储过程
事务: 针对数据库的一组操作,它是有一条或者多条sql语句组成,事务中的语句要么同时完成要么同时不完成 。
mysql默认就自带事务。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
自定义事务:
start transaction; -- 开启事务
……
…… -- 过程
commit -- 提交事务, 让事务即可对数据库进行更新
rollback -- 事务回滚 ,取消事务
事务的4个特性
1、原子性 不可分割的最小单元
2、一致性 事务将数据库从一种状态转变为一下种一致的状态
4、持久性 事务一旦提交,其所作的修改会永久保存到数据库中。
3、隔离性 多个并发事务之间要相互隔离互不干扰
实际上数据库都是并发的,多个用户会同时操作数据库,
就有可能会出现脏读、不可重复读、虚读幻读的问题。
完全隔离不现实,影响数据库性能。
1.脏读:一个事务读取到另一个事务未提交的数据
2.不可重复读:一个事务多次读取同一条记录,结果不同,(一个事务读取到另一个事务已经提交的数据)
3.虚读(幻读):是指一个事务中两个查询的数据的条数不一致(其它事务做了插入记录的操作)
事物的四大隔离级别:
read uncommitted -- 不做任何隔离,具有脏读不可重复读虚读(幻读)问题
read committed -- 可以防止脏读,不能防止不可重复读和虚读(幻读)问题
Repeatable read -- 可以防止脏读不可重复读,不能防止虚读(幻读)问题
serializable -- 数据库运行在串行化末实现所有问题都没有但是性能非常的低
查看数据库的隔离级别:
select @@tx_isolation;
存储过程:
存储过程的创建
create procedure 函数名 ()
begin -- 开始
…… 函数体
end -- 结束
例如:创建一个student存储过程
create procedure m1()
begin
select * from student;
end ;
变量的使用:
declare 变量名 变量类型 默认值
declare id int default 100;
set 变量名 = 值;
set id = 120;
流程控制:
if 条件判断;
else 条件;
repeat循环:计算1+100
游标,光标 它可以使用户逐行的访问数据
顺序:声明游标 打开游标 读取数据 关闭游标
1.声明:
declare 名字 cursor for 查询语句;
2.打开:
open 名字;
3.取值:
fetch 名字 into 字段名1,字段名2
4.关闭:
close 名字;
游标结合存储过程:
drop procedure if exists mycur;
create procedure mycur ()
begin
declare stuname varchar(20) ;
declare stuscore float;
declare n int default 0;
declare i int default 0;
declare mystudent carsor for select name,grade from student:
select count(*)into n from student;
open mystudent;
repeat
fetch mystudent into stuname,stuscore;
select stuname,stuscore;
set i = i+1;
until i>n end repeat;
close mystudent;
end
call mycur();
close mystudent ;
end
call mvcuz () :