mysql制空_MySql学习

-- 注释

-- 启动mysql

mysql -hlocalhost -uroot -proot

-- 创建数据库

create database 数据库名 [库选项]

-- 查看数据库

show databases

--查看指定的数据库

show databases like 'pattern' --pattern 是匹配模式

-- '%':匹配多个字符的模式

-- '_':匹配单个字符的模式

-- 更新数据库

alter database 数据库名字 [库选项]

-- 删除数据库

drop database 数据库名字

-- 使用数据库

use 数据库名字

-- 增加数据表

create table 表名(

字段名字 数据类型,

字段名字 数据类型

) [表选项]

表选项:

字符集:charset utf8/gbk

校对集:

-- 查看数据表

show tables;

-- 查看部分表:模糊匹配

show tables like 'parrent' --pattern是匹配模式

-- 查看表结构

desc 表名

describe 表名

show columns from 表名

-- 修改数据表

修改表本身:

rename table 旧名 to 新名

alter table 表名 [表选项] = 新值

修改字段:

alter table 表名 add [column] 字段名 数据类型 [列属性][位置];

alter table 表名 change 旧的字段名 新的字段名 数据类型

-- 删除数据表

drop table 表名1,表明2....

-- 数据操作

-- 新增数据

insert into 表名 values(值列表) --全表添加

insert into 表名 (字段列表) values(值列表)

-- 查看数据

select * from 表名 [where 条件]

select 字段名 from 表名 where 条件

-- 更新数据 --不一定会成功

update 表名 set 字段 = 值 [where 条件]

-- 删除数据

delete from 表名 [where 条件]

-- 排序

升序:order by 字段名 asc

降序:order by 字段名 desc

-- 二、中文编码

查看服务器认为的字符集:

show variables like 'character_set%';

查看校对集:

show collation;

解决方法:修改服务器认为的客户端数据的字符集 --解决插入的不报错,显示仍然是乱码

set character_set_client = gbk;

快捷方式:set names 字符集

解决方法:修改服务器给客户端的字符集

set character_set_results = utf8;

-- 三、web的乱码

-- 四、数据类型

1.整数

2.浮点数

a.浮点型:整数部分超出长度会进位,小数超过长度会四舍五入

b.定点型:整数部分超出长度不会进位,小数多少位都没事

3.时间日期类型

datetime YYYY-mm-dd HH:ii:ss

date YYYY-mm-dd

time HH:ii:ss

timestamp YYYY-mm-dd hh:ii:ss --如果该字段的行被修改,那么该字段也会更新

year YYYY

4.字符串类型

char --定长字符串,设置存储的长度

char(L):可以存厨的长度,符号是字符,最长是255

varchar --变长,根据具体的数据确定分配空间的长度,最长是65536,但实际上只要超过255,就考虑使用text

定长比较浪费磁盘空间,但是效率高;变长节省空间,但是效率低

text --文本字符串,通常超过255个字符

blog:存储2进制数据

enum --枚举字符串

enum(可能出现的元素列表)

set --集合字符串

set(元素列表)

insert into 表名 values(num) --num对应的是二进制数

-- 五、字符和字节:

字节:字节是网络传输信息(或者硬盘或内存中存储信息)的单位

字符:字符是人们使用的一种标号,有两种不同编码:

ansi:一个汉字占用两个字节,其余的占用一个字节

unicode:都是占用两个字节

utf8:一个字符占用3个字节

-- 六、字段

1.列属性:

空属性:NULL和NOT NULL

2.列描述:

comment:用来说明

create table my_student(

name varchar(20) no null comment '姓名',

age int,

sex varchar(10)

)charset utf8;

3.默认值:

default:

create table my_default(

name varchar(20) not null,

age int,

gender enum('male','framale','secret') default 'male'

)charset utf8;

insert into my_default values('zhangsan',23,default);

4.主键:

primary key: 不能为空

create table my_default(

name varchar(20) not null,

age int,

gender enum('male','framale','secret') default 'male'

number char(10) primary key

)charset utf8;

追加主键:alter table 表名 add primary key(字段列表)

主键约束:主键对应的数据不允许重复

更新/删除主键:

