美文网首页
数据库(MySql)

数据库(MySql)

作者: 信命不认命_962f | 来源:发表于2019-02-27 21:23 被阅读0次

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

    相关文章

      网友评论

          本文标题:数据库(MySql)

          本文链接:https://www.haomeiwen.com/subject/ewkwyqtx.html