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的主要内容,如果未能解决你的问题,请参考以下文章

MySQLMySQL 一些 使用 案例

MySQL的常用操作更改root密码连接MySQLMySQL常用的命令

MySQLMysql必会语句

MySQLMysql必会语句

MySQLMysql必会语句

mysqlmysql优化