服务器端安装
1.sudo apt-get install mysql-server
2.sudo service mysql start 启动mysql服务器
3.ps aux|grep mysql 查看进程中是否有mysql服务
4.sudo service mysql stop 停止服务
5.sudo service mysql restart 重启服务
配置
1.配置文件目录/etc/mysql/mysql.cnf
2. 进入mysql.conf.d目录,打开mysql.cnf可以看到配置
3.主要配置:
1. bind-address:表示服务器绑定的ip,默认为127.0.0.1
2.port表示端口,默认为3306
3.datadir表示数据库目录,默认为/var/lib/mysql
4.general_log_file表示普通日志,默认为/var/log/mysql/mysql.log
5.log_error表示错误日志,默认为/var/log/mysql/error.log
客户端安装
1.sudo apt-get install mysql-client
2.mysql -u+用户名 -p+密码
数据类型
1.使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间
2.常用数据类型:
1.整型:int,bit 默认有正负,不想有负值添加约束unsigned
2.小数:decimal 表示浮点数,如decimal(5,2)表示共用5位数,小数占2位
3.字符串:varchar,char text char表示固定长度的字符串,如char(3),如果填充'ab'时会补充一个空格为'ab ' varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab' 字符串text表示存储大文本,当字符大于4000时推荐使用
4.日期时间:date,time,datetime
5.枚举类型(enum)
3.对于图片,音频,视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径
约束
1.主键primary key:物理上存储的顺序
2.非空not null:此字段不允许填写空值
3.唯一unique:此字段的值不允许重复
4.默认default:当不填写此值时会使用默认值。如果填写时填写为准
5.外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失效并抛出异常
MySQL数据库的操作
1.select version();显示当前数据库版本
2.select now();显示时间
3. show databases;查看所用数据库
4.create database 数据库名字 charset=utf8;创建数据库
5.show create database 数据库名字;查询数据库的创建语句
6.drop database 数据库名字;删除数据库
7.select database();查看当前使用的数据库
8.use 数据库名字;使用指定数据库
MySQL数据表的操作
1.show tables;显示当前数据库中所有的表
2.create table 表名字(字段1 类型1 约束,字段2 类型2 约束,...);创建表
例如:create table students(
id int unsigned not null auto_increment primary key,
name varchar(30),
age tinyint unsigned default 0,
high decimal(5,2),
gender enum("男","女","中性","保密") default "保密",
cls_id int unsigned);
3.desc 表名字;查看表的创建结构
4.show create table 表名字;查看表的创建语句
5.alter table 表名 add 字段 类型;给表添加新字段
例如:alter table students add birthday datetime;
6.alter table 表名 change 原名 新名 类型及约束;修改字段并且重新命名
例如:alter table students change birthday birth datetime not null;
7.alter table 表名 modify 字段 类型及约束;修改字段并且不重新命名
例如:alter table students modify birth date not null;
8.alter table 表名 drop 字段;删除字段
例如:alter table students drop birthday;
9.drop table 表名;删除表
MySQL数据表的增删改查(curd)
增加
1.全部插入:insert into 表名 values (有多少字段,就写多少字段,且顺序一一对应);
2.部分插入:insert into 表名 (字段1,字段2...) values (值1,值2...);
例如:insert into students (name,gender) values ('小红',2);枚举中的下表是从1开始
3.多行插入:insert into 表名 (字段1,字段2...) values (值1,值2...),(值1,值2...)...;部分多行插入
insert into 表名 values (有多少字段,就写多少字段,且顺序一一对应),(有多少字段,就写多少字段,且顺序一一对应)... ;全部多行插入
修改
update 表名 set 字段1=值1,字段2=值2... where 条件;
删除
1.delete from 表名 where 条件;物理删除
2.逻辑删除:用一个字段表示这条信息是否已经不再使用
例如:alter table students add is_delete bit default 0;若删除某条信息,则把is_delete的值改为1;update students set is_delete=1 where id=6;
查找
1.select * from 表名;查询所有字段
2.select 字段1,字段2... from 表名;查询指定字段
3.select 字段1,字段2... from 表名 where 条件;查询指定条件的指定字段
4.select distinct 字段 from 表名;distinct消除重复行
5.select 字段1 as 别名1,字段2 as 别名2 from 表名 where 条件;使用as给字段起别名
6.select 字段2 as 别名2 ,字段1 as 别名1 from 表名 where 条件;修改字段显示顺序
MySQL的查询(实际开发中用的最多的)
条件查询
1.比较运算符:>,<,>=,<=,=,!=不等于
2.逻辑运算符:and,or,not
3.模糊查询:
1.like %替换1个或者多个;_替换1个
例如:查询姓名中以"小"开始的名字
select name from students where name like "小%";
例如:查询姓名中包含"小"的名字
select name from students where name like "%小%";
例如:查询有2个字的名字
select name from students where name like "__";
例如:查询至少2个字的名字
select name from students where name like "__%";
2.rlike 正则
例如:查询以周开头的姓名
select name from students where name rlike "^周.*";
例如:查询以周开头,伦结尾的姓名
select name from students where name rlike "^周.*伦$";
范围查询
1.in(1,3,8)表示在一个非连续的范围内
例如;查询年龄为12,18,34的姓名
select name,age students where age in (12,18,34);
2.not in(1,3,8)表示不在一个非连续的范围内
例如;查询年龄不在12,18,34的姓名
select name,age students where age not in (12,18,34);
3.between ... and ...表示在一个连续的范围内
例如:查询年龄再18到34之间的信息
select name,age from students where age between 18 and 34;
4.not between ... and ...表示不在一个连续的范围内
例如:查询年龄不再18到34之间的信息
select name,age from students where age not between 18 and 34;
5.is null 空判断
例如:查询身高为空的信息
select * from students where height is null;
6.is not nll 判断非空
例如:查询身高为不为空的信息
select * from students where height is not null;
排序
1.order by 字段,asc从小到大排序(默认),desc从大到小排序
例如:查询年龄再18到34岁之间的男性,并且按照年龄从小到大排序
select * from students where (age between 18 and 34 ) and gender = 1 order by age asc;
例如:查询年龄再18到34岁之间的男性,并且按照年龄从大到小排序
select * from students where (age between 18 and 34 ) and gender = 1 order by age desc;
2.order by 多个字段
例如:查询年龄再18到34岁之间的女性,身高从高到矮排序,如果身高一样的情况下按照年龄从小到大排序
select * from students where (age between 18 and 34) and gender=2 order by height desc,age asc;
例如:按照年龄从小到大,身高从高到矮排序
select * from students order by age asc,height desc;
聚合函数
1.总数:count
例如:查询男性人数有多少
select count(*) as 男性人数 from students where gender=1;
2.最大值:max
例如:查询最大年龄
select max(age) from students;
例如:查询女性的最高身高
select max(height) from students where gender=2;
3.最小值:min
4.求和:sum
例如:查询所有人的年龄总和
select sum(age) from students;
5.平均值:avg
例如:计算平均年龄
select avg(age) from students;
例如:计算平均年龄
select sum(age)/count(*) from students;
6.四舍五入:round(123.123,1)保留1为小数
例如:计算平均年龄,保留2为小数
select round(avg(age),2) from students;
分组
1.group by
例如:按照性别分组,查询所有的性别
select gender from students group by gender;
例如:计算每种性别的人数
select gender,count(*) from students group by gender;
例如:计算男性的人数
select gender,count(*) from students where gender=1 group by gender;
2.group_concat(...) 查看组里面的信息
例如:查看同种性别中的姓名
select gender,group_concat(name,'_',age,'_',id) from students where gender=1 group by gender;
3.having
例如:查询平均年龄超过30岁的性别,以及姓名
select gender group_concat(name,avg(age)) from students group by gender having avg(age) > 30;
例如:查询每种性别中的人数多于2个的信息
select gender group_concat(name) from students group by gender having count(*) > 2;
分页
1.limit start, count start表示起始的下表,count表示查询的总数 (查询时limit放于最后面)
例如:限制查询个数
select * from students where gender=1 limit 2;
例如:查询前5个数据
select * from students limit 0,5;
连接查询
1.内连接查询:查询的结果为两个表匹配的数据 (inner join ... on)
2.右连接查询:查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充 (right join ... on)
3. 左连接查询:查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充 (left join ... on)
例如:查询有能够对应班级的学生以及班级信息
select * from students inner join classes on students.cls=classes.id;
例如:按照要求显示姓名,班级
select students.name,classes.name from students inner join classes on students.cls=classes.id;
select s.name,c.name from students as s inner join classes as c on s.cls=c.id;
例如:查询没有对应班级信息的学生
select * from students as s left join classes as c on s.cls_id=c.id having c.id is null;
select * from students as s left join classes as c on s.cls_id=c.id where c.id is null;
自关联
例如:查询出山东省有哪些市
select * from areas as province inner join areas as city on city.pid=province.aid having province.atitle='山东省';
子查询
一个select语句中嵌入另一个select语句
例如:查询最高的男生信息
select * from students where height = (select max(height) from students);
数据库设计
三范式
第一范式(1NF): 强调的是列的原子性,即列不能够分成其他几列
第二范式(2NF):首先是1NF,另外包含两部分内容,一是表必须有一个主键,二是没有包含在主键中的列必须完全依赖于主键,而不是只依赖于主键的一部分
第三范式(3NF):首先是2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖,即不能存在:非主键列A依赖于非主键列B,非主键B依赖于主键的情况
外键
alter table goods add foreign key (cate_id) references goods_cates(id); 添加外键
实际开发的时候很少使用外键,因为会降低表更新的效率
alter table goods drop foregin key 外键名; 删除外键(用show create table goods查看外键名字)
MySQL与Python交互
1.先下载pymysql:pip install pymysql
2.然后导入pymysql:from pymysql import *
3.创建Connection连接:conn = connect(host=连接ip,port=端口号,user=用户名,password=密码,database=数据库名,charset='utf8')
4.获取Cursor对象:cs1 = coon.cursor()
5.执行sql语句:cs1.execute('sql语句') 例如:cs1.execute("select * from goods;") 执行成功会返回生效的行数,再用cs1.fetchone(),查看每一条数据,以元组的形式返回,或者cs1.fetchmany(n),返回n行信息,返回的是元组,或者cs1.fetchall(),返回所有
6.关闭,先关闭cursor,再关闭connect:cs1.close(),conn.close()
7.对数据的增删改的时候,在结束时要用conn.commit()提交,否则无法进行操作,在commit之前若后悔,则可以用conn.rollback()退回去
SQL注入
防止SQL注入的方法
find_name= input('请输入商品名:')
sql = "select * from goods where name=%s"
cursor.execute(sql,[find_name]) 利用execute函数自己拼接去防止sql注入
京东商品查询小程序
视图
视图就是一条select语句运行后返回的结果集,视图是对若干张基本表的引用,一张虚表,查询语句执行的结果
定义视图
create view 视图名 as select语句
例如:create view goods_info as select g.*,c.name as cates_name,b.name as brands_name from goods as g left join goods_cates as c on g.cate_id = c.id left join goods_brands as b on g.brand_id = b.id;
查看视图
show tables
使用视图
视图的用途就是查询
select * from goods_info;
删除视图
drop view 视图名称;
drop view goods_info;
视图的作用
1.提高了重用性,就像一个函数
2.对数据库重构,却不影响程序的运行
3.提高了安全性能,可以对不同的用户
4.让数据更加清晰
事务
事务就是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位
事务四大特性(简称ACID)
原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)
开启事务:start transaction或者begin
提交事务:commit
回滚事务:rollback
索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针
更通俗的讲,数据库索引好比是一本书前面的目录,能加快数据库的查阅速度
创建索引
create index 索引名 on 表名(字段(n));如果字段属性是字符串,就要写字符串长度
查看索引
show index from test_index;
删除索引
drop index 索引名称 on 表名
注意:建立太多索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件,对于一个经常需要更新和插入的表格,就没必要建立索引,对于较小的表,排序开销不会很大,也没比要建立索引,建立索引占用磁盘空间