mysql数据库是由DB跟DBMS跟sql组成
DB 数据库仓库
DBMS 数据库管理系统
SQL 一门通用的数据库语言
数据库启动命令 : 关闭->net stop MySQL || 开启—>net startMysql
命令行链接数据库: mysql -h localhost -P 3306 -u root -p123
也可以简介 mysql -u root -p123
查询数据库管理系统中有几个数据库的仓库Show DataBases
默认四个数据库
information_schema 保存数据库源文件信息
performance_schema 保存搜索性能参数系统参数信息
mysql 保存数据库用户信息
test 测试数据库
进库语法: use 库名;
查看库里有几张表语法: show tables;
还可以指定那个库名查看:show tables from 库名;
查看我当前在那个库里面: select database(); ->调函数
建表: cretatble 表名(填写你需要的字段);
查看表结构:desc 表名;
查看当前数据管理系统版本 slect version(); dos命令查询: mysql --version
SQL语言分为
DQL :一些函数 分组 连接查询 条件查询 子查询 分页查询 union去重复查询
DML :增删改语句
DDL :库表管理 数据库类型 常见约束
---------------------------------------SQL语言-------------------------------------------------
DQL--->
基础查询----------->1:
去重 :select distinct age from student->DISTINCT
mysql里面+只能做运算符来用
拼接字符串 :concat()里面拼接
把null转0.0 :ifnull(字段,0)
条件查询----------->2:
条件运算符: > < = <> >= <=
逻辑运算符: and or not
模糊查询:
like
between and
in
is null
查询什么到什么之间:between 100 and 200
根据一个字段等于多个条件查询: in(条件1,条件2,条件3)
判断null :
查null ->is null
查不是null ->is not null
安全等于 : <=> 用作: <=> null, 字段<=> 值
排序查询----------->3:
排序: ORDER BY 字段 DESC 降序|| ASC 升序
常见函数----------->4:
函数概念:就是跟Java中的方法一样
好处:隐藏了实现细节 提高了代码的重用性
调用:select 函数名(实参列表) 【from 表名】;
分类:
单列函数:只有一个数据,并对一个数据返回一个结果
分组函数:用于多个数据,并对多个数据返回一个结果
理解:多个数据就跟java中的数组 集合一样
查看当前客户端子符集: show variables Like '%char%'
单行函数:
1.字符函数
length():获取数值个数 length('qwe')
upper():大写 upper('q')
lower():小写 lower('Q')
substr():截取字符串 substr(1111,1,2)
instr():返回字串第一次出现的索引,找不到返回 instr('1我11','我')
trim():去前后的空格,也可以指定前后的值去掉 trim('1' from '11yy11')
lpad():用指定的子符实现左填充指定的长度 lpad('123',3,'*')
rpad()用指定的子符实现右填充指定的长度 lpad('123',3,'*')
replace():替换 replace('123','2','我')
2.数字函数
round() 四舍五入加上0.5向上取整
ceil() 向上取整
floor() 向下取整
truncate() 小数点截断 truncate(1.69999,1)
mod() 取余 mod(10,3)
3.日期函数
Now() 返回当前系统日期+时间
curdata() 返回当前系统日期
curtime() 返回当前系统时间
指定获取部分-->
year() 年
month() 月
day() 日
hour() 小时
minute() 分钟
second() 秒
str_to_data() 将日期格式的子符换成指定格式的日期
用法:str_to_data('9-13-1999','%m-%d-%y')
格式符:-->
%Y 四位的年份
%y 2位的年份
%m 月份(01,02...)
%c 月份(1,2...)
%d 日(01,02...)
%H 24小时制
%h 12小时制
%i 分钟
%s 秒
date_format() 将日期转成子符
用法 date_format(new(),'%y年%m月%d日')
4.其他类型函数
version()
database()
user()
5.流程控制函数
if(10<5,'大','小') if函数-->if else 效果
case函数
select case 字段
when 1 then '我是1'
when 2 then '我是2'
when 3 then '我是3'
else '结束'
end from student;
分组函数:
sum()
max()
min()
avg()
count()
特点:
1.sum,avg一般用于处理数值型
max,min,count 可以处理任何类型
2.分组函数都忽略null值
3.可以跟distinct搭配去重复
count()效率:
Myisam引擎下count(*)的效率高
innodb引擎下count(*)比加字段效率要高
分组查询----------->5
GROUP by 需要分组的字段
也可以根据多个字段分组 前提是分组值一样
连接查询----------->6
错误情况
笛卡尔乘机现象:表1 有m行,表2 有n行,结果=m*n行
发生原因:没有有效的连接条件
解决方法:添加有效的连接条件
mysql支持标准
按年代划分分类:
sql92标准:只支持内连接
sql99标准:支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接
1.Sql92标准
等值连接注(有=):
select * from 表1,表2
where 表1.字段名=表2.字段名
非等值连接注(没=);
select * from 表1,表2
where between 表1.字段名 and表2.字段名
自连接:
2.Sql99标准
外连接的查询结果外主表中的所有记录
有值跟他匹配的就显示匹配的值
没有就显示null
外连接:就是内连接结果+主表中没有匹配对应表的数据
1.左连接
select * from 表1 left outer join 表2
on 表1.字段名=表2.字段名
注(on是代表一个面上就是不是在一张表里做条件查询是在两个表里面做查询
。where就是只能在一个表里面做查询。)
2.右连接
select * from 表1 Right outer join 表2
on 表1.字段名=表2.字段名
3.全外连接(Mysql不支持)
select * from 表1 Full outer join 表2
on 表1.字段名=表2.字段名
注(全外连接是查询3表的数据
结果是:
表1里面所有的内连接结果+
表2里面不是内连接结果数据+
表1里面不是内连接结果的数据
)
4.交叉连接
select * from 表1 cross join 表2
子查询----------->7
分类:
按子查询出现的位置:
select后面
只支持标量子查询
from后面
只支持表子查询
wehere或having后面
支持标量子查询
列子查询
行子查询
exists后面(相关子查询)
只支持表子查询
按结果集的行列数不同:
标量子查询(结果只有一列一行)
列子查询(结果一列多行)
行子查询(结果一行多列) 注(用的不多因为有局限性语法(字段1,字段2)=(子sql))
表子查询(结果一般为多行多列)
联合查询----------->8
union:去重复
unionall :不去重复
语法:
查询语句1
union|unionall
查询语句2
DML--->
新增:
方式一
insert into 表名 values(1,'王翔','1111');
方式一进阶:
插入多行
insert into 表名 values(1,'王翔','1111'),(1,'王翔','1111');
插入子查询结果集
insert into 表名
select * from 表名;
方式二
insert into 表名 set id=1,name='王翔',phone='1111';
修改:
语法:
单表:
update 表名 set 字段='值' where id=1
多表:
多表连接修改注(使用内连接)
update 表1 inner join 表2 on 表1.字段=表2.字段
set 字段='值' where id=1
删除:
语法:
方式一:
单表:
delete 表名 where id=1
多表:
多表连接修改注(使用内连接)
delete 表1 inner join 表2 on 表1.字段=表2.字段
where id=1
方式二:
truncate table 表名 注(这种删除方式可以把主键自增长删除(会让自增长从1开始)
但是这个删除没有返回值,(truncate没有回滚,delete有回滚))
DDL--->
1.库的管理
1.库的创建
语法:
create database 【if not exists】 库名;
2.库的修改
修改库名语法:
renaem database 库名 to 新库名
更改库的子符集语法:
alter database 库名 character set gbk;
2.表的管理
1.创建表
create table 表名(
id int,
name varchar(120),
)
2.修改列名
alter table 表名 change column 旧列名 新列名 datetime;
3.修改列的类型或约束
alert table 表名 modify column 列名 类型;
4.添加新列
alter table 表名 add column 列名;
5.修改表名
alter table 旧表名 reaname to 新表名
5.删除列名
alter table 表名 drop column 列名
7.表的删除
drop table if existe 表名;
8.表的复制
1.复制表的结构
create table copy like 复制的表名
1.复制表的结构+内容
create table copy2
select * from 复制的表名
1.常见的数据类型
数值型:
整型:int integer bigint
小数
都可以指定取值范围(M跟D是取值范围)
(M,D) M代表合计一共5位数,D是保留小数点长度几位
浮点型: float double
定点数型: dec注(保存精度比浮点型高)
子符型:
较短的文本:char,varchar
较长的文本:text, blob(较长的二进制数据)
日期型:
date 格式2019-12-31
datetime 格式2019-12-31 23:59:59
timestamp 格式一串数字某个时刻
time 格式 23:59:59
year 格式 2019
2.常见约束
含义:一种限制,用于限制表中的数据,为了保证表中的数据准确和可靠性
六大约束分类:
not null :非空
default :默认
primary key :主键不可为空
unioue :唯一可为空
check(字段=男 or 字段=女):检查约束【mysql不支持】
foreige key :外键
添加约束的时机:
1.创建表时
2.修改表时
约束的添加分类:
列级约束: 六大约束语法都支持,但外键没有效果
表级约束: 除了非空,默认其余的六大约束支持
语法: constraint 别名 约束名(字段名)
添加外键: constraint 别名 foreige key(字段名) references 主键表名(字段名)
查看索引: show index from 表名
修改表时添加约束语法
1.添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
2.添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】
1.删除列级约束
alter table 表名 modify column 字段名 字段类型;
2.删除表级约束
alter table 表名 drop 约束类型(字段名);
标识列(自增长)
key|unique auto_increment
查看当前标识列信息
show variables like '%auto_increment%'
TCL--->
事务的属性:
简称(acid)
原子性
一致性
隔离性(需要通过隔离级别来控制)
持久性
多个事务如果使用不隔离级别就会出现以下问题
脏读 (T1事务读取字段修改更新未提交T2事务在去读取字段就读取了无效的数据)
重复读 (T1事务读取了一个字段,此时T2事务把字段改了,就导致T1事务刷新一下数据改了)
幻读 (T1事务读取一个表T2事务此时在表中新增了几行数据,就导致T1事务看到的数据不同)
数据库隔离级别
readuncommitted(读未提交数据) 数据库隔离级别-->最低隔离级别
readcommited(读已提交数据) 数据库隔离级别-->比最低好一点点的隔离级别
repeatableread(可重复读) 数据库隔离级别-->中隔离级别
serializable(串行化) 数据库隔离级别-->高隔离级别(相当与java同步)
查看当前数据库的隔离级别--->select @@tx_isolation;
修改隔离级别--->set session transaction isolation level 隔离级别名
设置回滚断点:savepoint
---------------------------------------其他----------------------------------------------------
视图的介绍--->
创建视图语法 create view 视图名 as 查询语句(select)
修改视图:
方法一:alter view 需要修改的视图名 as 查询语句(select)
方法二:create or replace view 需要修改的视图名 as 查询语句(select)
删除视图:drop view 视图名,视图名...;
显示视图创建过程sql--->show create 视图名\G
存储过程--->
变量:
系统变量:
全局变量
会话变量
查询所有的系统变量
show global|session variables;
给变量赋值
set global|session 系统变量名=值;
自定义变量:
作用域:用户变量(相当于会话变量)|局部变量(只能用于begin end中)
用户变量
初始化 修改值:
set @变量名=值;
赋值:
select 字段 into @变量名;
局部变量
declare 变量名 类型;
declare 变量名 类型 default 值;
存储过程创建语法
结束标记:delimiter $ 可以设置结束标记
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的sql语句)
end
参数列表包含3部分
参数模式 参数名 参数类型
模式有 in out inout
空参存储过程语法
create procedure myp1()
begin
select * from student
end;
带in存储过程语法
create procedure myp2(in myname varchar(20))
begin
select * from student
where name=myname
end
带out存储过程语法
create procedure myp3(in myname varchar(20),out return varchar(20))
begin
select name into return from student
where name=myname
end;
带inout存储过程语法
create procedure myp3(inout my int)注(这里传过来的是个变量)
begin
set=my*2;
end;
删除存储过程--> drop procedure 存储过程名
查看存储过程的信息--> show create procedure 存储过程名
函数--->
创建语法:
create function 函数名(参数列表) Returns 返回值类型
begin
函数体
end;
注意:参数包含两部分
参数名 参数类型
函数体:肯定会有return语句不写也不会报错
案例---->
无参:
create function myf1() returns int
begin
declare c int default 0;
select count(*) into c
from student
return c;
end $
有参:
create function myf2(myname varchar(20)) returns int
begin
declare u int default 0;
select age into u
from student where name=myname
return u;
end
删除函数--> drop function 函数名
查看存储过程的信息--> show create function 函数名
流程控制结构--->
循序结构:程序从上往下执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码
1.分支结构
1.if函数
功能:实现简单的双分支
if(表达式1,表达式2,表达式3)
如果表达式1成立就返回表达式2的值否则就返回表达式3的值
应用场景:任何场合
2.case结构
语法:
case 变量|表达式|字段
when 要判断的值 then 要返回的值
when 要判断的值 then 要返回的值
...
else 要返回的值
end
应用场景:任何场合
3.if结构
if 条件1 then 语句1;
elseif 条件2 then 语句2;
【else 语句n】
end if;
应用场景:begin end;
2.循环结构
分类:
while loop repeat
循环控制:
iterate类似于 continue,继续,结束当前循环继续下一次
leave类似于 break,结束当前所在的循环
1.while 特点:先判断后执行
语法:
【标签:】while 循环条件 do
循环体
end while 【标签】;
案例:
1.没有用循环控制的
set @i=0;
while @i<=10 do
insert into values('1','王翔','29')
set @i=@i+1;
end while;
1.用到循环控制的
set @i=0;
a:while @i<=10 do
insert into values('1','王翔','29')
if @i=2 then leave a;
end if;
set @i=@i+1;
end while a;
2.loop 特点:没有条件的死循环
语法:
【标签:】loop
循环体
end loop 【标签】;
案例:
set @i=0;
a:loop
insert into values('1','王翔','29')
set @i=@i+1;
if @i=2 then leave a;
end if;
end loop a;
3.repeat 特点:先执行后判断
语法:
【标签:】repeat
循环体
until 结束循环的条件
end repeat 【标签】;
案例:
set @i=0;
a:repeat
insert into values('1','王翔','29')
set @i=@i+1;
until @i=10
end repeat a;
来源:https://www.cnblogs.com/xiaoheixiao/p/11003762.html