广州39期-余梅 发表于 2022-3-5 20:10:01

mysql 笔记整理

本帖最后由 广州39期-余梅 于 2022-3-5 21:00 编辑

Mysql是关系型数据库管理系统,依据关系模型创建的数据库,把数据保存在不同的表中,表与表存在着某些关系。
关系型数据库有哪些:db2 、oracle 、mysql 、sql server

非关系型数据库也叫nosql数据库,全称not only sql。通常数据以对象的形式存储在数据库中,不固定结构,例如列模型,键值对模型。

非关系型数据库有:hbase(列模型) 、redis(键值对模型) 、mongodb(文档类模型)

安装好MySQL,要去使用它,首先必须先启动MySQL。
service mysqld start==>启动mysqld服务
service mysqld stop ==>停止mysqld服务
service mysqld status ==>查看mysqld的状态
service mysqld restart ==>重启mysqld的服务


第一次登陆是不需要输入密码:
mysql -uroot -p   
退出三种方式:quit、exit、Ctrl+c

设置mysql数据库的登陆密码(要在Linux的界面执行):
mysqladmin -uroot password "123456"
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\120ac34119fd4977bee785195a9de1c9\clipboard.png

设置密码后的两种登陆方式:
明文密码:mysql -uroot -p123456
密文密码:mysql -uroot -p   加回车输入密码

SQL语句---只能在mysql等数据库操作系统中执行的
mysql>
每一条SQL语句都是以英文的‘;’结尾的

show databases;   ==>查看 所有的数据库
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\9c0e44f7a7834189a5c0010dc3039c62\clipboard.png
use +库名;==》进入对应的库中进行操作
show tables; ==>查看 对应库中所有的表
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\9f32549e53df4c598ff94cd52693c192\lrdh}}km]`{}pjux}2{)j%8.png

create database +库名;   ==》创建 xxx 库(数据库)

select database();==>查看当前操作哪个库
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\35ae385ddf2c487990d3c5b395e4d9d9\xp1mc)t`g8}bhy154q1g5cb.png

create table 表名(字段名1 字段属性,字段名2 字段属性,...... );===>创建表,命名为xx,里面包含xx1字段属性是xxx
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\4c7cdde7bc5043459a6591e870921f0b\clipboard.png

常见的数据类型:
int:整型,整数数字 只能保存4个字节的数字 -2^31~+2^31(-2147483647~2147483647)
0000 0000 0000 0000 0000 0000 0000 0000
当需要保存超过10位数的整数需要使用bigint
bigint:大整型,整数数字,可以保存最大8个字节的数字

浮点数:
float:保存小数 4个字节
double:保存小数 8个字节

字符串:
char:定长字符串,固定占255个字节,性能会更好些,但是不节省资源
varchar:可变长字符串,占0~2^16个字节,性能稍微差,但是节省资源

日期:
date 保存日期,固定格式 YYYY-MM-DD

** 当输入字符串、日期、名字时,要加英文的‘’

常见的约束:
primary key:主键约束,特点:表中主键字段的值不能为空,主键字段的值不能重复(例如上学时,班上的同学姓名可能重复,但是学号是唯一而且必要的)
not null:非空约束(必须要填的)
default:默认值约束(字段)
auto_increment:自增长约束,只能在主键字段使用,而且只能是数据类型为整型的去使用,例如不输入id时,直接跟着原来最大的id+1


desc +表名; ==》查看表结构
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\f5e70ac167c143e7b1c0713a4583dbe9\clipboard.png

修改表结构的操作:alter table
alter table test rename test1; =修改表 test表重命名为test1
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\1202ffb6592a4a19a53ef1a7dba67a2d\clipboard.png
alter table test1 rename test; =修改表 test1表 重命名为test

alter table test change id sid int(4); ==修改表 test表 改变 id字段 为sid字段,属性为int(4),并取消自增长约束
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\04e620e96a3a40f49c73b3272016dd3a\clipboard.png
alter table test change sid sid int(4) auto_increment; ==》给sid字段添加自增长约束
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\b59f1586ccc54bfd8c5298044ee75f11\vm)78)%t@eoqlfagbb$nfce.png

