数据库:持久化存储、读写速度极高、保证数据的有效性、对程序支持性非常好,容易扩展。
数据表中,每一列称为字段,每一行称为记录。
如果能够唯一标记某个字段,那么就是主键
mysql属于关系型数据库。
通过表来表示关系型
所谓的关系型数据库RDBMS,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
关系型数据库:
oracle:以前的大型项目中使用,银行、电信等项目
mysql:web时代使用最广泛的关系型数据库
ms sql server:在微软的项目中使用
sqlite:轻量级数据库,主要应用在移动平台
sql是结构化查询语言,是一种用来操作RDBMS的数据库语言,当前关系型数据库都支持sql语言进行操作,也就是说可以通过sql操作oracle,sql server,mysql,sqlite等等所有的关系型的数据库。
SQL语句主要分为:
DQL:数据查询语言,用于对数据进行查询,如select
DML:数据操作语言,对数据进行增加、修改、删除,如insert、update、delete
TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
DCL:数据控制语言,进行授权与权限回收,如grant、revoke
DDL:数据定义语言,进行数据库、表的管理等,如create、drop
CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor
其中,重点是增删改查,必须熟练编写DQL,DML,能够编写DDL完成数据库、表的操作,其他了解即可。
SQL不区分大小写。
关系型数据库管理系统
特点:
1>使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
2>支持多种操作系统
3>为多种编程语言提供了API
4>支持多线程,充分利用CPU资源
5>优化的SQL查询算法,有效提高查询速度
6>提供多语言支持,常见的编码如GB2313、BIG5、UTF8
7>提供TCP/IP、ODBC和JDBC等多种数据库连接途径
8>提供用于管理、检查、优化数据库操作的管理工具
9>大型的数据库,可以处理拥有上千万条记录的大型数据库
10>支持多种存储引擎
11>成本低
12>MySQL使用标准的SQL数据语言形式
13>MySQL是可以定制的,采用GPL协议,可以修改源码
14>在线DDL更改功能
15>复制全局事务标识
16>复制无崩溃从机
17>复制多线程从机
数据完整性
为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束。
a。数据类型
原则:够用就行、尽量使用取值范围小的,节省存储空间
类型:整数int,bit;小数decimal;字符串varchar长度可变的字符串,char长度固定的字符串;日期时间date,time,datetime;枚举类型enum
存储视频图片时,不会直接存在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径。
b。约束
主键:物理上存储的顺序
非空:此字段不允许填写空值
惟一:此字段的值不允许重复
默认:当不填写此值时会使用默认值,如果填写时以填写为准
外键:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常。
链接数据库
mysql -uroot -p
退出数据库
exit/quit/ctrl+d
显示时间
select now();
查看所有数据库
show databases;
显示数据库版本
select version();
创建数据库
create database 数据库名;
create database 数据库名 charset=utf8;
查看创建数据库的语句
show create database 数据库名;
删除数据库
drop database 数据库名;
查看当前使用的数据库
select database();
使用数据库
use 数据库名
显示所有的表
show tables
创建表
create table 数据表名字(字段 类型 约束[,字段 类型 约束]);
create table xxx(id int, name varchar(30))
create table yyy(id int primary key not null auto_increment, name varchar(30))
create table yyy(
id int primary key not null auto_increment,
name varchar(30)
);
例子:
create table students(
id int unsigned not null auto_increment primary key,
name varchar(30),
age tinyint unsigned default 0,
high decimal(5,2), #小数5位,保留两位小数
gender enum(“男”,“女”,“中性”,“保密”) default “保密”,#枚举
cls_id int unsigned
);
insert into students values(0, “laowang”,18,188.88,“男”,0)
查看表的结构
desc 表名字
修改表-添加字段
alter table students add birthday datetime;
修改表-修改字段:不重名版
alter table students modify birthday date;
修改表-修改字段:重名版
alter table students change birthday birth date default;
修改表-删除字段
alter table students drop high;
删除数据库
drop database 数据库名
删除表
drop table 表名
查看表的创建语句
show create table 表名字
insert into 表名 values(要插入的信息);
枚举中的下标从1开始
自动增长列可以写0,null或default,添加数据后,该列会自动增长。
部分插入:
insert into 表名(列1……) values(值1,…);
insert into students(name, gender) values(“dkfls”, 2);
多行插入
部分多行插入
insert into students (name, gender) values(“laowang”,5),(“laoli”,6);
全部多行插入
insert into 表名 values(对象1的数据),(对象2的数据)
update 表名 set 列1=值1,列2=值2… where 条件;
不写where的话,表里全部数据都会被改。
where处写对应数据的主键。
物理删除:
delete from 表名 where 条件;
逻辑删除:
增加一个字段,默认值时表示没删,不是默认值,表示删除
alter table 表名 add is_delete default 0;
select * from 表名
select * from 表名 where 条件;
select 列 1,列2,。。。 from 表名
select 字段1 as 别名1, 字段2 as 别名2 from 表名 #为列指定别名输出
上面根据字段的书写顺序,可以调整最终的数据输出顺序
创建一个数据库
create database 数据库名 charset=utf8;
使用数据库
use 数据库名;
显示使用的当前数据库是哪个
select database();
查询所有字段
select * from 表名; #选择所有字段
查询指定字段
select 列1,列2,… from 表名;
使用as给字段起别名
select 字段1 as 别名1,字段2 as 别名2 from 表名;
select 表名.字段 … from 表名;
使用as给表名起别名
select s 字段1,s.字段2 from 表名 as s;
消除重复行
select distinct 字段 from 表名;
将所查字段进行去重
比较运算符
select …… from 表名 where 条件;
>, <, >=, <=, =,
!=,<> 不等于
逻辑运算符
and or not
使用not时,not放在字段前面,并且要注意否定的部分,在否定的部分加括号
like % 替换1个或多个 _替换1个
select 字段 from 表名 where 字段 like “小%”;
查询字段以“小”开头的字段
select 字段 from 表名 where 字段 like “%小%”;
查询字段中 有“小”的所有字段
select 字段 from 表名 where 字段 like “__”; 两个下划线
查询字段中,字段包含两个字
select 字段 from 表名 where 字段 like “__%”;
查询字段中,字段中至少有2个字
rlike 正则
select 字段 from 表名 where 字段 relike “^周.*”
字段以周开头
select 字段 from 表名 where 字段 in (范围)
查询在范围内的字段,范围是非连续,如 (1,3,8) 查询 1 或3 或8。不在就用not in
select 字段 from 表名 where 字段 between 值1 and 值2
查询在值1和值2之间的字段(连续范围);不在一个连续范围,not between 值1 and 值2
空判断
判空 is null
select * from 表名 whiere 字段 is null;
查询指定字段为0的数据
判非空 is not null
order by 字段 asc 从小到大排,desc从大到小排
select * from 表名 where 条件 order by 字段;
按照指定字段来排序,默认为asc
select * from 表名 where 条件 order by 字段1 asc,字段2 asc;
字段1有相同情况下,按照字段2排
select * from 表名 order by 字段 无条件时的排序。
总数
select count(*) from 表名 where 条件;
满足条件的字段的总行数
最大值
select max(字段) from 表名 where 条件;
满足条件字段中的最大值
最小值
min
求和 sum
select sum(字段) from 表名 where 条件;
平均值 avg
select avg(字段) from 表名 where 条件;
select sum(字段)/count(*) from 表名 where 条件;
四舍五入
round(123.23,1) 结果保留1位小数
select round(sum(字段)/count(*),3) from 表名 where 条件;
默认保留4位小数,第二个参数设置保留的位数
group by
select 字段1 from 表名 group by 字段1 按照指定字段分组
前后字段必须相同
select 字段1, count(*) from 表名 group by 字段1
显示每个组的总数
group_concat 查看组里的内容
select 字段1, group_concat(字段2) from 表名 group by 字段1
查询分组后,每组中字段2的具体内容
select 字段1, count(*) from 表名 where 条件 group by 字段1
分组后 满足条件的组的总数
group_concat() 参数会连接在一个
group_concat(name, “_”, age, “ “, id) 显示结果为 名字_年龄 id
having
select 字段1,group_concat(字段2) from 表名 group by 字段1 having count(*)>3
分组后,组里总数大于3的组
查询student表中每种性别中的人数多于2个的信息
select gender,group_concat(name) from students group by gender having count(*)>2
limit 限制查询出来的数据个数
select * from 表名 where 条件 limit 2;
limet start,count start从0开始,count 显示的个数
limit语句在最后
多个表的关联查询
内连接查询:查询的结果为两个表匹配到的数据
右连接查询:查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充
左连接查询:查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充
inner join … on 语句
select * from 表1 inner join 表2 on 表1.字段1 = 表2.字段2;
将两个表的字段对应
左连接
select * from students as s left join classes as c on s.cls_id=c.id;
以左边表为基准,有就显示,没有就将右边的表填充为null
表中的某一列,关联了这个表中的另外一列,但是它们的业务逻辑含义是不一样的。
source sql文件名 导入sql文件
表内可以通过连接查询得到需要的信息
一个select里嵌套一个select
select * from students where height = (select max(height) from students);
三范式
第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列
第二范式(2NF):首先是1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式(3NF):首先是2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖,即不能存在:非主键列A依赖于非主键B,非主键列B依赖于主键的情况。
E-R模型
1对1时,在两个表中任意一个表添加关联字段(另一个表的主键)即可
1对多时,在多的表中添加关联字段(另一个表的主键)
多对多时,新加一张表,作为中间表
创建外键
alter table 表名1 add foreign key 表1中要设置为外键的字段 references 表名2(字段)
删除外键
alter table 表名 drop foreign key 外键名称;
实际开发中,尽量少用外键。
开始->创建connection->获取cursor->执行查询、执行命令、获取数据、处理数据->关闭cursor->关闭connection->结束
创建connection连接
conn = connect(host=’localhost’,prot=3306,user=’root’,password=’mysql’,database=’jing_dong’,charset=’utf8’)
创建cursor对象
csl=conn.cursor()
执行select语句,查询数据
count = csl.execute(‘select id,name from goods where id>=4’)
csl.fetchone() 返回一行数据
csl.fetchmany(数字) 根据所传参数,返回相应行数据
csl.fetchall() 显示全部数据
进行其他操作
关闭cursor对象
csl.close()
conn.close()
csl.execute(“增删改的sql语句”)
csl.commit() 这条语句必不可少
csl.rollback() 不提交,回滚
对用户输入的内容不加限制的话,用户可能通过sql注入查询到所有的数据
防止措施
self.cursor.execute(sql,[find_name]) 构造参数列表
视图就是一条select语句执行后返回的结果集。
视图是对若干张基本表的引用,一张虚表,查询语句执行的结果。
定义视图
create view 视图名字 as sql语句 #把sql语句得到的数据保存为视图
视图作用:提高了重用性,类似函数;对数据库重构,不影响程序运行;提高了安全性能,可以针对不同的用户;让数据更清晰。
一个操作序列,这些操作要么执行,要么都不执行,它是一个不可分割的工作单位。
四大特性:原子性、一致性、隔离性、持久性。
引例,银行转账
流程
1.start transaction;
2.select balance from checking where customer_id =10231;
3.update checking set balance = balance -200 where customer_id = 10231;
4.update savings set balance = balance +200 shere customer_id = 10231;
5.commit;