alter table 表名 drop primary key;

主键的分类:

一般情况下用没有业务逻辑的字段作为主键,也就是没有实际存在的意义

5.自增长:

auto_increment:自增长,在添加数据时,设置成null就可以实现自增长

insert into 表名 values(null,字段1,字段2...)

查看下一次自增长的数是多少:show create table 表名

修改下一个自增长的值:alter table 表名 auto_increment = 值

追加自增长:alter table 表名 modify 字段 类型 auto_increment;

删除自增长:alter table 表名 modify 字段 类型;

6.唯一键:

unique/unique key:

不为空的唯一键就是主键

追加唯一键:alter table 表名 add unique key(字段)

删除唯一键:alter table 表名 drop index 字段

7.索引:

提升查询数据的效率

1.主键索引:primary key

2.唯一索引:unique key

3.全文索引:fulltext index -- 文章关键字的索引

4.普通索引;index

8.外键:

foreign key

一张表的字段(非主键)指向另一张表的主键

创建表的时候添加:foreign key(字段) references 含主键的表名(字段)

-- foreign key(c_id) references student(id)

创建表之后添加:

alter table 表名 add foreign key(字段) references 含主键的表名(字段)

查看外键:

show create table 表名;

删除外键:alter table 表名 drop foreign key 外键别名;

外键的作用:

约束字表的数据添加,因为一旦字表的外键在主表中没有找到,那么会显示添加失败;

约束主表的删改,如果主表的删改的字段已经被字表引用,则删改出错;

外键条件:

外键字段的类型必须与父表的主键类型完全一致

外键名称不能重复

外键约束:

1.district:严格模式(默认)

2.cascade:级联模式,父表的操作,对应字表关联的数据也跟着更新或者删除

3.set null:置空模式,父表的操作,对应字表关联的数据被置空

foreign key(外键字段) references 父表(字段) on delete set null update cascade;

常用的语法:'删除制空,更新级联!'

-- 七、关系

1.一对一:一张表的字段对应的信息对应另一张表的信息

2.一对多:一张表的记录对应另一张表的多条记录,应该在多条记录的表中增加主键

3.多对多:一张表的一条记录可以对应另一张的多条记录,并且另一张的一条对应多条的另一张。需要增加中间表

4.id值一般只是作为逻辑的主键,理论上来讲是用其他的字段作为业务主键

-- 八、数据高级操作

1.主键冲突:

解决方案:更新操作 --替换主键的值

insert into 表名 [(字段)] values (值列表) on duplicate key update 字段=新值

:替换 --替换主键对应的行的字段值

replace into 表名 values (值列表);

2.蠕虫复制:

从已有的数据中获取数据,然后将数据进行更新操作

insert into 新的表 [(字段)] select 字段或者* from 旧表

可以自己复制自己

3.更新数据:

update 表名 set 字段 = 值 [where 条件] limit 数量;

4.删除数据:

delete from 表名 [where 条件] limit 数量;

删除数据的操作不会改变表的结构,也就是说自增长的值不会重置

5.查询数据:

完整语法:select [select选项] 字段列表[字段别名] from 数据源 [where 条件子句][group by 子句][having 子句][order by 子句][limit 子句]

select选项:

all:默认的

distinct:去重,必须所有字段全部相同

字段别名:

字段 [as] 别名

可以在查看的时候看到自己的别名,方便用户查看

数据源:

单表数据源、多表数据源

子查询:

select 字段 from (select * from 表名) as 别名;

where语句:

select * from 表名 where 条件 -- in(数值) 范围在in里面的

select * from 表名 where 条件 -- between and 类似那种大于多少,小于多少的

group by:

分组筛选

count(字段名) 计数总数

max(字段名) 最大数

min(字段名) 最小数

avg(字段名) 平均数

sum(字段名) 总数

多字段分组:先分组之后再在分组成功之后的组里面分组

select 字段1,字段2 from 表名 group by 字段名1,字段名2;

having:

having 在分组完成之后可以自己操作

having 能够使用别名操作,where只能使用字段名

select 字段名 from 表名 group by 字段名 having ...

select 字段名 from 表名 where 条件 group by 字段名 ... --报错,where之后的条件需要分组结果进入内存之后才会生效,但是此处还未进入