alter table test add class int(4); ==修改表 test表 增加class字段,属性为int(5)--默认增加在最后
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\2a3b4328bfba4779b0ee50fcef27d13f\clipboard.png
alter table test add sex varchar(5) first;修改表 test表 增加sex字段,属性为varchar(5) 放在第一位(first)
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\04766f9baf034730abd53fc0aad98ae5\clipboard.png
alter table test add age int(4) after name; =修改表 test表 增加age字段,属性为int(4)放在name字段后面
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\2e490acacd6f485fa848b8ec2f13aa3c\clipboard.png

alter table test drop sex; ==修改表 test表 丢弃 sex字段
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\b7d0feafc2db487cabc911c45c198d3b\clipboard.png
alter table test drop age,drop class; ==修改表 test表 丢弃age字段,丢弃class字段
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\7d200cab5fa343c08c27730e30cfb9ce\clipboard.png
alter table test add(age int(4),class int(4));修改表 test表 增加 age字段和class字段
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\bbc32c891d0544d099ae57689ebe8494\clipboard.png

alter table test change age age int(4) after name; ==修改表 test表 改变age字段为age字段属性为int(4) 放在name字段后面
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\44520f9d97f64ae380a2eda28e568064\clipboard.png
alter table test modify class bigint(8) after sid; ==修改表 test表 修改class字段属性为bigint(8) 放在sid字段后面
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\e109fdab3ae34b7fbab685ac1b18b625\clipboard.png

change和modify的区别:
两者都是可以改变表结构,但是使用change时字段是要写两次的,modify则只要写一次就行。change可以对字段名进行重命名,modify则不行

删除主键
因为一张表中最多只有一个主键,使用可以直接通过drop primary key的方式进行删除
mysql> alter table test drop primary key;      
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
直接执行删除主键时,报错,因为这个主键字段还有自增长约束,自增长约束必须依赖主键约束,所以删除主键之前要先删除自增长约束
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\b1c563824cc1402e86d912f9430ab14e\clipboard.png
1,先删自增长:alter table test modify sid int(4);
2,再删主键约束:alter table test drop primary key;

添加主键:
方式一:
alter table test add primary key(sid);
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\05c76049a0cc4036b16fa479f6779e89\clipboard.png
方式二:
alter table test change sidsid int(4) primary key;

增删改查
查--select
select * from 表;==>查询 所有字段的值 来源 那张表
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\bc1c09f67dd64ccd864757b2ed9595c2\clipboard.png
select sid,name,class,age from test;


增---insert into
方式一:要求表的字段不多,对表结构要熟悉
1,插入的值的数量必须要跟字段数量一致
2,值的格式必须要一一对应上字段要求的格式
insert into 表名 values (字段1的值,字段2的值,字段3的值,....),(字段1的值,字段2的值,字段3的值,....)
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\f4324c7fa75c4aa2907bb5f8170ac5a8\clipboard.png

方式二:对指定字段插入数据
insert into 表名(字段4,字段2,字段1) values(字段4的值,字段2的值,字段1的值),(字段4的值,字段2的值,字段1的值);
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\2c063d76c972424094a1b6c15a3455db\clipboard.png


字符串和日期类型的数据插入必须要加英文的成对引号

NULL和 '   ':NULL是完全的不占系统空间,''是占系统一个字节0的空间


删除表:
drop table +表名; ==》删除表 xx表
删除库:
drop database +库名 ==》删除库 xx库

删---delete
delete from test where sid = 258;==》按照条件删除指定数据

delete from 表;==》不限定条件删除表中数据,可以清空表中内容

改--update 。。。 set
update test set class=2239;
file:///C:/Users/Administrator/AppData/Local/YNote/data/qq67FAC18E332B009E65A30FC28F9FAAB8/660a33e46bc1472d820c4e4abb3a0311/_7%imvbdt(c4tysc0qz7vv6.png
update test set name='dcs39' , age=38 , score=100 , time='20220301' where sid=5;



C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\535e1524a393465b911e250b4f876ef8\clipboard.png

C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\17c8266cbad24174aa7cd8aeb90cfa9b\clipboard.png
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\5e178dd4a723405d99334ac930bc7072\clipboard.png
条件查询先接where
select *from emp where name='李四';
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\a603c63c44294d9b90272fa61fa3431b\clipboard.png

