mysql ln_mysql

关系型数据库和菲关系型数据库的区别

关系型数据库

优点

关系型数据库层级结构清晰

易于维护:都是使用表结构,格式一致;

使用方便:sql语言通用,可用于复杂查询;

复杂操作:支持sql,可用于一个表以及多个表之间非常复杂的查询

缺点:

读写性能非常差,尤其是海量数据的高效读写;

固定的表结构,灵活度欠缺;

高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈;

非关系型数据库

优点

格式灵活,存储数据的格式为key,values,文档形式,图片形式等等,使用灵活;

应用场景广泛,关系型数据库只支持基础操作;

速度快:nosql可是使用硬盘或者随机存储器作为载体,关系型数据库只能用硬盘;

高扩展;

成本低:nosql数据库部署简单,基本都是开源软件;

缺点

不提供sql支持,学习和使用成本高;

无事务处理;

数据结构相对复杂,复杂查询方面稍欠。

非关系型数据库的分类和比较:

1、文档型

2、key-value型

3、列式数据库

4、图形数据库

MYSQL的概念 mySQL (关 系型数据库管理系统)

MySQL是一个关系型数据库管理系统,

MySQL是最流行的关系型数据库管理系统之一,

在WEB应用方面,MySQL是最好RDBMS(Relational Database Management System,关系数据库管理系统)应用软件之MySQL是一种关系数据库管理系统,

关系数据库将数据保存在不同的表中,增加了速度并提高了灵活性。

进入mysq|

打开cmd,输入

>>>mysql -U root(用户名) -p

>>>Enter password: **** #输入密码

mysq|>

mysql -D 数据库名 -u root(用户名) -p

退出mysql

quit; 或 exit;

操作库之前要进行的步骤:

修改加密规则

ALTER USER '用户名' @'localhost' IDENTIFIED BY '密码' PASSWORD EXPIRE NEVER;

修改密码

ALTER USER ’用户名‘ @'localhost' IDENTIFIED WITH mysql native_password BY '密码';

刷新数据

FLUSH PRIVILEGES;

远程连接: mysql -h 要连接的用户ip地址 -u 用户名 -p 回车输密码

操作库

创建数据库: create database a;

完整创建数据库的写法:create database if not exists test default character set = 'utf8mb4';

显示数据库: show databases;

删除数据库: drop database a;

连接,进入数据库: use 库名;

查看当前使用的数据库:select database();

查看当前数据库包含的表信息: show tables;

操作表

创建表:create table b(字段名 数据类型 约束, ...);

完整创建表的写法: create table if exists user(

id int(10) unsigned【unsigned指的是无符号的类型】 auto_increment key【这里的key指的是主键】comment 【comment指的是注释】'用户ID', ......)engine=innodb,charset=utf8mb4;

查看表结构: desc 表名;

查看表的创建语句: show create table a;

删除表:drop table b;

更改表名:rename table 原表名 to 新表名;

​ 删除t1表中的id列(不需要指明类型): alter table t1 drop id;

alter table a modify 字段名 数据类型;

alter table a change 字段1 字段2 类想

engine 是引擎 charset 是编码格式

ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表'

增加数据

增加全部字段

insert into 表名 values(值....);

增加自定义字段

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

还有一种用到了set

insert 表名 set 字段1=值1,字段2=值2;

删除数据

delete from 表名 where 条件;

更改数据

update 表名 set 字段1=值1 where 条件;

如果将一个字段设为默认值:

update 表名 set 字段1=default where 条件;

优先级:

from > where > group by > 聚合函数 > having > order by

查看数据

简单查询

select * from student;

select 字段 from student;

去重:

select distinct(去重) 字段1,字段2 from 表名;

函数:IFNULL(x,y)

如果x不是null,IFNULL() 返回的是x,否则返回y

b7fbd9af56e6330712fb8ebb20998d4f.png

条件查询

select 字段 from 表名 where 条件;

查询字段书否为空

select 字段 from 表名 where 字段 is null / not nul; 是否为空

查询字段满足条件的字段

select 字段 from 表名 where 字段 + 算数运算 / 逻辑运算;

7d99d40cf53a67aee250ea646cb16826.png

模糊查询

查询名字里包含小的所有字段

select * from aa where name like '%小%'

b7fbd9af56e6330712fb8ebb20998d4f.png

b75bedcf74fe6b7ced61543bbeea7c19.png

范围查询

查询id为1或3或6的学生的所有信息

select * from students where id in(1, 3, 6);

查询学生id为3到6的学生的所有信息(包含6)

