[]
数据类型
-
tinyint--1--byte
-
samllint--2-short
-
int--4-int
-
bingint--8--long
-
folat--4--float
-
double--8--double
[]
字符串类型
-
char(n)--长度不超255字符--剩余空间空格填充--存储速度最快,浪费空间,存等长
-
varchar(n)--最长不超65535字节--剩余留给别的数据使用,不浪费空间
-
text--超过255时使用--大文本类型,
[]
日期类型
-
date--年月日
-
time--时分秒
-
datetime--年月日时分秒--1000-9999
-
timestamp--时间戳,某刻毫秒值--最大2038--自动更新
[]
字段(列)约束
-
主键约束--primary key 主键auto increament自增
-
非空约束--not null 不能能有空值
-
唯一约束--unique-不重复,可有null值
-
外键约束--表与表之间关系的列
-
自增
[]添加主键约束
-
* 语句 ALTER TABLE 表名 ADD【CONSTRAINT[给主键起名-可省略]】PRIMARY KEY(id)
[] 添加唯一约束
-
* 语句:ALTER TABLE 表名 ADD[CONSTRAINT[起名可省略] UNIQUE(列名)-可以一次条件多个
[]添加外建
-
* 语句:ALTER TABLE 表名 ADD[CONSTRAINT[起名可省略]] FOREIGN KEY (当前表列名) REFERENCES 父表名(id--参照列)
-
添加/删除默认约束
-
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值(例如15)
-
* ALTER TABLE 表名 ALTER 列名 DROP DEFAULT--删除默认值
[] 删除主键约束
-
ALTER TABLE 表名 DROP PRIMARY KEY
[]删除唯一约束
-
SHOW INDEXES FROM 表名--查看表有哪些约束
-
ALOW TABLE 表名 DROP INDEX (key-名字那个)
[]删除外键
-
ALTER TABLE 表名 DROP FOREIGN KEY 外键名字
-
SHOW CREATE TABLE 表名--查看外键名字
-
ALTER TABLE 表名 DROP INDEX 索引名--删除索引
[]
MYSQL操作类别
-
写操作:INSERT,UPDATE DELETE(增删改)
-
读取操作:SELECT--查
-
tinyint(1)--布尔判断--1为true 0为Flase
[]
MySQL--操作
-
shouw databases;--查看服务器所有库
-
use +库---进入指定库
-
select database();--查看已经进入的库
-
show rables;--查看库所有元素
-
drop database if exists +库;--删除指定已有的库
-
create databse 库名 charset utf8;--创建库
-
drop table if exists 表名--删除表
-
create tabale 表名(列名+数据类型,多个用逗号隔开)
-
desc 表名;---查看表结构
-
#空格 --空格---注释
-
insert into 表名(列1,列2)values(值1,值2);
-
insert into 表名 values(值1,值2)--只能所有列加入值
-
update 表名 set 列名=列名+值 where 列名2=值2--给列名2所有值都加值
-
update 表名 set 列名=列名+值;---给表中所有值加值
-
update 表名 set 列名=ifnull(列名,0)+10;--将空值以零对待
-
delete from 表名 where 列名=值;--删除值的所有信息
-
delete from 表名;--删除表中所有信息
-
select 列名1,列名2 from 表名--显示列名1,2
-
select * from 表名;--显示所有列
-
select distinct 列名 from 表名;--剔除指定列中的重复值
[]
where子句查询
-
= 等 <>不等 >大于>=大于等于<<=
-
between x and y---在x和y之间
-
like(%m%-包含m,%-表任意0或多个字符,"_"表任意一个字符
-
in(值1,值2)查询集合包含的值
-
not--否定后面的条件
-
and--和,or或,is null 是否为空,is not null-是否不为空
-
as--定义别名,where不能使用列别名,可使用表别名
-
[]
排序查询
-
order by 列名 asc --升序
-
select 列名 from 表名 order by 列名 asc;---升序
-
select 列名 from 表名 order by(列名)desc;---降序
[]
分组查询
-
select * from 表名 group by 列名1--按照列名1分组
[]
聚合函数查询
-
select max(列名) as from 表名;--最大值--min最小值
-
select count(*) from 表名 where 列名>值;--统计大于值的人数
-
select sum(列名) as from 表名;--统计指定列的总值
-
select avg(列名) as from 表名;--算出指定列的平均值
-
select 列名1 coun(*),avg(列名2) from 表名 group by 列名1--多聚合一起查询
-
聚合函数不能用在where子句中
-
没有分组时,聚合函数不能喝其他普通字段一起查询
-
select 列名1,列名2 from 表名 where 列名2=(select max(列名2) from 表名)---子查询
-
ceil(数值)---向上取整floor(数值)--向下取整
-
round(数值)---向下取整,rand--随机数
-
select 列名1,列名2,ceil(列名2*1.1547) from 表名;--工资上涨15.47%的,向上取整
-
日期函数:curdate()--返回当前年月日
-
curtime()---返回当前时分秒
-
now()--返回当前年月日时分秒
-
date add(),date sub()--增加/减少日期
-
year()--获取年,month()--月,day--日hour()--时,minute()分
-
second()--秒
-
select now();--查询当前系统时间
-
select 列名1,year(curdate())-year(列名2) from 表名;--显示姓名和年龄
[]主键创建实现案例
CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL);---省份表--父表--设置主键后自动创建索引
CREATE TABLE usere(
id SAMLLINT UNSIGED PIMARY KEY AUTO_INACEMENT NOT NULL
pid SMALLINT UNSIGNRD,
FOREIGN KEY (pid) references(id) );
参照省份表的id--字表
pid--外键列 省份表的id为参照列
语句:SHOW INDEXES FROM 表名\G--查看有没有建立索\G表格显示
[]
外键
-
员工表的id列(dept_id)和部门表的id一一对应,dept_id--就是外键
-
foreign key(列表1_id) references 列表1(id)--添加--指定为外键
-
建表后:create table 表名(id int primary key auto_increment)--建表后外键设置
-
如果表已存在,可以使用下面这种方式: alter table emp add constraint fk_dept_id foreign key(dept_id) references dept(id); 其中 add constraint fk_dept_id 表示新增列,列名为 fk_dept_id ( 名字由自己定义 foreign key(dept_id) 中的 dept_id 为外键
-
外键删除:1--show create table 表名--查询含有外键名的语句
-
2--alter table 表名 drop foreign 外键名字---完成删除
-
1对多:1~*
-
一对一
-
多对多
[]
外键的作用
-
外键:是用于保证数据一致性的策略
[]外键约束参照操作
参照表添加值
INSERT provinces(pname) VALUES("A");
INSERT provinces(pname) VALUES("B");
INSERT provinces(pname) VALUES("C");
子表添加值
INSERT user1(username ,pid)VALUES("tom",3);
INSERT user1(username ,pid)VALUES("jon",1);
INSERT user1(username ,pid)VALUES("sum",3);
CASCADE:
CASCADE :从父表删除或更新且自动删除或更新子表中匹配的行
SET NULL:从父表删除或更新行,并设置子表中的外键列 为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
RESTRICT :拒绝对父表的删除或更新操作。
NO ACTION :标准SQL的关键字,在MySQL中与RESTRICT相同
[]
where--不能使用别名
-
SQL语句书写顺序
-
select * | 列名--确定查询的列有哪些
-
from 表名---确定要查询那张表
-
where 条件---筛选过滤,剔除不符合条件的记录
-
group by 分组的列----根据那一列进行分组
-
having 条件--通过条件对分组后的数据进行筛选过滤
-
order by 排序的列---指定那一列进行排序
-
limit(countpage-1)*rowCount,rowCount--指定返回第几页记录以及每项显示多少条
[]
SQL执行顺序
-
from 表名---确定查询那张表
-
where 条件---一下全部同上
[]
修改表操作
-
alter table 表名 add 添加的列名 列名的类型--新增列
-
alter table 表名 modify id int primary key---修改id列,将id设为主键
-
alter table 表名 modify id int auto increment--修改id列,将id主键设为自动增长
-
alter table 表名 drop 列名---删除列
添加单列
ALTER TABLE 表名 ADD[COLUMN(可不加)]列名 [FIRST(表示插在最前面)|AFTER(指定在某列后方) 被指定列 ]--省略两个指定将默认插入在后方
例:ALTER TABLE user1 ADD password VARCHAR(32) NOT NULL AFTER 被指定列名
添加多列
ALTER TABLE 表名 ADD[COLUMN](列1,列2.。。。。。)
删除列
ALTER TABLE 表名 DROP[COLUMN] 列名
删除多列
ALTER TABLE 表名 DROP[COLUMN] 列名1,列名
[]
单引号和\c---结束SQL语句
[]
基础语句
-
select distinct 列名 from 表名--剔除有重复的数据
-
delete from 表名 where 判断条件--删掉表中符合条件的内容
-
update 表名 set 列=值 或 where 判断条件--给所有加值或符合条件的加值
-
insert into 表名 values(给表调加的值);--给表添加值
-
primary key auto_increment--设置主键和自增
-
desc 表名--查看表结
-
delete from 表名--删表名
-
create table 表名(表结构)--创建表
-
drop table if exists 表名---删除表
-
show tables--查看库的所有表
-
use 库名--进入库
-
create database if not exises 库名 charset utf8;--创建库
-
drop database if exists 库名--删除库
-
show create database 库名--查看建库时的语句
-
show databaes();--查看已经进入的库
-
show databases;--看MySQL的所有库
[]
where查询
-
语句:select 显示的列 from 表名 where 判断条件
-
加减乘除大小等于 or and in (not in)--不在 ifnull(判断指定列是否包含null,有则第二条替换) (is null)--为空
-
(not null)--不为空 like '%'--开头包含结尾 '*'--任意 “刘_”--以刘开头
-
year(列名)--年 month(now())+1=month(列名)--下个月 month(now())=month(列名)+1--上个月
-
BINARY--区分大小写--如果内容小写,查询输入大写则查不到,默认不区分
-
UNION[ALL(包含重复数据)|DISTINCT(删除结果集重复数据)]--接在条件后面
[]
分组查询
-
语句:select 查询的列 from 表名 group by 根据指定的列进行分组
-
例子:select count(*)[统计人数] from emp group by jod;--按照职位进行分组
-
计算格式:select 计算函数(列名) from 表名
-
sum--求和 avg--平均值 max--最大值 min--最小值
[]
排序查询
-
语句:select 显示的列 from 表名 order by 排序的列 asc;---升序
-
desc--降序
[]
分页查询
-
语句:select * from 表名 limit 页数,显示数据数(计算公式(页码-1)*每页显示记录数)
[]
关联查询
-
select * from 列名 left join 表名 on 条件(例如id相等)--左连接--左边全查出,右边只查匹配的
-
left换成right就右连接--刚好相反
[]
子查询
-
语句:select 显示的列 from 表名 where 判断条件(sal(列名)>(select sal from 表名 where name='王海涛')
[]
关联查询
-
select 显示表1表2符合的列 from 表名 a 表名2 b(给表起别名) where a-id=b-dept-id and d-name="培优部"--where后面基本都是关联条件
[]自查询
-
select 查询的列 from 查询的表(表1 表2) where 判断条件(表1id=表2id)
-
where --后面不能使用分组函数
-
select 显示列名.min(判断列名) from 表名 group by 显示列名---分组
[]
常用命令
-
show databases;--|查看服务器所有数据库
-
use myaql;
-
use test;----进入某一数据
-
select database();---查看已进入的数据库
-
show tables;--查看当前数据库的所有表
-
drop database mydb11;--删除指定数据库
-
drop database if exists mydab1--如果没有就创建再删除
-
create database mysql character utf8;--创建库指定编码为utf8;
-
create database if not exists mydb1 charset utf8--没有就创建
-
show create database mydb1;--查看建库时语句
-
use mydb1,drop table if exists stu;---如果没有就创建再删除表
-
use myab1;
-
create table stu(id int primary key auto_increment,--设置为健值
-
name vachar(10)---字符串类型
-
birthday date,---时间类型
-
desc stu;---查看表结构
-
insert into stu(id,name,birthday)---指定顺序添加
-
value(1,'good','2019');
-
insert into stu values(2,'第二种方式','2019');
-
update stu set score=score+10--给所有列都加10
-
update stu set score=88 where name='good';--给指定名字改值
-
delete from stu;--删除记录语法
-
delete from stu where name='老刘' or name='删除'--或删除
-
select * from emp;--查看所有列
-
select dept,job from emp;--筛选查看
-
select distinct dept from emp;--剔除重复记录
-
select name ,sal from emp wher sal>3000--大于筛选
-
ifnull(列,值)---判断是否包含null值
-
select sal between 300 and 400--在 什么和什么之间
-
in(100,200,300)--什么和和什么和什么之间
-
not in(10,200,300)--不在什么和什么和什么之间
[]or---或
-
模糊查询
-
like '刘%';--以刘开头
-
like ‘%刘%’--包含刘
-
like ‘刘+下划线’---刘开头且为两字的
[]分组查询
-
select count(*) from emp group by job;--按照职位分组
-
max--最大
-
*--如果为null就统计
-
sum--和
-
year(时间名称)---提取年月日时分秒--前面换单词
-
select year(now());--填单词获取当前年月日时分秒
-
where month(now())+1=month(birthday);--下个月
-
where month(now())=month(birthday)+1;--上个月
-
curdate() 获取当前日期 年月日--
-
curtime() 获取当前时间 时分秒 -curdate+curtime=now
-
sydate()--获取当前日期年月日时分秒=now
[]排序查询
-
order by 列 asc--升序
-
order by 列 desc--降序
-
limit (页码-1)*每页显示记录数, 每页显示记录数
-
select * from emp limit 0,3;--第一页
-
select * from emp limit 3,3;--第二页
-
select*from 列 left join 表--左连接查询
-
select*fro,m 列 right join 表--右连接查询
-
列 a--重命名
[]
内连接
-
UPDATE tab_goods INNER JOIN(内连接) tab_goods_cate(被链接的表名)ON(链接调加) goods_cate = cate_name(值或内容相等的链接条件)
SET(更新的值) goods_cate = cate_id(表1的这行改成新建表的id值)
内连接:两张表的交集
SELECT 表1id,表1名字 FROM 表1名
INNER JOIN
表2名
ON 表1名.id=表2名.id;
[]
左外连接:符和左边全部右表显示符合条件的
-
SELECT 表1id,表1名字 FROM 表1名 LEFT JOIN 表2名 ON 表1名.id=表2名.id;
[]
右外连接--与左相反
-
SELECT 表1id,表1名字 FROM 表1名 RIGHT JOIN 表2名 ON 表1名.id=表2名.id;
[]
多表连接--三表连接
-
SELECT 列名1,列名2 FROM 表名 AS g INNER JOIN 表名2 AS c ON g.cate_id=c.cate_id INNER JOIN 列名 AS b ON g.brand_id=b.brand
[]
无限极分类设计
-
SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id = p.type_id
[]补充4、SQL语句的书写顺序和执行顺序:
[] SQL语句的书写顺序:
-
select...
-
from...
-
where...
-
group by...
-
order by...
-
...
[] SQL语句的执行顺序:
-
from... -- 确定要查询的是哪张表 (定义表别名)
-
where... -- 从整张表的数据中进行筛选过滤
-
select... -- 确定要显示哪些列 (定义列别名)
-
group by... -- 根据指定的列进行分组
-
order by... -- 根据指定的列进行排序
[]
存储过程
-
存储过程:是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理
-
优点:增强SQL语句的功能和灵活性
-
实现较快的执行速度
-
减少网络流量
[]
函数体
-
IN:表示改参数的值必须在调用存过过程时指定--只能进不能出
-
OUT:表示该参数的值可以被存储过程改变,并且可以返回
-
INOUT:表示该参数的调用时指定,并且可以被改变和返回
-
语句:CREATE[DEFINER={user|CURRENT_USER}]--可省略--省略表示登录当前mysql用户
-
PROCEDURE sp_name(存储过程的名字))([proc_parameter[....]](可以带有0个到多个的???))?
-
[characteristic....]routine_body
-
proc_parameter:
-
[IN|OUT|INOUT]parm_name type--参数类型
[]过程体
-
由合法的SQL语句构成
-
可以是任意的SQL语句:存储过程不能创建表和库,主要指:增删改查或多表连接
-
如果为复合结构则使用BEGIN...END语句--超过两个就要BEGIN...END包在其中
-
复合结构可以包含声明,循环,控制结构
-
[]创建存储过程
-
CREATE PROCEDURE sql() SELECTION VERSION();
-
调用存储过程
-
CALL sql--调无参
-
CALL sql()--调无参
[]
调用有参
-
DELIMITER //--把分号定界符改成双下滑线
-
创建过程
-
CREATE PROCEDURE removeUserById(存储过程的名字,随便起)(IN(in类型的参数) id(参数名) INT(数据类型) UNSIGNED)
-
BEGIN(一个也可以带有)
-
SQL语句:DELETE FROM users WHERE id(数据表当中的字段) = id(需要传递的参数);--批??????????
-
END
-
//
-
DELIMITER ;--定界符再修改成分号
[]
调用
-
CALL removeUserById(3)--调用上面封装的存储过程
-
参数名id和表中字段重名时就全部把表的内容删除了--注意注意
[]
删除存储过程
-
DROP PROCEDURE [IF EXISTS] 存储过程的名字
DROP PROCEDURE [IF EXISTS] 存储过程的名字
[]重新构建存储 过程
-
DELIMITER //--把分号定界符改成双下滑线
-
CREATE PROCEDURE removeUserById(存储过程的名字,随便起)(IN(in类型的参数) p-id(参数名) INT(数据类型) UNSIGNED)
-
BEGIN(一个也可以带有)
-
SQL语句:DELETE FROM users WHERE id(数据表当中的字段) =p-id(需要传递的参数);--批量删除操作
-
END
-
//
-
DELIMITER ;--定界符再修改成分号
-
CALL removeUserById(22)--调用上面封装的存储过程--删除了id=22的记录
[]删除id不固定的记录并且返回剩余的固定数
-
DELIMITER //--把分号定界符改成双下滑线
-
CREATE PROCEDURE removeUserAndReturnUserNums(存储过程名)(IN p-id INT UNSIGNED,OUT userNums INT UNSIGNED)
-
BEGIN
-
DELETE FROM users WHERE id=p-id;--第一个删除语句
-
SELECT count(id)(返回总数) FROM users INTO(将返回的总数放到userNums中)userNums;
-
END
-
//
-
DELIMITER ;--定界符再修改成分号
[]
调用
-
SELECT COUNT(id) FROM users;--先看总id有多少
-
CLAA removeUserAndReturnUserNums(27,@nums(接收返回的总数--代表变量);
-
SELECT @nums;--查看返回的总数
-
局部变量--只在BEGIN里有效
-
SET @i =7;--对当前MySQL用户都--声明用户变量
-
BEGIN...END声明的变量叫局部变量
-
通过INTO,@(艾台)声明的变量叫用户变量--作用域在当前用户内
[]
多参多返回值
-
SELECT ROW_COUNT();---得到删除更新的总数
-
INSERT 表名(列名)VALUES(值1),(值2),(值3);--插入多行
-
定义开始
-
DELIMITER //--把分号定界符改成双下滑线
-
CREATE PROCEDURE removeUserById(IN p-age SMALLINT UNSIGGED,
-
OUT delete SMALLINT UNSIGNED,OUT user SMALLINT UNSIGNED)
-
DELETE FROM 表名 WHERE age = p-age;--传参删除
-
SELECT EOW_COUNT(id) INTO deleteU--返回删除更新总数
-
SELECT COUNT(id) FROM users(表名) INTO usec;---返回剩余总数
-
END
-
//
-
DELIMITER //
-
CALL removeUserById(20,@a ,@b)--调用
-
SELECT @a,@b;
[]
存储过程与自定义函数的区别
-
存储过程实现的功能要复杂一些,而函数的针对性更强
-
实际开发中存储过程常用
-
可以通过程序实现存储过程的功能但是效率没有存储过程高
-
存储过程可以有多个返回值,而函数只能有个返回值
-
存储过程一般独立的来执行,而函数可以作为其他SQL语句的组成部分来出现
[]修改存储过程:只能修改简单的属性或者重新重新创建
[]自定义函数
-
内置函数举例:字符,数值,日期时间,加密等函数
-
定义:用户自定义函数(user-defined function,UDF)是一种对mysql扩展的途径,其用法与内置函数相同
-
两个必要条件:参数,返回值( 可无参,但一般都有返回值)
-
函数可以返回和接收任意类型的值,
-
参数不能超过1024个
[]
创建函数
-
CREATE FUNCTION name(函数名)
-
RETURNS(返回值的类型)
-
{STRING|INTEGER|REAL|DECIMAL}(类型举例)
-
routine_body(函数体)可以包含:任意合法的SQL语句构成
-
也可以是简单SELECT或INSERT语句
-
如果为复合结构则使用BEGIN...END语句
-
复合结构可以包含声明,循环,控制结构
[]创建函数举例
-
SET NAMES gbk--改编码方式
-
SELECT NOW();当前时间
-
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
-
开始封装这个过程
-
CREATE FUNCTION f1() RETURNS VARCHAR(30)
-
RETURN DATE_FORMAT(NOW(), '%Y年%m月%d日 %H点:%i分:%s秒');
-
SELECT f1()--调用--不带参数
[]创建带有参数的函数
-
CREATE FUNCTION f2(numl SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
-
RETURNS FLOAT(10,2) UNSIGNED
-
RETURN (numl+num2)/2;--封装完成
-
SELECT f2(20,10);--传参调用
[]
创建带有复合结构的函数
-
DELIMITER //
-
CREATE FUNCTION adduser(username VARCHAR(20))
-
RETURNS INT UNSIGNED
-
BEGIN--创建存储过程
-
INSERT test(uscrname) VALUES(username);
-
RETURN LAST_INSERT_ID();
-
END
-
//
-
DELIMITER ;
-
SELECT adduser('Rose')--传入参数插入
-
DROP FUNCTION [IF EXISTS] 函数名--删除函数
[]运算符和函数
-
运算符
-
函数
-
字符函数
-
数值运算符与函数
-
比较运算域函数
-
日期时间函数
-
信息函数
-
聚合函数
-
加密函数
[]
字符函数
-
SELECT CONCAT (“iomoc”,“mysql”)--结果iomocmysql--多个连接也可以--- 字符连接
-
SELECT CONCAT (列名1,列名2)AS 别名 FROM 表名;//两列拼接-- 字符连接
-
SELECT CONCAT_WS ('|','A','B','C')//A|B|C-- - 使用指定的分隔符进行字符连接
-
SELECT FORMAT (125660.75,1)//12,5660.8保留一位小数且四舍五入---- 数字格式化
-
SELECT LOWER ('MySQL')--mysql--- -转化成小写字母
-
SELECT UPPER ('mysql')--MySQL---- 转换成大写字母
-
SELECT LEFT ('MySQL',2)--My--- 获取左侧字符
-
SELECT LOWER (LEFT('MySQL',2));--函数嵌套--取两位在转小写my-- 切割转换小写
-
SELECT RIGHT (('MySQL',3)--SQL--- 获取右侧字符
-
LENGTH()---获取字符串长度
-
LTRIM()----删除前导空格
-
RTRIM()---删除后续空格
-
TRIM()---删除前导和后续空格
-
SUBSTRING()---字符串截取
-
[NOT]LIKE()---模式匹配
-
REPLACE()---字符串贴换
-
数据截取都是1开始:正截整数,倒截取用负数,也可以只有一个起始点
-
SELECT * FROM 表名 WHERE 列名 LIKE '%1%%' ESCAPE '1';--表示1后面%不是通配符
[]
数值运算符与函数
-
SELECT 3+4;
-
SELECT CEIL(3.01)--4-- 进1取整
-
SELECT FLOOR(3.99)--3---- 舍一取整
-
SLEECT 3 DIV 4;--0---- 整数除法
-
SELECT 5%3=SELECT 5MOD3;-- 同理--取余数(取模)
-
SELECT POWER(3,3)--平方--- 幕运算
-
SELECT ROUND(3.65231,2)--保留两位两数--- 四舍五入
-
SELECT TRUNCATE(125.89,1)125---- 数字截取
-
SELECT TRUNCATE(125.89,-1)120--不做四舍五入操作--- 数字截取
[]比较运算与函数
-
SELECT 15 BETWEEN 1 AND 22;--1,1--表示true 0-flase--- [NOT]BETWEEN...AND【不】在范围之内
-
SELECT 35 NOT BETWEEN 1 AND 22;--1,1--表示true 0-flase--- 【NOT】IN()--【不】在列出值范围内
-
SELECT 10 IN(5,10,15,20);--1----- 在
-
SELECT NULL IS NULL--1---- IS [NOT] NULL【不】为空
-
SELECT * FROM 表名 WHERE 列名 IS NULL--那些为空
-
SELECT * FROM 表名 WHERE 列名 IS NOT NULL--那些不为空
[]
日期时间函数
-
NOW()---当前日期和时间
-
CURDATE()----当前日期
-
CURTIME()---当前时间
-
DATE_ADD()---日期变化
-
DATEDIFF()---日期差值
-
DATE_FORMAT()--日期格式化
-
SELECT DATE_ADD('2019-11-23',INTERVAL 365 DAY)--2020-11-23--负数为减
-
YEAR--年 WEEK--星期--加单位就行
-
SELECT DATEDIFF('2019-11-23','2018-11-23');--365
-
SELECT DATE_FORMAT('2014-3-2','%m%d%Y')--03/02/2014
[]
信息函数
-
CONNECTION_ID()--连接ID
-
DATEBASE()---当前数据库
-
LAST_INSERT_ID()---最后插入记录的ID号
-
USER()--当前用户
-
VERSION()---版本信息
-
SELECT CONNECTION_ID()--当前线程的id值
-
SELECT LAST_INSERT_ID;\--需要有设置主键和自增,一次多写入只算第一次
-
INSERT 表名(列名1,列名2)VALUES('值1','值2');--插入
[]
聚合函数
-
AVG()--平均值
-
COUNT()---计数
-
MAX()---最大值
-
MIN()---最小值
-
SUM()---求和
-
SELECT AVG(3,4,5);--可以添加列和添加在四舍五入里
-
SELECT MAX(列名)AS counts FROM 表名
[]
加密函数
-
MD5()--信息摘要算法
-
PASSWORD()--密码算法
-
SELECT MD5('admin')--32位数加密字段
-
SELECT PASSWORD('admin')--
-
SET PASSWORD=PASSWORD('dimitar');--修改当前用户数据库登录密码
-
exit;--退出登录
-
cls;--清除屏幕内容
-
mysql -uroot -pdimitar--把密码改回来
[]
事务
-
BEGIN或START TRANSACTION--显式开启一个事务
-
COMMIT WORK等价于COMMIT--提交--永久保存
-
SAVEPOINT 参数 允许在事务中设置一个保存点也可多个
-
RELEASE SAVEPOINT 参数--删除一个保存点
-
ROLLBACK TO 参数把事务回滚到标记点
-
SET TRANSACTION--设置事务隔离级别
[]
事务处理主要方法
-
BEGN--开始一个事务
-
ROLLBACK--回滚
-
COMMIT--提交
-
SET AUTOCOMMIT=0--禁止自动提交
-
SET AUTOCOMMIT=1--开启自动提交
[]
事务的定义
-
指作为单个逻辑工作单元执行的一系列操作,要么都执行,要么都不执行
-
绑定一堆增删改查的SQL语句,要么都成功执行,要么都执行不成功。
[]
索引
-
索引:是对数据表一列或多列的值进行排序的一种结构
[]
修改存储引擎的方法
-
修改配置文件:default-storage-engine=engine
-
建表时指定:CREATE TABLE 表(列定义内容) ENGINE=MyISAM DEFAULT CHARSET =utf8
-
建表后:ALTER TABLE 表名 ENGINE =InnoDB;
[]事务的四大特性
-
是用于保证数据库的完整性
-
原子性 (Atomicity) --所有操作是一个整体-要么全部执行要么全部都不执行
-
一致性 (Consistency) ---数据库状态与其他业务规则保持一致(无论成功与否,两个账户总金额之和不变)
-
隔离性 (Isolation) ---各个事务之间相互隔离,互不影响--隔离级别高时
-
持久性 (Durability) --事务操作成功时,就持久的保存到硬盘上
-
简称:ACID
-
开启事务时,在提交或回滚(撤销)成功之前,里面的数据不变,提交或回滚(撤销)后才会改变。
-
start transaction--开起事务
-
rollback--回滚
-
commit--提交
-
quit---中断操作
-
脏读--别的窗口可以读到了事务为提交前的数据
-
不可重复读--在这个事务结束之前,读到了别的事务中提交后数据--两次查询不一致
-
幻读---在这个事务结束之前,读到别的事务插入或删除--导致一个事务查询不一致--无法插入
-
只是查询就不用使用事务 增删改查--必须要用事务
-
JDBC--默认开启事务--一天语句即为事务--开启和提交
[]
事务隔离级别
-
语句:set tx isolation='read-uncommitted(级别)';
-
READ UNCOMMITFED(读未提交数据)--安全级最低性能最好--(可出现脏读,不可重复读 幻读)
-
READ COMMITTED(读已提交,Oracle默认)--防脏读,不防不可重复读和幻读
-
REPEATABLE READ(可重复读mysql默认)--防脏读和不可重复读-不防幻读
-
SERIALIZABLE(串行化)--不出现任何问题--性能最差
[]
设置隔离级别
-
select@@tx isolation;--查询前设置隔离级别
-
JDBC设置隔离级别
-
调用:Connection.setTransactionIsolation(in level)
-
1-读未提交 2-读已提交 4-读可重复 8-串行化 0-不使用事务
-
索引分类:普通索引,唯一索引,全文索引,btree索引,hash索引
-
CSV存储引擎不支持索引
-
BlacKHole:黑洞引擎,写入的数据都会消失,一般用于做数据复制的中继
-
常用两种存储引擎
-
MyISAM:适用于事务的处理不多的情况
-
InnoDB:适用于事务处理比较多,需要有外键支持的情况
[]
并发控制
-
定义:当多个连接对记录进行修改时保证数据的一致性和完整性
-
解决这个问题需要有锁控制
-
共享锁(读锁):在同一时间段内,多个用户可以读取同一个资源
-
排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作
-
锁的颗粒:即锁的单位,对修改的数据精确加锁即可(对表或者某条数据)
-
锁颗粒:
-
表锁:是一种开销最小的锁策略
-
行锁:开销最大的锁策略--支持并发的一种情况--因为每行都有可能加锁