order by:

排序

order by [字段名][asc/desc] --默认升序

limit:

限制数量

limit 位置,数量 --位置从0开始

limit offset,length -- offset = (页码-1)*length;

-- 九、连接查询

关键字:join

左表 join 右表

1.内连接:

[inner] join

从一张表中循环取出每一条数据,去逐个匹配另一张表的数据,匹配必须是某个条件成立时 --最常用

左表 inner join 右表 on 左表.字段 = 右表.字段;

select * from class inner join student on class.id = student.id;

-- 为了避免查询出来的结果出现相同的字段名,可以使用表别名,字段别名去有选择的显示

select s.*,c.classroom,c.classname from student as s inner join class as c on s.c_id = c.id;

2.外连接:

outer join

从一张表中循环取出每一条数据,去逐个匹配另一张表的数据,能匹配正确保留,不能匹配,其他表字段都制空null

左表 left join 右表 on 左表.字段 = 右表.字段;

select c.classroom,c.classname,s.* from class as c left join student as s on c.id = s.c_id;

有两种分类:

左连接:left join

右连接:right join

3.自然连接:

natural join

就是自动匹配连接条件,系统以字段名字作为作为匹配条件(同名就作为条件)

4.交叉连接:

cross join

从一张表中循环取出每一条数据,去逐个匹配另一张表的数据 --没用的,形成了交叉连接

左表 cross join 右表

-- 十、

1.联合查询

联合查询的字段数必须相同,不关字段类型

union[unicon选项]

all:重复查询

distinct:去重查询

select * from class union select * from student;

注意事件:

联合查询使用order by 要用括号括起两个查询语句

(select * from student where sex = 'boy' order by age asc) union (select * from student where sex = 'girl' order by age desc);

2.子查询:

按位置分类:

from子查询:

select name,height,weight from (select * from student where sex='boy') as student2;

where子查询:

exists子查询:

按结果查询:

标量子查询:

得到的结果是一行一列

列子查询:

得到的结果是多行一列,需要使用in作为条件匹配

select * from student where c_id in(select id from class)

行子查询:

得到的结果是一行多列,或者是多行多列

select * from student where (age,height) = (select max(age),max(height) from student);

-- 以上查询在where之后

表子查询:

from 后面必须是表名

select * from (select * from student order by height desc) as student2 group by c_id;

-- 子查询在from之后

-- 十一、视图

1.创建:

单表:create view 视图名字 as select语句

多表: create view 视图名字 as select s.*,c.classroom,c.classname from student as s left join class as c on s.c_id = c.id;

2.查看:

show tables;

desc table

show create view 表名

3.使用:

主要是为了查询,跟表没什么区别

select * from my_v1;

修改视图:

修改视图的来源(select 语句)

alter view my_v1 as 新的select语句

删除视图:

drop view 视图名字

-- drop view my_v1;

4.意义:

将复杂的sql语句进行保存,便于接下去的增删改查

5.视图数据操作:

新增数据:

不允许添加基表中不允许为空的数据

删除数据:

多表视图不能删除

单表视图可以删除

delete from my_v2 where id = 2;

更新数据:

单表视图或者多表视图都可以更新操作

update my_v2 set 字段名 = 值

6.视图算法

7.数据备份与还原

1.数据表备份:直接到对应的数据库文件夹下拷贝数据表的文件和表结构

数据表备份有前提条件,根据不同的存储引擎有不同的区别

存储引擎:mysql进行数据存储的方式,主要有两种:innodb和myisam

frm是结构,MYD是数据,MYI是索引

-- create table my_myisam(id int)charset utf8 engine=myisam;

备份时,直接拷贝三个文件到对应的数据下就可以了

单表数据备份:

select * into outfile 路径 from 表名 [fileds或者lines选项]

fileds选项:

enclosed by:字段内容被什么包裹

terminated by:字段以什么结束

escaped by:特殊符号是什么方式处理

lines:行处理

starting by:每行以什么开始

-- select * into outfile 'E://learngit/Mysql/class.txt' fields enclosed by '"' from class;

还原数据:

load data infile 路径 into table 数据库名字 [fileds或者lines选项];

-- load data infile 'E://learngit/Mysql/class.txt' into table class fields enclosed '"';

2.sql备份:

备份的是mysql语句,还原时只要执行sql指令就可以

mysqldump -hPup(端口号、用户名、密码) 数据库名 表名 > 路径

-- mysqldump -uroot -proot mydatabase student > E:/learngit/Mysql/student.sql

还原:

方案一:

mysql -hPup 数据库名字 < 路径

方案二:使用sql指令

source 路径;

-- 十二、事务

需求:A用户给B用户打钱,但是中途断电了。

1.事务操作:

a.自动事务

autocommit

现在最常见的方式

b.手动事务

+ 开启事务:start transaction

+ 事务操作:比如说是更新数据操作

+ 关闭事务:

提交事务:commit;

回滚事务:rollback;

+ 事务原理:

+ 回滚点:

设置回滚点:savepoint 回滚点名字

回到回滚点语法:rollback to 回滚点名字

2.事务特性:

-- 十三、变量

1.系统变量

查看系统变量:show variables;

查看系统变量值:select @@变量名

修改系统变量:

会话级别:只对当前客户端生效,一旦退出,恢复原来的初始值

-- set 变量名 = 值;set @@变量名 = 值;

全局级别:一次修改,永久生效

-- set global 变量名 = 值

2.自定义变量 --也是会话级别

设置变量:

-- set @变量名 := 值;

查看变量:

-- select @变量名

从数据表中查询一列赋值给自定义变量

-- select @变量名 := 字段名,字段名 from 表名;

一次赋值一条

-- select 字段1,字段2 from 表名 where 条件 into @变量名1,@变量名2; 这里的条件要保证得到的是一行数据

-- 十四、触发器

trigger

为某张表绑定一段代码,当表中的某些内容发生改变时,系统会自动执行这段代码

事件类型:

增删改

触发时间:

before after

触发对象:

表中的每一条记录

创建触发器:

delimiter 自定义符号 后续代码中只有碰到自定义符号才算结束

-- create trigger 触发器名字 触发时间 事件类型 on 表名 for each row;

begin

-- 每一条记录要执行的操作

end

自定义符号

-- 重新设置自定义符号

delimiter ;

使用触发器:

if分支:

if 条件 then

...

else

...

end if

循环结构:

while循环(没有for循环)

while 条件 do

-- 执行代码

-- 变更条件

end while

循环控制:

iterate:迭代,类似continue,后面的代码不执行,循环重新来过

leave:离开,类似break

使用方法:

leave iterate 循环名字

-- 定义循环名字

循环名字:while 条件 do

...

leave iterate 循环名字

end while

函数: -- 字符串的操作单位是字符,所以不会出现乱码问题

有返回值,所有mysql用select收集结果

内置函数:

substring(str,pos,len); --字符串截取

char_length(str) --字符长度

length(str) -- 字节长度

instr(str,'target_str') -- 返回字符串在某一个字符串中的位置

lpad(str,len,'target-str') --左填充,以字符为单位,添加的长度原本的长度也要算上

insert(str,pos,len,newstr) --替换,找到目标位置,替换新的字符串

strcmp(str1,str2) -- 字符串比较,逐位比较,不区分大小写

自定义函数:

1.创建函数:

create function 函数名([参数列表]) returns 数据类型

begin

函数体

return 返回值

end

2.查看函数

show function status; --查看所有函数

show create function 函数名 --查看创建函数的信息

3.函数参数

需求:求1到任意数的和

delimiter $$

create function display2(num int) returns int

begin

set @i = 1;

set @res = 0;

while @i < num do

set @res = @res + @i;

set @i = @i + 1;

end while;

return @res;

end

$$

delimiter ;

4.函数变量作用域

声明变量

declare 变量名 变量类型 default 值

-- declare i int default 1

delimiter $$

create function display3(num int) returns int

begin

declare i int default 1;

declare res int default 0;

mywhile:while i < num do

if i % 5 = 0 then

set i = i + 1;

iterate mywhile

end if

set res = res + i;

set i = i + 1;

end while;

return res;

end

$$

delimiter ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值