不等于 !=<> (null是不参与等于或者不等于,大小匹配的)
select name,incoming from emp where dept2!=101;
select name,dept2 from emp where dept2 <> '101';
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\ee69b32e7a4a4a81a04ec35f47bbbbd2\clipboard.png
多条件查询
and条件:要求两边同时满足
select *from emp where dept2=101 and incoming=3500;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\4452edbfb8b34c388995179af0bb1160\clipboard.png
or条件:以or为分界,两边只要满足一个
select *from emp where dept2=101 or incoming=7500;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\c3a71b2ff9e543a8962824353f885193\1uj)l9z$`qr{llmos~dba6w.png

null值的匹配
select *from test where score is null;
select * from test where score is not null;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\9c0e26ecd8f94c1fb08ffe5c8a927a3b\ri4t`u72vvyh3pq3@o0%@}5.png

大于小于的匹配
select *from test where age >19 and age <=28;
between。。and。。:介于,是包含着等于的闭区间
select *from test where age between 19 and 28;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\4f0200c612204c04a363ce96045df09f\clipboard.png

in与not in(与or有点类似)
select *from test where age in (18,20,28);
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\019879e32c4e409b852d1b7dde250155\clipboard.png
select *from test where age not in (18,20,28);
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\dd2f22e7f6124a45870d74a3e66168c5\clipboard.png

linux的模糊匹配符: ‘*’‘?’
但是在mysql中*和?有其他作用
mysql中的模糊匹配符:‘%’‘_’
'%' :匹配0个或者多个字符
‘_’:匹配1个字符
模糊匹配:like
select * from test where name like '%m%';
select * from test where name like 'xiao__';
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\284e37c4ba5f4c0cb429f5a3ee3470e7\clipboard.png
select * from test where time like '2022%'
select *from test where age like '2%';
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\2aee88a1436b41b9b2144db617105956\q0b9x752jgbxpoovmds%_rq.png

查询限定的数据---分页查询 limit,只能放在最后面
select *from test limit 0,3;
select *from test where age is not null limit 0,4;

错误的:select *from test limit 0,4 where age=28;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\56c24a2b3548439ebe94b26130abb2bd\whf5jgv3q%iyh$bdi%@xc)w.png

