# 命令行客户端MySQLMySQL是一个关系型数据库管理系统
安装MySQL服务端软件使用: sudo apt-get install mysql-server
安装MySQL客户端软件使用: sudo apt-get install mysql-client
图形化MySQL客户端软件使用Navicat
- 查询MySQL服务端是否安装:服务端server ,客户端client
- 方法1.apt list | grep mysql-server
- 方法2.apt-cache show mysql-server
- 方法3.sudo service mysql status 用于查看服务状态
- sudo service mysql stop 关闭
- sudo service mysql start 开启,或者重启 sudo service mysql restart
- 如果对配置文件【/etc/mysql/mysql.config.d】进行修改,需要重新启动MySQL数据库服务sudo service mysql start
主要配置信息说明:vim /etc/mysql/mysql.config.d/f 查看配置信息port表示端口号,默认为3306
bind-address表示服务器绑定的ip,默认为127.0.0.1
datadir表示数据库保存路径,默认为/var/lib/mysql
log_error表示错误日志,默认为/var/log/mysql/error.log
- datadir = /var/lib/mysql 自己创建的数据库存放地址
- sudo pip3 install pymysql pip3为包管理工具,安装第三方的Python包
# SQL基本语法登录数据库: mysql -uroot -p
退出数据库: quit 或者 exit 或者 ctr + d
创建数据库: create database 数据库名 charset=utf8;
使用数据库: use 数据库名;
删除数据库: drop database 数据库名;
创建表: create table 表名(字段名 字段类型 约束, ...);
修改表-添加字段: alter table 表名 add 字段名 字段类型 约束
修改表-修改字段类型: alter table 表名 modify 字段名 字段类型 约束
修改表-修改字段名和字段类型: alter table 表名 change 原字段名 新字段名 字段类型 约束
修改表-删除字段: alter table 表名 drop 字段名;
删除表: drop table 表名;
查询数据: select * from 表名; 或者 select 列1,列2,... from 表名;
插入数据: insert into 表名 values (...) 或者 insert into 表名 (列1,...) values(值1,...)
修改数据: update 表名 set 列1=值1,列2=值2... where 条件
删除数据: delete from 表名 where 条件
# MySQL笔记1--MySQL数据库的基本使用
--登录数据库
mysql -uroot -p
--显示当前时间
select now();
--登出(退出)数据库
exit/quit/ctr+d
--查看所有数据库
show databases;
--创建数据库
create database python41 charset=utf8;
--使用数据库
use python41;
--查看当前使用的数据库
select database();
--删除数据库-慎重
drop database python41;
--查看当前数据库中所有表
show tables;
--创建表
create table students(
id int unsigned primary key auto_increment not null,
name varchar(10) not null,
age tinyint default 0,
gender enum("男", "女") default "男"
);
--修改表-添加birthday字段
alter table students add birthday datetime not null;
--修改表-修改字段类型
alter table students modify birthday date;
--修改表-修改字段名和字段类型
alter table students change birthday birth datetime not null;
--修改表-删除birthday字段
alter table students drop birth;
--查看表结构
desc students;
--查看创表SQL语句
show create table students;
--查看创库SQL语句
show create database python41;
--删除表
drop table students;
--查询所有列数据
select * from students;
--查询指定列数据
select name, age from students;
- 以上是单表查询,可以省略表名 若不是单表查询 select students.naem, students.age from students;
--添加数据--全列插入
insert into students values(0, '张三', 18, default);
- 主键列是自动增长,但是在全列插入时需要占位,通常使用空值(0或null或default)
主键列表插入数据的时候可以指定: 0、default、null
这里的default表示使用该字段默认值
--添加数据--部分列插入
insert into students(name, age) values('郭靖',30);
--添加数据--全列多行插入
insert into students values(0, '黄蓉', 28, '女'),(0,'黄老邪',50,default);
--添加数据--部分列多行插入
insert into students(name, age) values('杨过', 20),('周伯通',55);
--修改数据
update students set age=18, gender = '女' where id = 3;
--删除数据
delete from students where id = 8;
--删除数据可以使用逻辑删除,添加一个标识字段
alter table students add is_del tinyint default 0;
这里删除数据其实修改标识字段
update students set is_del = 1 where id = 7;
--as关键字,用户给表的字段和表设置别名
select name as n, age as a from students as s;
提示: as 关键字可以省略,也表示设置别名
--distinct关键字, 用于去除重复的数据行
select distinct age, gender from students;
- 根据最后面的一个字段进行去重操作
--查询编号大于3的学生
select * from students where id > 3;
--查询编号不大于4的学生
select * from students where id <= 4;
--查询姓名不是“黄蓉”的学生
select * from students where name <> '黄蓉';
select * from students where name != '黄蓉';
--查询没被删除的学生
select * from students where is_del = 0;
--查询编号大于3的女同学
select * from students where id > 3 and gender = '女';
--查询编号小于4或没被删除的学生
select * from students where id < 4 or is_del = 0;
--查询年龄不在10岁到15岁之间的学生
select * from students where not (age >= 10 and age <= 15);
--查询姓黄的学生
select * from students where name like '黄%';
--查询姓黄并且“名”是一个字的学生
select * from students where name like '黄_';
select * from students where name like '黄__';
%: 表示任意多个字符
_: 表示任意一个字符
--查询姓黄或叫靖的学生
select * from students where name like '黄%' or name like '%靖';
--查询编号为3至8的学生
select * from students where id >=3 and id <= 8;
select * from students where id between 3 and 8;
--查询编号不是3至8的男生
select * from students where not (id between 3 and 8) and gender='男';
--查询编号是3、5、7的学生
select * from students where id in (3, 5, 7);
--查询编号不是3、5、7的学生
select * from students where id not in (3, 5, 7);
--查询没有填写身高的学生
select * from students where height is null;
--查询填写身高的学生
select * from students where height is not null;
--查询未删除男生信息,按学号降序
select * from students where is_del = 0 and gender = '男' order by id desc;
--显示所有的学生信息,先按照年龄从大-->小排序,当年龄相同时 按照身高从高-->矮排序
select * from students order by age desc, height desc;
默认是asc 不用指定。
--查询前3行男生信息
select * from students where gender='男' limit 0, 3;
简写方式,第一个参数是开始行索引,默认是0可以不指定, 第二个参数是查询条数
select * from students where gender='男' limit 3;
--查询学生表,获取第n页数据的SQL语句
select * from students limit (n-1) * m, m;
# MySQL笔记2--MySQL数据库的条件查询
-- 清屏
system clear
-- 查询学生的个数
select count(height) from students;
注意点: 聚合函数不会对空值进行统计
一般如果要是指定列名,那么就是主键字段
select count(id) from students;
通用的写法
select count(*) from students;
-- 查询女生的编号最大值
select max(id) from students where gender = '女';
-- 查询未删除的学生最小编号
select min(id) from students where is_del = 0;
-- 查询男生的总身高
select sum(height) from students where gender='男';
-- 求男生的平均身高
select sum(height) / count(*) from students where gender='男';
select avg(height) from students where gender = '男';
select avg(ifnull(height, 0)) from students where gender = '男';
注意点: 聚合函数不会对空值进行统计
ifnull函数判断指定的字段是否是空值,如果是空值使用默认值0
-- 查询性别的种类
select distinct gender from students;
select gender from students group by gender;
-- 根据name和gender字段进行分组, 查看name和gender的分组信息
select gender,name from students group by gender,name;
-- 根据gender字段进行分组, 查询每个分组的姓名信息
select gender,group_concat(name) from students group by gender;
group_concat:统计每个分组指定字段的信息集合,信息之间使用逗号进行分割
-- 统计不同性别的平均年龄
select gender,avg(age) from students group by gender;
-- 统计不同性别的人的个数
select gender,count(*) from students group by gender;
-- 根据gender字段进行分组,统计分组条数大于2的
select gender,count(*) from students group by gender having count(*) > 2;
-- 对分组数据进行过滤使用having
-- 根据gender字段进行分组,汇总总人数
select gender,count(*) from students group by gender with rollup;
-- 根据gender字段进行分组,汇总所有人的年龄
select gender,group_concat(age) from students group by gender with rollup;
-- 使用内连接查询学生表与班级表
select s.name, c.name from students s inner join classes c on s.c_id = c.id;
-- 使用左连接查询学生表与班级表
select * from students s left join classes c on s.c_id = c.id;
左连接查询,根据左表查询右表,如果右表数据不存在使用null填充
left左边是左表,left右边是右表
-- 使用右连接查询学生表与班级表
select * from students s right join classes c on s.c_id = c.id;
右连接查询,根据右表查询左表,如果左表数据不存在使用null填充
right左边是左表,right右边是右表
-- 使用自连接查询省份和城市信息
select c.id, c.title, c.pid, p.title from areas c inner join areas p on c.pid = p.id where p.title = '广东省';
-- 查询大于平均年龄的学生
select * from students where age > (select avg(age) from students);
-- 查询学生在班的所有班级名字
select * from classes where id in (select c_id from students where c_id is not null);
-- 查找年龄最大,身高最高的学生
select * from students where age = (select max(age) from students) and height = (select max(height) from students);
简写:
select * from students where (age, height) = (select max(age), max(height) from students);
--子查询是一个完整的查询语句,子查询的执行顺序,先执行子查询然后主查询根据子查询的结果再执行
-- 为学生表的cls_id字段添加外键约束
alter table students add foreign key(c_id) references classes(id);
- 注意:对已有表格添加外键约束之前,要保证表格的数据符合约束条件
- 添加约束的字段,字段类型应该一致
-- 创建学校表
create table school(
id int unsigned not null primary key auto_increment,
name varchar(30) not null
);
-- 创建老师表添加学校外键
create table teacher(
id int unsigned not null primary key auto_increment,
name varchar(20) not null,
s_id int unsigned,
foreign key(s_id) references school(id)
);
-- 删除外键
alter table teacher drop foreign key teacher_ibfk_1;
- 注意:要删除的外键名称是 CONSTRAINT后面的‘xxxxxxx’
# MySQL笔记3--MySQL数据库的高级使用
-- 创建 "京东" 数据库
create database jing_dong charset=utf8;
-- 使用 "京东" 数据库
use jing_dong;
-- 创建一个商品goods数据表
create table goods(
id int unsigned primary key auto_increment not null,
name varchar(150) not null,
cate_name varchar(40) not null,
brand_name varchar(40) not null,
price decimal(10,3) not null default 0,
is_show bit not null default 1,
is_saleoff bit not null default 0
);
-- 向goods表中插入数据(将数据保存xxx.sql,使用source ./xxx.sql 命令自动导入)
insert into goods values(0,'r510vc 15.6英寸笔记本','笔记本','华硕','3399',default,default);
insert into goods values(0,'y400n 14.0英寸笔记本电脑','笔记本','联想','4999',default,default);
insert into goods values(0,'g150th 15.6英寸游戏本','游戏本','雷神','8499',default,default);
insert into goods values(0,'x550cc 15.6英寸笔记本','笔记本','华硕','2799',default,default);
insert into goods values(0,'x240 超极本','超级本','联想','4880',default,default);
insert into goods values(0,'u330p 13.3英寸超极本','超级本','联想','4299',default,default);
insert into goods values(0,'svp13226scb 触控超极本','超级本','索尼','7999',default,default);
insert into goods values(0,'ipad mini 7.9英寸平板电脑','平板电脑','苹果','1998',default,default);
insert into goods values(0,'ipad air 9.7英寸平板电脑','平板电脑','苹果','3388',default,default);
insert into goods values(0,'ipad mini 配备 retina 显示屏','平板电脑','苹果','2788',default,default);
insert into goods values(0,'ideacentre c340 20英寸一体电脑 ','台式机','联想','3499',default,default);
insert into goods values(0,'vostro 3800-r1206 台式电脑','台式机','戴尔','2899',default,default);
insert into goods values(0,'imac me086ch/a 21.5英寸一体电脑','台式机','苹果','9188',default,default);
insert into goods values(0,'at7-7414lp 台式电脑 linux )','台式机','宏碁','3699',default,default);
insert into goods values(0,'z220sff f4f06pa工作站','服务器/工作站','惠普','4288',default,default);
insert into goods values(0,'poweredge ii服务器','服务器/工作站','戴尔','5388',default,default);
insert into goods values(0,'mac pro专业级台式电脑','服务器/工作站','苹果','28888',default,default);
insert into goods values(0,'hmz-t3w 头戴显示设备','笔记本配件','索尼','6999',default,default);
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);
insert into goods values(0,'x3250 m4机架式服务器','服务器/工作站','ibm','6888',default,default);
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);
-- 查询类型cate_name为 '超级本' 的商品名称、价格
select name, price from goods where cate_name = '超级本';
-- 显示商品的分类
select distinct cate_name from goods;
select cate_name from goods group by cate_name;
-- 求所有电脑产品的平均价格,并且保留两位小数
select round(avg(price),2) from goods;
-- 显示每种商品的平均价格
select cate_name, avg(price) from goods group by cate_name;
select cate_name, round(avg(price),2) from goods group by cate_name;
-- 查询每种类型的商品中 最贵、最便宜、平均价、数量
select cate_name, max(price), min(price), avg(price), count(*) from goods group by cate_name
-- 查询所有价格大于平均价格的商品,并且按价格降序排序
select * from goods where price > (select avg(price) from goods) order by price desc;
-- 创建商品分类表
create table goods_cates(
-> id int unsigned not null primary key auto_increment,
-> name varchar(50) not null);
-- 查询goods表中商品的分类信息
select cate_name from goods group by cate_name;
-- 将查询结果插入到good_cates表中
insert into goods_cates(name) select cate_name from goods group by cate_name;
-- 添加移动设备分类信息
insert into goods_cates(name) values('移动设备');
-- 查看goods表中的商品分类名称对应的商品分类id
select * from goods g inner join goods_cates gs on g.cate_name = gs.name;
-- 将goods表中的分类名称更改成商品分类表中对应的分类id,连接更新表中的某个字段
update goods g inner join goods_cates gs on g.cate_name = gs.name set g.cate_name = gs.id;
-- 查询品牌信息
select brand_name from goods group by brand_name;
-- 通过create table ...select来创建商品品牌表并且同时插入数据
create table goods_brands( id int unsigned not null primary key auto_increment, name varchar(50) not null) select brand_name as name from goods group by brand_name;
注意: 创建的表字段要和插入数据的字段保持一致如 brand_name as name
-- 插入双飞燕品牌
insert into goods_brands(name) values('双飞燕');
-- 查看goods表中的商品品牌对应的商品品牌id
select * from goods g inner join goods_brands gs on g.brand_name = gs.name;
-- 将goods表中的品牌更改成品牌表中对应的品牌id,连接更新表中的某个字段
update goods g inner join goods_brands gs on g.brand_name = gs.name set g.brand_name = gs.id;
-- 通过alter table语句修改表结构,把cate_name改成cate_id,把brand_name改成brand_id
alter table goods change cate_name cate_id int not null, change brand_name brand_id int not null;
# 待更新