select * from students where id between 3 and 6;

聚合查询

select count(字段名) from 表名 where 条件; 查询个数

select max(字段名) from 表名 where 条件; 查询最大值

select min(字段名) from 表名 where 条件; 查询最小值

select sum(字段名) from 表名 where 条件; 查询他们的和

select avg(字段名) from 表名 where 条件; 查询平均值

分组查询

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

分组后的数据筛选

查询男生总人数

方案一

select count(*) from students where gender='男;

方案二:

select gender,count(*) from students group by gender having gender='男;

where和having的区别

where是对from后面指定的表进行数据筛选,属于对原始数据的筛选

having是对group by的结果进行筛选

排序查询

select 字段1 from 表名 order by 字段1

分页查询

select * from 表名 limit 从第几行开始,显示几行 【acs 升序 desc 降序】

一对多表

38ea0b46ec102adf3ec7fc7e1899d7b5.png

必须在已存在的字段上设置外键

级联操作的类型:

restrict(限制) 抛出异常

cascade 级联

set null 外键设置为空

no action 什么都不做

通过修改创建外键:

第一步:先增加子表字段a_id

第二步:****alter table 表名 add foreign key(a_id) references 主表名(字段名 eg:id)

constraint 是指定外键名称,在用的时候会用到 不影响foreign key后面的加入 可写可不写

或者:****alter table 表名 add constraint iid foreign key a_id references 主表名(字段名 eg:id)

多对多表 (和一对多相似,只是创了一张中间表)

aebab08a95cca2fe453b5554ed0c1241.png

b7fbd9af56e6330712fb8ebb20998d4f.png

修改已存在的表结构:

第一步:先增添字段

第二步:alter table a add foreign key(id) references aa(id)

d0475ed3d7136060983a5fe148a4400c.png

内连接查询

从左表中取出每一条记录,与右表中的所有记录进行匹配,

在左表和右表相同的公共部分,才会保留结果,否则不保留。

注意:

内连接可以没有on,系统会保留所有结果,就是笛卡尔积;

还可以用where代替on,但是效率没有on高;

select * from 左表名 inner join 右表名 on 条件;

b7fbd9af56e6330712fb8ebb20998d4f.png

左外连接查询

包含左边表的全部行(不管右边的表中是否存在与他们匹配的行),以及右表中全部匹配的行

select * from 左表名 left join 右表名 on 条件;

右外连接查询

包含右边表的全部行(不管右边的表中是否存在与他们匹配的行),以及左表中全部匹配的行

select * from 左表名 right join 右表名 on 条件;

自查询【自己关联自己】

select * from grade as a inner join grade as b on 条件;

字符串函数

查看字符串的ascii码值 【与下面的char可以相互转化】 select ascii(str);

b7fbd9af56e6330712fb8ebb20998d4f.png

查看ascii码值对应的字符 select char(数字);

b7fbd9af56e6330712fb8ebb20998d4f.png

拼接字符串 【凭借后都是字符串】 select concat(str1,str2);

b7fbd9af56e6330712fb8ebb20998d4f.png

包含字符个数 select length('abc');

b7fbd9af56e6330712fb8ebb20998d4f.png

返回几个左端数据 select left('abc123',个数);

b7fbd9af56e6330712fb8ebb20998d4f.png

返回几个右端数据 select right('abc123',个数);

b7fbd9af56e6330712fb8ebb20998d4f.png

从第几个元素开始,返回几个数 select substring(str,start,len);

b7fbd9af56e6330712fb8ebb20998d4f.png

返回由n个空格组成的字符串 select space(10);

b7fbd9af56e6330712fb8ebb20998d4f.png

返回删除了左空格的字符串 select ltrim(str);

b7fbd9af56e6330712fb8ebb20998d4f.png

返回删除了右空格的字符串 select rtrim(str);

b7fbd9af56e6330712fb8ebb20998d4f.png

返回从某侧删除remstr后的字符串str select trim(方向【both,leading左,trailing右】remstr from str);

b7fbd9af56e6330712fb8ebb20998d4f.png

b7fbd9af56e6330712fb8ebb20998d4f.png

b7fbd9af56e6330712fb8ebb20998d4f.png

替换字符串 select replace(str, start_str, end_str);

b7fbd9af56e6330712fb8ebb20998d4f.png

大小写转换 select lower(str); select upper(str);

b7fbd9af56e6330712fb8ebb20998d4f.png

数学函数

求绝对值 select abs(n);

b7fbd9af56e6330712fb8ebb20998d4f.png