排序order by
如果结合limit使用,那么limit也是放在后面
asc是升序,desc是降序
select *from test order by age asc;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\ea5b88f7191447b0b74a87fd7f50e9ee\_s$l_d4ix1$(xsbbo_o)7{v.png
select *from test order by time desc;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\152e1964be1343798d3eb22f2d273c6e\clipboard.png
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\cd6c9d49d1c3497990b47cbda5ff9d48\clipboard.png
select *from test where time is not null order by time asc limit 3; ==》先做where条件过滤,在做order by排序,最后做limit限定查询
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\4bd15136d79a4f76b1d347eff52c9e79\g$hbxt91ei0{g$_h7ad~l43.png
select *from test order by phone desc,age asc; ==》对多个字段同时排序,谁在前谁优先级更高
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\2ef7c86194624e979eadbf18db0225c3\clipboard.png
分组 group by
注意:
1,分组查询要查询指定的字段,对什么进行分组就查询什么字段。因为分组之后,只有分组字段可以正常匹配,其他非分组字段(普通字段)是随机出现(一般是表中第一条)
2,使用group by分组之后,进行条件过滤,是不能使用where,where条件要写在group by之前
3,如果希望在group by分组之后进行条件过滤,则使用having(作用类似where,但是只能用在group by之后)
4,group by分组一般是结合 聚合函数使用,where条件是不能接聚合函数,having才可以接聚合函数
select dept2 from emp group by dept2;

select dept2,avg(incoming) from emp group by dept2;
select dept2,avg(incoming) from emp group by dept2 having avg(incoming)>6000;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\49628d5207c3494eadb9ec9b46fbf8e5\clipboard.png

select dept2,avg(incoming) from emp group by dept2 having dept2!=103;
select dept2,avg(incoming) from emp where dept2!=103 group by dept2;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\b26e956d5c6748bc927e1de3f8449b71\clipboard.png


聚合函数:
count()统计
select count(*) from 表; ==》统计表中行数
select count(1) from 表; ==》统计表中行数
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\f52fc32bbacd4548bc2ceb8215b8e568\clipboard.png
select count(字段名) from 表; ==》统计表中对应字段有多少条数据

sum() 求和
select sum(incoming) from emp;==》对表中某个字段进行求和,求emp表的总收入
avg() 平均值
select avg(incoming) from emp;

max() 最大值
select max(incoming) from emp;
min() 最小值
select min(incoming) from emp;

SQL中是可以进行四则运算的:(as 可以对字段进行取别名,目的让结果输出的字段名不那么长)
select (max(incoming)-min(incoming))*100 as '乱来的' from emp;

distinct() 去重复 去重
select distinct(phone) from test;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\7870d2b2df544e0eaa7f2e2a2a45f63c\clipboard.png

mysql中删除数据有多少种方式?
1,delete:可以根据条件删除指定数据,如果不接条件删除时,可以清空表中数据,但是重新插入数据时,自增长字段还是会在原来最大值基础上进行累积递增。(只删除表中数据,保留表结构,没有释放空间)

2,truncate:truncate +表名; ==》直接清空表中数据,不能接条件删除指定数据。保留表结构,重新插入数据时,自增长会重新从1开始(清空表中数据并释放空间,保留表结构)
3,drop table +表名; ==》删除整张表,删除数据,表定义也被删除(释放空间)

备份:
备份表==》直接在数据库中操作的
1,先备份表结构
create table 新表 like 旧表;
2,再备份表数据(把整张表的数据进行备份)
insert into 新表 select *from 旧表;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\cdfb29d0bcd349f588eaf5f17f74bbba\clipboard.png
insert into new(sid,name) select sid,name from emp;

备份整个库(整个库中所有的表结构和表数据)==》在Linux界面执行,通过Linux中mysql相关的指令进行
1,备份数据库---mysqldump
mysqldump -uroot -p123456 需要备份的库 > ./脚本文件.sql
mysqldump -uroot -p123456 dcs39 > ./mysqldcs39.sql
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\effb617066a941b8bb91dde661e5a0d6\clipboard.png
2,还原备份的SQL脚本文件(必须要有对应的库)
mysql -uroot -p123456 必须在mysql里面的一个库 < ./脚本文件.sql
mysql -uroot -p123456 dcs40 < ./mysqldcs39.sql

mysql数据库的权限操作:
必须要进入mysql库中===》use mysql;

查看当前MySQL中有什么操作用户:
select host,user,password from user;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\becdba02b9fb4c92942e0447bdc7b2e6\`vzalm7ox}l05h$pt%6whup.png
通过插入user表数据的方式来创建用户(一般不使用的,因为要重复赋予权限)
insert into user(host,user,password) values('localhost','dcs39',password('123456'));
密码的插入需要使用password()函数进行加密
对数据库中任何的权限操作都要使用 进行权限刷新:
flush privileges;

增加权限:
grant insert,delete,update,select,create on *.* to 'dcs39'@'localhost' identified by '123456';==》赋予insertdelete,update,select,create权限在所有的库里面的所有的表给在本地网络位置的dcs39用户密码是123456
权限刷新:flush privileges;
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\e3c2f6b02a744d26aba0f6bd77b676d2\clipboard.png


创建MySQL用户可以直接通过 grant 的方式进行:
grant all privileges on *.* to 'root'@'%' identified by '123456';==》赋予 所有的权限 在所有的库里面的所有的表 给 远程网络权限(%)的root用户 密码是123456
创建后权限刷新:flush privileges;


show grants for 'root'@'%'; ==》查看指定用户的权限情况
C:\Users\Administrator\AppData\Local\YNote\data\qq67FAC18E332B009E65A30FC28F9FAAB8\6d2dfd29380a49a3ab93f5f3d407724e\clipboard.png

revoke all on *.* from '用户'@'网络位置';==》取消所有权限

update mysql.user set password=password('123457') where host='localhost' and user='dcs39';==》修改 'dcs39'@'localhost'的密码

删除用户:通过delete from mysql.user where host='网络位置' and user='用户名';



页: [1]
查看完整版本: mysql 笔记整理