表数据
1.表数据
a.新增数据Create
b.删除数据Delete
c.更新数据Update
d.查询数据Read
数据库中读写比列7:3
mysql的编码格式
select的重要语句
备份和恢复数据
cmd中使用
备份与恢复
mysqldump -uroot -p mydb0 > d:/1.sql
mysql -uroot -p mydb0 < d:/1.sql
数据库多表设计
1.数据库
1.1创建数据库
create database mydb;
1.2查看数据库
show databases;
查看数据库配置信息路径:(C:\ProgramData\MySQL\MySQL Server 5.6\Data\)
show global variables like "%datadir%";
1.3练习
创建gbk字符集的数据库
create database mydb3 character set gbk;
创建utf8字符集的数据库,且校对规则为utf8_bin
create database mydb4 character set utf8 collate utf8_bin;
创建mydb5数据库,如果他不存在的话
create database if not exists mydb5;
1.4查看数据库的创建语句
show create database mydb2;
1.5删除数据库
drop database mydb2;
1.6修改数据库
alter database mydb2 character set gbk;
1.7选择数据库
不同的数据库会出现相同名称的表格,所以要先选中这个数据库再去创建这个表
use mydb2;
//查看当前使用的数据库
select database();
2.表操作
2.1创建表
create table user(
id int,
name char(10),
password varchar(20),
birthday date
);
//2.2展示当前数据库的表单
主键:一个表格一般情况下都会设置一个主键,表格中存储主键会提高查询效率
(如果一个字段被 auto_increment修饰,则这个字段一定是主键字段)
show tables;
//2.3案例:员工表employee(包含主键)
create table employee(
id int primary key auto_increment,
name varchar(10),
gender varchar(2),
birthday date,
entry_date date,
job varchar(20),
salary double,
resume text
);
//2.4查看表结构
desc employee;
//2.5查看创建表的语句
show create table employee;
2.7修改表
练习:在上面员工表的基本上增加一个image列
alter table employee add image blob;
修改job列,使其长度为60
alter table employee modify job varchar(60);
删除gender列
alter table employee drop gender;
表名改为user
rename table employee to emp;
修改表的字符集为utf8
alter table emp character set gbk;
列名name改为username
alter table emp change name username varchar(20);
//2.8删除表
drop table emp;
3.表数据
3.1插入数据
create table employee(
id int primary key auto_increment,
name varchar(10),
gender varchar(2),
birthday date,
entry_date date,
job varchar(20),
salary double,
resume text
);
insert into employee values(1,'cy','ma','1980-09-09','1981-09-09','eat',5000.0,'can eat');
insert into employee values(null,'ls','fe','1999-10-10','1981-09-09','drink',5000.0,'can drink');
insert into employee(id,name,gender,birthday,entry_date,job,salary,resume) values(null,'ls','fe','1999-10-10','1981-09-09','drink',5000.0,'can drink');
insert into employee(id,name) values(null,'ls');
insert into employee(name,id) values('qq',null);
//特点:字段类型是数值类型,直接将数据书写在插入语句字段的对应位置
字段类型是字符串型或日期型,需放在单引号或双引号里
插入的数据的长度不能超过字段指定的长度
如果字段设置自动增长,则在插入语句将此字段预留一个null,由数据库对当前字段进行维护
可以在表名后边添加表中字段的名称,在values关键字的后面需要根据书写字段名称的顺序书写字段对应的数据
insert into employee values(null,'李帅','男','1999-10-10','1981-09-09','drink',5000.0,'can drink');
//问题:插入中文数据出现乱码
解决:经过判断,mysql客户端,mysql连接,mysql结果数据三个位置的字符集,将其修改为gbk
修改方法:
临时修改:
//更改字符集(临时修改mysql客户端)
set names 永久修改gbk;
//
修改data目录下的my.nin文件(57行改为gbk字符集,需要重新启动)
//查看字符集
show variables like "%character%";
3.2更新数据
更新表中满足条件的数据
更新语句可以添加where语句,里边是一个条件;更新时可以连续多个字段用逗号隔开
//所有员工的薪水为100000
update employee set salary=100000;
//id为1的员工的薪水为500000
update employee set salary=500000 where id=1;
//名字为ls的薪水为500000
update employee set salary=500000 where name='ls';
//名字为ls的薪水为40000,工作为ccc
update employee set salary=400000,job='ccc' where name='ls';
//名字为李帅薪水原有基础增加1000
update employee set salary=salary+1000 where name='李帅';
3.3删除数据
删除满足语句的数据
基本语句
delete from table_name;----删除整张表的数据
delete from table_name where 条件。---删除满足条件的数据
//删除表中name为ls的数据
delete from employee where name='ls';
//删除表的全部数据
delete from employee;
//使用truncate删除表中的记录
truncate employee;----直接将整张表删除,重建表结构(id不会遗留,从头开始)
特点:
truncate删除时会将表删除重建表结构,这种方式对于单表来说,删除效率高于delete from
对于多表来说,可能会破坏表间的关系
3.4查询数据
基本语句:
//查询全部
select * from employee;
//查询部分
select id,name,gender from employee;
//查询时去重操作distinct
select distinct name from employee;
3.5查询语句添加表达式
3.5.1基本语句
select name,chinese+10,math+10,english+10 from exam;
select name chinese+10 as chinese from exam;
3.5.2别名关键字 as
对于某些字段需要使用新名字展示,可以调用别名as进行修改
select name chinese+10 as chinese from exam;
//统计总分
select name,chinese+math+english from exam;
//使用别名展示总分
select name,chinese+math+english as sum from exam;
3.6 select语句
使用where语句进行过滤查询
//查询赵云的成绩
select * from exam where name='赵云';
//查询英语成绩大于90的同学
select name,english from exam where english>90;
//查询总分大于220的同学(不能使用别名)
select name,chinese+math+english as sum from exam where chinese+math+english>220;
3.7 select语句
//查询英语分数在80-100之间的同学
select name from exam where english between 80 and 100;
//查询数学分数为75,76,77的同学
select name from exam where math in(75,76,77);
//exits
select * from t_cart c where NOT EXISTS (select * from t_cart where c.product_name="1111");
+----+--------------------------------------+--------------------------------------+------------------ --------------------------------------------------------------------+--------------+---------------+------+
| id | user_id | product_id | product_image | product_name | product_price | num |
+----+--------------------------------------+--------------------------------------+--------------------------------------------------------------------------------------+--------------+---------------+------+
| 1 | 1a6a2917-ba41-4830-a828-2ad7f4860709 | fc04c8ec-792f-43b9-a1c3-a610bce0d683 | http://image.jt.com//upload/3/a/d/9/3/a/a/4/e8d1c220-a953-4487-a81f-55d8108a94a1.jpg | 诺基亚 | 345.00 | 1 |
| 2 | 1a6a2917-ba41-4830-a828-2ad7f4860709 | fe292a3c-9bc9-48b8-aa07-956fc0f4aa49 | http://image.jt.com//upload/2/c/9/0/4/a/4/0/986f532d-1cec-4875-9fe4-3c9c285bf08f.jpg | 小米11 | 234.00 | 2 |
+----+--------------------------------------+--------------------------------------+--------------------------------------------------------------------------------------+--------------+---------------+------+
//查询所有姓张的学生成绩
select * from exam where name like '张%';
//查询数学分>70语文分>80的同学
select name from exam where math>70 and chinese>80;
//查询数学分>70或yuwen分数>80的同学
select name from exam where math>70 or chinese>80;
//查询数学分不在60以下的同学
select name from exam where not(math<60);
//查询数学缺考的人员,为null
select name from exam where math is null;
//查询每一个人的成绩的总和
select name,chinese+ifnull(math,0)+english from exam;
3.8 select(5)
order by 排序查询 asc升序 desc降序 如果不写默认升序
order by 指定排序的列,排序的列既可是表中的列名,也可是select语句后指定的列名,order by子句应该位于select语句的结尾
//语文成绩排序后输出
select name,chinese from exam order by chinese;
//对总分排序由高到低的顺序输出
select name,ifnull(math,0)+chinese+english as sum from exam order by sum desc;
//对姓张的同学的成绩排序输出
insert into exam values(null,'zhangwuji',100,100,99);
select name,ifnull(math,0)+chinese+english as sum from exam where name like '张%' order by sum desc;
3.9聚集函数---count 计数
用于返回满足查询条件的行数
select count(*) | count(colimn_name) from table_name;
select count(*) from exam;
select count(math) from exam;
//统计一个班共有多少的学生
select count(math) from exam;
//统计数学成绩大于90的有多少
select count(name) from exam where math>90;
//统计总分大于250的人数有多少
select count(name) from exam where ifnull(math,0)+chinese+english>250;
select count(ifnull(math,0)+chinese+english) from exam where ifnull(math,0)+chinese+english>250;
扩展:count(1)<====>count(*)
select count(1) from exam;//执行效率稍高
4.2聚集函数---sum() 求和
对于满足条件的查询结果求和展示
基本语句:select sum(column_name) from table_name;
练习:
//统计一个班级的数学总成绩
select sum(math) from exam;
//统计一个班级的语数外各科的总成绩
select sum(chinese),sum(math),sum(english) from exam;
//统计一个班级语数外成绩的总和
select sum(ifnull(math,0)+chinese+english) from exam;
//统计一个班级的语文成绩的平均数
select sum(chinese)/count(chinese) from exam;
注意:sum对数值起作用,否则会出错
注意;对多列求和","不能少
注意:sum和count无视null
4.3聚集函数求平均值 avg
对满足条件的查询结果求平均展示
基本语句select avg(column_name) from table_name;
练习:
//求一个班级的数学平均分
select avg(math) from exam;
//求一个班级的总分平均分
select avg(ifnull(math,0)+chinese+english) from exam;
4.4 聚集函数 求最大最小值
对于满足条件的查询结果求最大值最小值展示
练习:求班级的最高分和最低分(数值范围在统计中特别有用)
select max(ifnull(math,0)+chinese+english) from exam;
扩展:子查询
查询谁的语文分数最高
select name,chinese from exam where chinese in (select max(chinese) from exam);
5.分组操作 group by
根据条件进行分组操作
create table m(
id int,
cdate date,
camount int
);
insert into m values(1,'2007-7-9',7);
insert into m values(2,'2007-7-9',3);
insert into m values(2,'2007-7-10',3);
insert into m values(2,'2007-7-11',1);
基本语句:
select * from table_name group by column_name;
select * from m group by id;
创建order表,插入数据:
练习:对订单表中商品归类后,显示每一类商品的总价
//select * from orders group by product;
select product,sum(price) from orders group by product;//分组后进行求和
使用having子句 对分组结果进行过滤
//练习:查询购买了几类商品,并且每类总价大于100的商品
select product,sum(price) from orders group by product having sum(price)>100;
where和having的区别:where在分组前进行条件过滤,having在分组后进行条件过滤。使用where的地方都可以使用having替换,但是having可以使用分组函数,而where后不可以使用
5.多表设计
5.1多表设计----外键约束
定义外键约束
foreign key(dept_id) references orders(id);
多表设计中常常伴随着外键约束的产生
6.外键约束
6.1外键
用来通知数据库表与表字段之间的对应关系,并让数据库帮我们维护这种关系的键叫做外键
外键的作用:维护数据的完整性和一致性
6.2外键的使用场景
在面对高吞吐的场景下,外键使用的并不多,如果外键存在,会影响数据的入库和出库的操作,这在高并发场景下是不被允许的。应该优先保证数据的入库和出库。
至于数据的正确性,可以通过其他的技术手段解决。
在面对低吞吐量,低并发量的场景下可以使用外键来保证数据的正确性。
6.3案例:
创建部门表和员工表(无外键)
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values(null,'财务部'),(null,'人事部'),(null,'科技部'),(null,'销售部');
create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int
);
insert into emp values(null,'张飞',1),(null,'关羽',2),(null,'刘备',3),(null,'zhaoyun',4);
delete from dept where id=3;//可运行
insert into emp values(null,'背景',5);//可运行
创建部门表和员工表(有外键)
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values(null,'财务部'),(null,'人事部'),(null,'科技部'),(null,'销售部');
create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int,
foreign key(dept_id) references dept(id)
);
insert into emp values(null,'张飞',1),(null,'关羽',2),(null,'刘备',3),(null,'zhaoyun',4);
delete from dept where id=3;//无法运行
insert into emp values(null,'背景',5);//无法运行
7.多表查询
数据库中经常涉及到多张表一起查询的情景,可以使用多表查询的方式解决
a.笛卡尔积查询
select * from dept,emp;
查询结果:左边表的行数*右边表的行数=查询结果数量
+----+--------+----+---------+---------+
| id | name | id | name | dept_id |
+----+--------+----+---------+---------+
| 1 | 财务部 | 1 | 张飞 | 1 |
| 2 | 人事部 | 1 | 张飞 | 1 |
| 3 | 科技部 | 1 | 张飞 | 1 |
| 4 | 销售部 | 1 | 张飞 | 1 |
| 1 | 财务部 | 2 | 关羽 | 2 |
| 2 | 人事部 | 2 | 关羽 | 2 |
| 3 | 科技部 | 2 | 关羽 | 2 |
| 4 | 销售部 | 2 | 关羽 | 2 |
| 1 | 财务部 | 3 | 刘备 | 3 |
| 2 | 人事部 | 3 | 刘备 | 3 |
| 3 | 科技部 | 3 | 刘备 | 3 |
| 4 | 销售部 | 3 | 刘备 | 3 |
| 1 | 财务部 | 4 | zhaoyun | 4 |
| 2 | 人事部 | 4 | zhaoyun | 4 |
| 3 | 科技部 | 4 | zhaoyun | 4 |
| 4 | 销售部 | 4 | zhaoyun | 4 |
+----+--------+----+---------+---------+
select * from dept,emp where dept.id=emp.dept_id;
b.内连接查询
在笛卡尔积的查询基础之上,获取左边表有且右边表也有的数据,这种查询方式称之为内连接查询
select * from dept,emp where dept.id=emp.dept_id;
inner join...on
select * from dept inner join emp on dept.id=emp.dept_id;
c.外连接查询
1.左外连接查询
在内连接的查询基础上,获取左边表有但是右边表没有的数据,这种查询方式称之为左外连接查询
insert into dept values(null,'保安部');
insert into emp values(null,null,null);
select * from dept left join emp on dept.id=emp.dept_id;
select * from dept d left join emp e on d.id=e.dept_id;//简写
+----+--------+------+---------+---------+
| id | name | id | name | dept_id |
+----+--------+------+---------+---------+
| 1 | 财务部 | 1 | 张飞 | 1 |
| 2 | 人事部 | 2 | 关羽 | 2 |
| 3 | 科技部 | 3 | 刘备 | 3 |
| 4 | 销售部 | 4 | zhaoyun | 4 |
| 5 | 保安部 | NULL | NULL | NULL |
+----+--------+------+---------+---------+
2.右外连接查询
在内连接的查询基础上,获取左边表没有但是右边表有的数据,这种查询方式为右外连接查询
insert into emp values(null,'背景',6);
select * from dept right join emp on dept.id=emp.dept_id;
+------+--------+----+---------+---------+
| id | name | id | name | dept_id |
+------+--------+----+---------+---------+
| 1 | 财务部 | 1 | 张飞 | 1 |
| 2 | 人事部 | 2 | 关羽 | 2 |
| 3 | 科技部 | 3 | 刘备 | 3 |
| 4 | 销售部 | 4 | zhaoyun | 4 |
| NULL | NULL | 5 | 背景 | 6 |
+------+--------+----+---------+---------+
3.全外连接查询
在内连接的查询基础上,获取左边表有但是右边表没有的数据和左边表没有但右边表有的数据,这种查询方式叫做全外连接查询
select * from dept full join emp on dept.id=emp.dept_id;#mysql中没有fulljoin
//可以通过union关键字实现全外连接查询的结果
select * from dept left join emp on dept.id=emp.dept_id
union
select * from dept right join emp on dept.id=emp.dept_id;
+------+--------+------+---------+---------+
| id | name | id | name | dept_id |
+------+--------+------+---------+---------+
| 1 | 财务部 | 1 | 张飞 | 1 |
| 2 | 人事部 | 2 | 关羽 | 2 |
| 3 | 科技部 | 3 | 刘备 | 3 |
| 4 | 销售部 | 4 | zhaoyun | 4 |
| 5 | 保安部 | NULL | NULL | NULL |
| NULL | NULL | 5 | 背景 | 6 |
+------+--------+------+---------+---------+
注意:数据库关键字执行顺序
from>where>select>order by
案例:
create table exam(
id int primary key auto_increment,
name varchar(20) not null,
chinese double,
math double,
english double
);
insert into exam values(null,'关羽',85,76,70);
insert into exam values(null,'张飞',70,75,70);
insert into exam values(null,'赵云',90,65,95);
//练习
//查询全部
select * from exam;
//去重全部查询
select distinct * from exam;
create table orders(
id int,
product varchar(20),
price float
);
insert into orders(id,product,price) values(1,'电视',900);
insert into orders(id,product,price) values(2,'洗衣机',100);
insert into orders(id,product,price) values(3,'洗衣粉',90);
insert into orders(id,product,price) values(4,'桔子',9);
insert into orders(id,product,price) values(5,'洗衣粉',90);
------------------------------------------------------------
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values(null,'财务部'),(null,'人事部'),(null,'科技部'),(null,'销售部');
create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int
);
insert into emp values(null,'张飞',1),(null,'关羽',2),(null,'刘备',3),(null,'zhaoyun',4);