码迷,mamicode.com
首页 > 数据库 > 详细

MySQL

时间:2018-09-18 00:19:23      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:rac   error   服务器   etc   dep   cad   信息   date   enc   

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 tom@"192.168.101" identified by "123";
该语句句表?面tom只能在101机器?上使?用,别的机器?就?无法登录
?用%可以表示在任意机器?可?用
注意:该?方式创建的账号没有任何权限
需要使?用授权语句句
授权:
授权语句句执?行行时如果账号不不存在会?自动创建账号 所以推荐使?用
注意:默认只有root才能为其他账号授权
grant all on *.* to tom@"localhost" identified by "123";
该语句句中的all 也不不包括grant权限
*.* 表示任何数据库 任何表 存储在user表
grant all on db.* to tom@"localhost" identified by "123"
db.* 该?用户可以操作db数据库的任何表 存储在 db表
grant all on db.t1 to tom@"localhost" identified by "123"
db.* 该?用户可以操作db数据库的t1表 存储在 table_privi表
精确到字段 和 操作级别
grant select(id) on db.t1 to tom@"localhost" identified by "123"
该?用户只能查询 db下的t1表
grant all on *.* to tom@"localhost" identified by "123" with grant option;
with grant option 表示该账户可以将权限授予其他?用户
收回权限
REVOKE all privileges [column] on db.table from user@"host";
删除?用户
drop user@"host"
flush privileges;
刷新权限表
四 pymysql
是什什么? python编写的mysql客户端
pip install pymysql
?无论是什什么客户端第?一件事?干啥?
c/s程序 socket
链接服务器?
指定相关的参数
获取链接对象
获取游标对象
执?行行sql语句句
获取执?行行结果
提取数据
fetchone
fetchall
fetchmany
scroll
增删改查
指定查询结果为字典类型
pymysql.cursor.DictCursor
sql 注?入
实现?用户登录注册
登录时 演示sql注?入
如何避免
客户端限制
模拟请求怎么破?
服务器?端验证  

 

MySQL

标签:rac   error   服务器   etc   dep   cad   信息   date   enc   

原文地址:https://www.cnblogs.com/sanqiansi/p/9637414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!