数据库(MySql)
一.数据库(MYSQL)
1.数据库(DataBase)用来存储,维护,管理数据的集合
2.数据库管理系统(DataBas Management System)简称(DBMS),用来操作和管理数据库的软件
卸载数据库
#第一步:依次执行下面的语句
sudo apt-get autoremove --purge mysql-server
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common
#第二步:清理残留数据
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
#这个步骤尽量多执行几次,清理干净
安装数据库
#####第一步:下载MySQL资源,安装之前请先卸载之前的,一定要卸载干净https://dev.mysql.com/downloads/file/?id=477124,进入官网之后直接点击No thanks, just start my download,下载下来的是mysql-apt-config_0.8.10-1_all.deb安装包【注意:如果是其他的则有问题】#####第二步:在终端里输入下面的命令安装下载的发布包sudo dpkg -i 文件路径+文件名 也可以cd到文件目录下,直接执行sudo dekg -i mysql-apt-config_0.8.10-1_all.deb
#####第三步:使用以下命令从MySQL APT存储库更新包信息sudo apt-get update
#####第四步:安装MySQLsudo apt-get install mysql-server
注意:这里要选择第二个,不然安装之后只有用sudo才能进入MySQL,而且不能使用数据库
启动停止数据库
检查MySQL的状态:**sudo service mysql status**
开启MySQL服务器:**sudo service mysql start**
关闭MySQL服务器:**sudo service mysql stop**
二:数据库操作
1.数据库的各种操作
创建数据库
create database 数据库名 charset='utf8'
①mysql -uroot -pi 开启数据库
②create database Django charset='utf8'; 创建数据库
③use Django 切换到指定数据库
④create table 表名 创建表
⑤desc 表名 查看数据库字段
2.alter的使用
①修改表名
alter table 旧表名 rename 新表名
②修改字段数据类型
alter table 表名 table_name MODIFY 字段名 数据类型
③删除表的外键约束
alter TABLE 表名 DROP FOREIGN KEY 外键 约束名
④删除没有被关联的表
DROP TABLE [if exists] 表一,表二
3.数据类型:
int(正常大小的整数,有符号的范围:-2147483648到2147483647,无符号:0到4294967295。可以指定多达11位的宽度)
tinyint(一个非常小的整数,有符号-128到127,无符号0到255,可以多达4位)
smallint(一个小的整数。如果有符号-32768到32767,无符号0到65535.最多宽度为5)
mediumint(一个中等大小的符号,如果有符号,允许范围为-8388608至8388607。 如果无符号,允许的范围是从0到16777215,可以指定最多9位的宽度)
bigint(一个大的整数,如果有符号,允许范围为-9223372036854775808到9223372036854775807。如果无符号,允许的范围是从0到18446744073709551615。最多20位宽度)
Float (浮点数字,默认为10和2.2表示小鼠的位数,10表示数字的总数)
Date(时间类型)
char(1-255的字符长度,固定长度)
Varchar(1-255的可变长度)
主要了解 char 和 varchar 的区别
①char的长度是不可变的,而varchar的长度是可变的
②char的存取数度还是要比varchar要快得多
③char的效率没有varchar快
④char对英文占一个字节,对汉字占两个字节。而warchar对汉字和英文都是两个字符
4.创建表
create table student(
-> id int(10),
-> name varchar(20),
-> sex varchar(10),
-> birthday date,
-> entry_date date,
-> job varchar(20),
-> salary double
-> );
①show tables 显示当前有多少表
②desc 表名 查看表里面的数据字段
③drop table 表名 删除表
④select*from student 查看表中数据
⑤select name,age from student; 查看表中指定数据内容
三.数据库的增删改查(where)
1.insert 增
insert into student(id,name,sex,birthday,entry_date,job,salary) values(1,'张三','男','1996-05-28','2019-1-1','程序员','12000'); 单行插入
insert into student(id,name,sex,birthday,entry_date,job,salary) values(1,'张三','男','1996-05-28','2019-1-1','Python工程师','12000'),(2,'李四','男','1987-12-14','2015-3-1','JAVA工程师',18000),(3,'王五','女','1989-10-5','2017-8-10','前端工程师',15000); 多行插入
2.delete(删除)
delete from student
①delete from student where name="张三" 删除表中姓名是张三的
②delete from student 删除student的整个表
【面试题:drop,delete,truncate之间的区别】
#1.占用空间
drop:将表所占用的空间全部释放掉
delete:不会减少表或者索引所占用的空间
truncate:表或者索引所占用的空间会恢复到初始大小
drop>truncate>delete
3.update 更新
update 表名 set name='xingming',age='nianling'
a.update可以更新一个字段或者多个字段内容
b.可以用where指定条件
#1.将所有员工的薪水修改为5000
update student set salary=5000;
#2.将李四的薪水修改为8000
update student set salary=8000 where name='李四';
#3.将王五的薪水修改为6000,并将性别修改为男
update student set salary=6000,sex='男' where name='王五';
#4.将张三的薪水在原来的基础上增加1000
update student set salary=salary+1000 where name='张三';
#5.将月薪大于7000的员工,月薪在原来的基础上增加2000
update student set salary=salary+2000 where salary>7000;
4.where(查)
#1.查询性别不为男的数据
select*from student where sex!='男';
#2.查询学号为1,2,3的数据
select*from student where id=1 or id=2 or id=3
#3.distinct:去除重复记录
select distinct id from student;
5.模糊查询:link
#1.查询名字由4个字符组成的数据
select*from student where name like'__';
#2.查询姓名以张开头的数据
select*from student where name like'张_';
6.起别名:as
select 字段 as 别名;
select name as 姓名,gender as 性别 from student;
distinct:去除重复记录
select distinct id from student;
7.排序:order by
asc:升序【Ascending】
desc:降序【Descending】
结合where或者like的使用
select * from student order by age asc/desc; 按照年龄进行升序和降序排列
#1.id以降序排列
select*from student order by id desc;
8.聚合函数
聚合函数:用来做纵向运算的函数
count():统计个数
select count(*) from student where id>1; ——》2个
select count(age),count(gender) from student; 统计年龄和性别相同的人的个数
sum(和计算)
#1.计算所有学生的工资和
select sum(salary) from student;
#2.计算所有学生id和工资和
select sum(id)+sum(salary) from student;
avg():average,求平均值
#1.计算所有学生的平均工资
select avg(salary) from student;
9.分组查询:group by
#1.分别查询女生和男生的人数
select count(*) from student group by sex;
10.having:分组查询
having和where的区别:
①二者都表示限定条件
②having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
③having只能使用聚合函数而where不可以
通过group by和having两种方式实现分组(查找工资大于1000的人)
select job,count(*) from worker where salary>10000 group by job;
select job,count(*) from worker group by job having sum(salary)>10000;
11.limit分页查询
1.显示0行和第二行
select * from worker limit 0,2;
二.数据库的高级操作
1.约束类型:
(1)主键约束【primary key】
特点:数据唯一,不能为null
唯一约束【unique】
自动增长列【auto_increment】
主键①:
create table stu1( id int primary key, name varchar(50));
主键②:
create table stu2(id int,name varchar(50),primary key(id));
主键③:先创建表再通过alter添加主键
create table stu3( id int,name varchar(50));
添加主键:alter table stu3 add constraint stu3_id primary key(id);
(2)唯一约束【unique】
作用:确保键列中不出现重复数据
create table stu4(id int primary key,
name varchar(50) unique
);
(3)自动增长列(auto——increment)
作用:一般用于给主键添加自动增长的数值,只能是整数类型
(4)域完整性
作用:限制当前单元格数据的完整性,不和其他的单元格比对
create table stu6(
id int primary key auto_increment, 主键自动增长列
name varchar(50) unique not null 唯一约束,不能为空
-> );
(5)默认值约束
create table stu7(
id int primary key auto_increment,
name varchar(50) unique not null,
address varchar(50) default '北京' 默认值约束
-> );
insert into stu7(name) values('张三');
(6)引用完整性(外键约束 foreign key )
①创建学生表:
create table student(
stuid varchar(10) primary key,
stuname varchar(50)
);
②创建成绩表:
create table score(
stuid varchar(10),
score int,
courseid int,
constraint stu_sco_id foreign key(stuid) references student(stuid) //将两张表进行关联
);
③关联两张表
添加外键约束①:
constraint stu_sco_id foreign key(sid) references stud1(sid)
添加外键约束②:先创建表,用alter在表外进行关联
alter table score2 add constraint stu_sco_id2 foreign key(sid) references stud2(sid);
2.多表查询
(1)合并结果集(列数相同情况下)
union:去除重复记录
union all:不去出重复记录
(2)连接查询(多表查询)重点
select*from student,score;(笛卡儿积)
列数:student列数*score列数(会很混乱)
解决方案:使用主外键来去除无用信息
mysql> select*from student,score where student.sno=score.sno;
简写的解决方案:(起别名)
select*from student s,score c where s.sno=c.sno
(拿到想要的数据)
select s.sno,s.sname,c.cno,c.degree from student s,score c where s.sno=c.sno;
①内连接(join on)
,变join,where变为on
select s.sno,s.sname,c.degree,c.cno from student s join score c on s.sno=c.sno;
②外连接(outer join on)
左连接:left join on
select s.sno,s.sname,c.cno,c.degree from student s left join score c on s.sno=c.sno;(参照左边学生表)
右连接:right join on
select s.sno,s.sname,c.cno,c.degree from student s right join score c on s.sno=c.sno;(参照右边成绩表)
③自然连接(natural join )
自然连接相当于内连接(最简单的连接)
select*from student natural join score;
④子查询
#1.查询和ward在同一个部门的员工
#思路:先查询ward所在的部门编号,然后再通过部门查询其他的员工
mysql> select * from emp where empname="ward";
+-------+---------+----------+------+------------+------+------+--------+
| empno | empname | job | mgr | hiredate | sal | comm | deptno |
+-------+---------+----------+------+------------+------+------+--------+
| 7521 | ward | salesman | 7698 | 1981-02-22 | 1250 | 500 | 30 |
+-------+---------+----------+------+------------+------+------+--------+
1 row in set (0.00 sec)
mysql> select deptno from emp where empname="ward";
+--------+
| deptno |
+--------+
| 30 |
+--------+
1 row in set (0.00 sec)
mysql> select * from emp where deptno =30;
+-------+---------+----------+------+------------+------+------+--------+
| empno | empname | job | mgr | hiredate | sal | comm | deptno |
+-------+---------+----------+------+------------+------+------+--------+
| 7499 | allen | salesman | 7698 | 1981-02-20 | 1600 | 300 | 30 |
| 7521 | ward | salesman | 7698 | 1981-02-22 | 1250 | 500 | 30 |
| 7566 | jones | managen | 7839 | 1981-04-02 | 2975 | NULL | 30 |
| 7654 | martin | salesman | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
| 7698 | blake | manager | 7839 | 1981-05-01 | 2850 | NULL | 30 |
+-------+---------+----------+------+------------+------+------+--------+
5 rows in set (0.00 sec)
mysql> select * from emp where deptno=(select deptno from emp where empname="ward");
+-------+---------+----------+------+------------+------+------+--------+
| empno | empname | job | mgr | hiredate | sal | comm | deptno |
+-------+---------+----------+------+------------+------+------+--------+
| 7499 | allen | salesman | 7698 | 1981-02-20 | 1600 | 300 | 30 |
| 7521 | ward | salesman | 7698 | 1981-02-22 | 1250 | 500 | 30 |
| 7566 | jones | managen | 7839 | 1981-04-02 | 2975 | NULL | 30 |
| 7654 | martin | salesman | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
| 7698 | blake | manager | 7839 | 1981-05-01 | 2850 | NULL | 30 |
+-------+---------+----------+------+------------+------+------+--------+
5 rows in set (0.01 sec)
⑤自连接
#1.查询员工编号为7782的姓名,上级的姓名和编号
mysql> select mgr from emp where empno=7782;
+------+
| mgr |
+------+
| 7839 |
+------+
1 row in set (0.00 sec)
mysql> select * from emp where empno=7839;
+-------+---------+-----------+------+------------+------+------+--------+
| empno | empname | job | mgr | hiredate | sal | comm | deptno |
+-------+---------+-----------+------+------------+------+------+--------+
| 7839 | king | president | NULL | 1987-02-20 | 5000 | NULL | 10 |
+-------+---------+-----------+------+------------+------+------+--------+
1 row in set (0.01 sec)
mysql> select * from emp where empno=(select mgr from emp where empno=7782);
+-------+---------+-----------+------+------------+------+------+--------+
| empno | empname | job | mgr | hiredate | sal | comm | deptno |
+-------+---------+-----------+------+------------+------+------+--------+
| 7839 | king | president | NULL | 1987-02-20 | 5000 | NULL | 10 |
+-------+---------+-----------+------+------------+------+------+--------+
1 row in set (0.00 sec)
#2.查询各个部门中薪水最高的员工
#思路:查询各个部门的最高薪水,然后根据薪水查询员工信息
mysql> select max(sal) from emp group by deptno;
+----------+
| max(sal) |
+----------+
| 5000 |
| 3000 |
| 2975 |
+----------+
3 rows in set (0.00 sec)
mysql> select deptno,max(sal) from emp group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000 |
| 20 | 3000 |
| 30 | 2975 |
+--------+----------+
3 rows in set (0.00 sec)
mysql> select * from emp where sal in(select max(sal) from emp group by deptno);
+-------+---------+
3.数据库备份与恢复
1.数据库存储与数据库管理系统中。
①备份:退出数据库。执行SQL脚本,导出数据
mysqldump -u root -p 数据库名>生成的脚本的文件路径
yangguang@Ubuntu01:~$ mysqldump -u root -p Worker>/home/yangguang/Desktop/Worker.sql;
②恢复:
(1)进入数据库删除需要备份的数据库
(2)创建一个空的数据库,名字随意取,并进入创建的数据库下
(3)执行:mysql> source /home/yangguang/Desktop/Worker.sql;
4.Mysql内置函数
①时间函数:
添加时间:select addtime('16:11:11','1:1:1')
当前日期:select current_date();
当前时间:select current_time();
时间日期:select current_timestamp();(和now一样)
5.事务处理
#关键字begin,commit和rollback主要用于mysql的事务
#commit:当一个事务处理完成之后,commit会对所有涉及到的表生效
#rollback:如果sql语句执行的过程中,发生故障,使用rollback可以将每个涉及到的表恢复到事务开始【begin】之前的状态
begin---->commit
begin-----<rollback