MySQL
Posted sanqiansi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL相关的知识,希望对你有一定的参考价值。
1、sql语句
库,表,记录的增删改查
2、库详细操作
3、表详细操作
创建表
数据类型
完整性约束
1、数据库是什么?
数据库本质就是一个C/S的套接字软件
常见的数据库:
关系型:
mysql
mariadb
oracle
db2
sqlserver
非关系:
存取数据都是以key:value
mongodb
redis
memcache
2、数据库相关概念
数据库服务器:运行有数据库管理软件的计算机
数据库管理软件mysql:就是一个套接字服务端
库:就是一个文件夹
表:就是一个文件
记录:就相当于文件中的一行内容(抽取事物一系列典型的特征拼到一起,)
数据:用于记录现实世界中的某种状态
破解密码
#1、关闭mysql net stop mysql #2、重新启动 mysqld --skip-grant-tables #3 mysql -uroot -p update mysql.user set password=password("egon123") where user="root" and host="localhost"; flush privileges; #4、关闭mysql,正常启动 net start mysql
基本SQL语句
文件夹:库 增 create database db1 charset utf8; 删 drop database db1; 改 alter database db1 charset gbk; 查 show databases; show create database db1; 文件:表 切换文件夹 use db1; select database(); 查看当前所在的库 增 create table t1(id int,name char); create table db1.t1(id int,name char); 删 drop table t1; 改 alter table t1 add age int; alter table t1 modify name char(15); alter table t1 change name NAME char(15); alter table t1 drop age; 查 show tables; show create table t1; desc t1; 文件内的一行行内容:记录 增 insert into t1(id,name) values (1,‘egon‘), (2,‘lxx‘), (3,‘alex‘); 删 delete from db1.t1 where id >= 2; create table t2(id int primary key auto_incremnt,name char(15)); insert into t2(name) values (‘egon‘), (‘lxx‘), (‘wxx‘), (‘axx‘); 清空表应该使用: truncate t2; 改 update db1.t1 set name=‘lxx_dsb‘ where id=2; 查 select id from db1.t1; select id,name from t1 select name,id from t1; select * from t1; select * from t1 where id >= 2;
表详细操作
一、创建表的完整语法 #语法: create table 库名.表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); 约束条件:是在数据类型之外对字段附加的额外的限制 #注意: 1、最后一个字段之后不能加逗号 2. 在同一张表中,字段名是不能相同 3. 宽度和约束条件可选,字段名和类型是必须的 二、数据类型 #1、整型:默认是有符号的 create table t3(x tinyint); ps:修改sql_mode为严格模式,必须重启客户端才能生效 set global sql_mode="strict_trans_tables"; select @@sql_mode; create table t4(x tinyint unsigned); # 强调:整型类型后面的宽度限制的根本不是存储宽度,限制的是显示宽度 create table t5(id int(1)); create table t6(id int(5)); #2、浮点型: float(255,30) double(255,30) decimal(65,30) create table t8(x float(255,30)); create table t9(x double(255,30)); create table t10(x decimal(65,30)); insert into t8 values(1.111111111111111111111111111111); insert into t9 values(1.111111111111111111111111111111); insert into t10 values(1.111111111111111111111111111111); 3、日期类型 year 1999 date 1999-11-11 time 08:30:00 datetime/timestamp 1999-11-11 08:30:00 create table student( id int primary key auto_increment, name char(16), born_year year, birth date, class_time time, reg_time datetime ); insert into student(name,born_year,birth,class_time,reg_time) values (‘egon1‘,now(),now(),now(),now()); insert into student(name,born_year,birth,class_time,reg_time) values (‘egon1‘,2000,20001111,now(),now()); insert into student(name,born_year,birth,class_time,reg_time) values (‘egon1‘,2000,‘2000-11-11‘,083000,now()); insert into student(name,born_year,birth,class_time,reg_time) values (‘egon1‘,2000,‘2000-11-11‘,"08:30:00",20171111111111); insert into student(name,born_year,birth,class_time,reg_time) values (‘egon1‘,2000,‘2000-11-11‘,"08:30:00","2017-11-11 11:11:11"); create table t11(x timestamp); create table t12(x datetime not null default now()); 4、字符类型 # 注意:宽度指限制的是字符个数 char:定长 char(5) varchar:变长 varchar(5) 相同点:宽度指的都是最大存储的字符个数,超过了都无法正常存储 不同点: char(5): ‘m‘--->‘m ‘5个字符 varchar(5) ‘m‘--->‘m‘1个字符 set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; 注意:mysql在查询时针对where 字段="值 "会忽略掉右面的空格,即where 字段="值" 如果时like模糊匹配就不会忽略右面的空格了 char(5) egon |axx |lxx |fm | varchar(5) 1bytes+egon|1bytes+axx|1bytes+lxx|1bytes+fm| # 宽度相关练习 mysql> create table t13(x char(5)); Query OK, 0 rows affected (0.20 sec) mysql> create table t14(x varchar(5)); Query OK, 0 rows affected (0.27 sec) mysql> mysql> mysql> insert into t13 values(‘xxxxxx‘); ERROR 1406 (22001): Data too long for column ‘x‘ at row 1 mysql> insert into t14 values(‘xxxxxx‘); ERROR 1406 (22001): Data too long for column ‘x‘ at row 1 5、枚举与集合类型 枚举enum(‘a‘,‘b‘,‘c‘):多选一 集合set(‘a‘,‘b‘,‘c‘):多选多 create table emp( name varchar(15), sex enum(‘male‘,‘female‘,‘unkown‘), hobbies set(‘read‘,‘music‘,‘yinshi‘,‘play‘) ); insert into emp values (‘zhangming‘,‘xxx‘,‘xxxx‘); mysql> insert into emp values(‘zhangming‘,‘female‘,‘read,play‘); Query OK, 1 row affected (0.03 sec) mysql> select * from emp; +-----------+--------+-----------+ | name | sex | hobbies | +-----------+--------+-----------+ | zhangming | female | read,play | +-----------+--------+-----------+ 1 row in set (0.00 sec)
表的完整性约束
一、创建表的完整语法 #语法: create table 库名.表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); 约束条件:是在数据类型之外对字段附加的额外的限制 #注意: 1、最后一个字段之后不能加逗号 2. 在同一张表中,字段名是不能相同 3. 宽度和约束条件可选,字段名和类型是必须的 二 not null与default create table t1( id int primary key auto_increment, name varchar(16) not null, sex enum(‘male‘,‘female‘) not null default ‘male‘ ); insert into t1(name) values(‘egon‘),(‘lxx‘),(‘alex‘); 三 unique key create table t2(x int unique); create table t3( x int, y varchar(5), unique key(x) ); create table t4( x int, y varchar(5), constraint uni_x unique key(x) ); create table service( ip varchar(15), port int, unique key(ip,port) ); insert into service values (‘1.1.1.1‘,3306), (‘1.1.1.1‘,3306); 四 primary key 站在约束角度看primary key=not null unique 以后但凡建表,必须注意: 1、必须有且只有一个主键 2、通常是id字段被设置为主键 create table t5( id int primary key auto_increment ); # 补充存储引擎: create table t12(x int)engine=‘myisam‘; create table t13(x int)engine=‘innodb‘; create table t14(x int)engine=‘memory‘; create table t15(x int)engine=‘blackhole‘; 五 foreign key:限制关联表某一个字段的值必是来自于被关联表的一个字段的 # foreign key注意: # 1、被关联的字段必须是一个key,通常是id字段 # 2、创建表时:必须先建立被关联的表,才能建立关联表 create table dep( id int primary key auto_increment, dname varchar(20), info varchar(50) ); create table emp( id int primary key auto_increment, name varchar(15), age int, dep_id int, foreign key(dep_id) references dep(id) on update cascade on delete cascade ); # 3、插入记录时:必须先往被关联的表插入记录,才能往关联表中插入记录 insert into dep(dname,info) values (‘IT‘,‘技术能力有限部门xxx‘), (‘Sale‘,‘文化程度不高‘), (‘HR‘,‘招不到人部门‘); insert into emp(name,age,dep_id) values (‘egon‘,18,1), (‘alex‘,28,2), (‘wsj‘,38,2), (‘lxx‘,30,1), (‘xiaohou‘,18,3); ps:删除时:应该先删除关联表emp中的记录,再删除被关联表对应的记录 # 找两张表的关系的窍门 emp dep #1、先站在左表的角度:去找左表emp的多条记录能否对应右表dep的一条记录 翻译:多个员工能否属于一个部门 #2、然后站在右表的角度:去找右表dep的多条记录能否对应左表emp的一条记录 翻译:多个部门能否拥有同一名员工 # 多对一:结果的判断 #1、如果只有单向的多对一成立,那么最终的关系就是多对一 #2、在emp表新增一个字段dep_id, 该字段外键关联dep(id) # 多对多:结果的判断 #1、双向的多对一就是多对多 #2、需要建立第三张表,有一个字段值fk左表,一个字段的值fk右表 create table author( id int primary key auto_increment, name varchar(16), age int ); create table book( id int primary key auto_increment, bname varchar(20), price int ); create table author2book( id int primary key auto_increment, author_id int, book_id int, foreign key(author_id) references author(id) on update cascade on delete cascade, foreign key(book_id) references book(id) on update cascade on delete cascade ); # 一对一:无需参考窍门,左表的一条数据唯一对应右表的一条记录 fk+unique
?一 ?子查询
什什么是?子查询?
当?一个查询是另?一个查询的条件时,这个查
询称之为?子查询(内层查询)
什什么时候?用?
当查询需求?比较复杂,?一次性查询?无法得到
结果,需要多次查询时,
例例如:给出?一个部?门名称,需要获得该部
?门所有的员?工信息
需要先确定部?门的id,
然后才能通过id确定员?工
解决问题的?方式是把?一个复杂的问题拆
分为若?干个简单的问题
如何使?用?
?首先明确?子查询就是?一个普通的查询,
当?一个查询需要作为?子查询使?用时,?用括号包
裹即可
案列列:
准备数据:
create table emp (id int,name char(10),sex char,age int,dept_id int,job
char(10),salary double);
insert into emp values
(1,"刘备","男",26,1,"总监",5800),
(2,"张?飞","男",24,1,"员?工",3000),
(3,"关?羽","男",30,1,"员?工",4000),
(4,"孙权","男",25,2,"总监",6000),
(5,"周瑜","男",22,2,"员?工",5000),
(6,"?小乔","?女女",31,2,"员?工",4000),
(7,"曹操","男",19,3,"总监",10000),
(8,"司?马懿","男",24,3,"员?工",6000);
create table dept(id int primary key,name char(10));
insert into dept values(1,"市场"),(2,"?行行政"),(3,"财务");
需求:财务部有哪些:
数据在两张表中 可以使?用链接查询
select emp.name from emp inner join dept on dept.id = emp.dept_id
where dept .name = "财务";
?子查询?方式:
数据在两张表中,先查询那张?
emp? 不不?行行 不不知道部?门名 查dept
第?一步 需要知道财务部的id
select id from dept where name = "财务";
第?二步 ?用查询的到的id作为判断条件查询emp
select name from emp where dept_id = 3;
3不不能写死 是上?一个查询的结果 所以直接写在后?面 加上括号就变成了了?子查询
select name from emp where dept_id = (select id from dept where name
= "财务");
in 关键字?子查询
查询平均年年龄?大于25的部?门名称
?子查询?方式:
平均年年龄?大于25的部?门有哪些?
先要求出每个部?门的平年年龄!每个表示什什么? 分组
select name from dept where id in (select dept_id from emp group by
dept_id having avg(age) > 25);
多表查询?方式:
先把数据拼接到?一起 在加以筛选
select dept.name from emp inner join dept
on emp.dept_id = dept.id
group by dept.name
having avg(age) >25;
exists关键字?子查询
exists 后跟?子查询 ?子查询有结果是为True 没有结果时为False
为true时外层执?行行 为false外层不不执?行行
select *from emp where exists (select *from emp where salary > 1000);
select (exists (select *from emp where salary > 10000));
综合练习:
查询每个部?门?工资最?高的员?工信息
先查询每个部?门的最?高?工资
select *from emp inner join
(select dept_id,max(salary) m from emp group by dept_id) t2
on emp.dept_id = t2.dept_id
where
emp.dept_id = t2.dept_id
and
emp.salary = t2.m;
?二 正则表达式匹配
正则表达式?用于模糊查询,模糊查询已经讲
过了了
like 仅?支持 % 和 _ 远没有正则表达式灵活
当然绝?大多数情况下 like?足够使?用
语法:
insert into emp values(1,"laowangba","男",26,1,"总监",5800);
insert into emp values(1,"laoliba","男",26,1,"总监",5800);
insert into emp values(1,"laocheng","男",26,1,"总监",5800);
select *from table where name regexp
"正则表达式";
三 mysql?用户管理理
!这是dba的活?儿!,但是万?一公司没有dba?
mysql?用户指的是什什么?
我们每?一次在操作前都需要指定账号和密码,这个账号就是mysql的?用户;
为什什么要管理理?
?一个公司不不可能只有?一个?工程师,?大公司,不不不不仅有很多?工程师 还有很多不不
同部?门,但是数据库服务器?只有?一个,?大家都要访问,这就涉及到?用户和权限问题了了
?一个?工程师对应?一个账户,
哪些?工程师可以操作哪些数据库,哪些表,甚?至哪些字段,都可以进?行行控制,
例例如,腾讯,有qq和微信不不同项?目,qq的?工程师,就不不应该去访问微信项?目的数据;
mysql是如何管理理的
mysql本质上是?一款cs软件,它具备?用户认证!
我们有没有做过?用户认证呢? ATM! 购物?车,都做过,
我们是如何实现的?写?入?文件,mysql也是?一样的,
登录流程简述!
只不不过它把?文件称为表
那我们需要添加账户,要怎么添加呢?
把?用户信息写?入表中就可以了了,
我们来看看它都把数据放在哪个表中了了!
?自带的mysql数据库,
user
db
table_priv
columns_priv
四个表?用于存储账户信息以及权限
权限优先级:
user->db->table_priv->columns_priv
desc查看结构
内置root账户字段信息解析
创建账号:
create user ?用户名@"ip地址" "identified" by 密码;
create user [email protected]"192.168.101" identified by "123";
该语句句表?面tom只能在101机器?上使?用,别的机器?就?无法登录
?用%可以表示在任意机器?可?用
注意:该?方式创建的账号没有任何权限
需要使?用授权语句句
授权:
授权语句句执?行行时如果账号不不存在会?自动创建账号 所以推荐使?用
注意:默认只有root才能为其他账号授权
grant all on *.* to [email protected]"localhost" identified by "123";
该语句句中的all 也不不包括grant权限
*.* 表示任何数据库 任何表 存储在user表
grant all on db.* to [email protected]"localhost" identified by "123"
db.* 该?用户可以操作db数据库的任何表 存储在 db表
grant all on db.t1 to [email protected]"localhost" identified by "123"
db.* 该?用户可以操作db数据库的t1表 存储在 table_privi表
精确到字段 和 操作级别
grant select(id) on db.t1 to [email protected]"localhost" identified by "123"
该?用户只能查询 db下的t1表
grant all on *.* to [email protected]"localhost" identified by "123" with grant option;
with grant option 表示该账户可以将权限授予其他?用户
收回权限
REVOKE all privileges [column] on db.table from [email protected]"host";
删除?用户
drop [email protected]"host"
flush privileges;
刷新权限表
四 pymysql
是什什么? python编写的mysql客户端
pip install pymysql
?无论是什什么客户端第?一件事?干啥?
c/s程序 socket
链接服务器?
指定相关的参数
获取链接对象
获取游标对象
执?行行sql语句句
获取执?行行结果
提取数据
fetchone
fetchall
fetchmany
scroll
增删改查
指定查询结果为字典类型
pymysql.cursor.DictCursor
sql 注?入
实现?用户登录注册
登录时 演示sql注?入
如何避免
客户端限制
模拟请求怎么破?
服务器?端验证
以上是关于MySQL的主要内容,如果未能解决你的问题,请参考以下文章