数据库(MySql)

2019-02-27  本文已影响0人  信命不认命_962f

一.数据库(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

上一篇下一篇

猜你喜欢

热点阅读