余数 select mod(m,n);

b7fbd9af56e6330712fb8ebb20998d4f.png

展示不大于n的最大整数 【地板floor(n)】 select floor(n);

b7fbd9af56e6330712fb8ebb20998d4f.png

b7fbd9af56e6330712fb8ebb20998d4f.png

求四舍五入值 select round(n【原数】,b【小数位置】);

b7fbd9af56e6330712fb8ebb20998d4f.png

求幂 select pow(2,3);

b7fbd9af56e6330712fb8ebb20998d4f.png

获取圆周率 select PI();

随机数 select rand(0-1的浮点数);

日期时间函数

select year(date); 返回date的年份;

select month(date); 返回date的月份;

select day(date); 返回date的日期;

select hour(time); 返回time的小时数;

select minute(time); 返回time的分钟数;

select second(time); 返回time的秒数;

日期格式化 select date_format(date,format),

b7fbd9af56e6330712fb8ebb20998d4f.png

b7fbd9af56e6330712fb8ebb20998d4f.png

日期计算 select '2016-12-23'+interval 1day;

b7fbd9af56e6330712fb8ebb20998d4f.png

当前时间 select current_time();

当前日期 select current_date();

当前日期时间 select now();

视图

【可以使用户操作方便,并保证数据库系统安全】

视图就是虚拟表,作用和真实表一样 。

create view 视图名(自定义) as select 字段 from 表名;

drop view 视图名;

b7fbd9af56e6330712fb8ebb20998d4f.png

b7fbd9af56e6330712fb8ebb20998d4f.png

事务

提交事务 数据库最小执行的单元

事务是保证每次对数据库操作的准确性和安全性

只有使用了innodb数据库引擎的数据库或表才支持事务

【用来管理insert update delete语句】

创建表时设置引擎 alter table '表名'(字段1 类型)engine=innodb

修改表的引擎 alter table '表名' engine=innodb;

事务处理的两种方法:

直接用set来改变mysql的自动提交模式

set autocommit=0 禁止自动提交

set autocommit=1 开启自动提交

用begin,rollback,commit实现

begin 开始一个事务

rollback 事务回滚

commit 事务确认

事务测试

回滚

b7fbd9af56e6330712fb8ebb20998d4f.png

提交

b7fbd9af56e6330712fb8ebb20998d4f.png

事务的四大特性(ACID)

原子性A:不可分割,不能分开执行

一致性C:几个并发执行的事务,执行结果必须与某一顺序的串行执行的结果相一致

隔离性I:完全相互独立

持久性D:对于已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障

MySQL的事务隔离级别

未提交读(Read Uncommitted):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据

提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。

可重复读(Repeated Read):可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。

串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

MySQL数据库(InnoDB引擎)默认使用可重复读( Repeatable read)

与python3交互

简单步骤:

import pymesql

首先:建立有数据库的连接conn = pymysql.connect(host=连接的mysql主.,port=端口,db=数据库名称,user=连接的用户名,password=密码,charset=编码方式,autocomment=是否自动提交,默认为false)

第二步:创建游标 cur=conn.cursor()

第三步:执行sql命令cur.execute("......")

第四步:1.提交生效 conn.commit()

2.放弃操作 conn.rollback()

第五步:关闭连接conn.close()

cursor的属性

rowcount返回数据条数或影响行数

connection 获得当前连接对象

connection对象的方法

close()关闭连接

commit()事务,所以需要提交才会生效

rollback()事务,放弃之前的操作

cursor()返回Cursor对象,用于执行sql语句并获得结果

import pymysql

# 建立与数据库的连接

conn = pymysql.connect(host='localhost',port=3306,db='students',user='huhu',password='root')

# 创建游标

cur = conn.cursor()

# 执行操作语句

# pymysql 里的自增要加下划线 sqlite3不加

# pymysql占位符 是 % sqlite3占位符 是 ?

# cur.execute("create table demo13(id int primary key auto_increment, name char(10))")

# sqlite3 可以赋值到一个变量,用变量进行查询; pymysql 只能通过游标取出数据

cur.execute("select * from grade")

a = cur.fetchall()

for i in a:

print(list(i))

conn.close()

import pymysql

conn= pymysql.connect(host='localhost',port=3306,user='huhu',password='root',db='students')

cur=conn.cursor()

cur.execute("create table aaaa(id int primary key auto_increment,name char(10))")

try:

cur.execute("insert into aaaa values(0,'%')" %'vv')

conn.commit()

except:

conn.rollback()

conn.close()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值