数据库管理系统(DBMS)的概述

时间:2022-12-16 08:16:57
数据库管理系统(DBMS)的概述

数据库管理系统DBMS的概述

数据库

数据库的概念(了解)

1.1 什么是数据库

对数据进行管理的仓库

DBMS:database  manage system

仓库(database)  =   若干个表(table

1.2 常见的数据库

MySQLOracle(神喻、神谕)、SqlServer(微软专用)DB2

1.3 理解数据库

库:多个表

表:多个字段(列)

字段:属性

列:表的结构

行:一条数据(在数据库中不存在半条数据的说法)

姓名

年龄

性别

班级

高景洋

18

1

 

安装mysql数据库

参考对应文档

 

基本命令

mysql –uroot –p123   回车     进入mysql数据库

show databases

 

数据库中的数据类型

int 整型   1000

double : 双浮点类型   double(5,2)  最多是5位,其中必须有2位小数,最大值是:999.99

decimal:单浮点类型,之所以用它,是因为它能避免精度丢失,一旦涉及到钱,必须使用该类型

char: 字符串,长度不可变   char(50)

varchar:字符串,长度可变    varchar(10)  最长是10

date:日期格式    yyyy-MM-dd

time: 时间格式   hh:mm:ss

datetime:  日期+时间

 

 

SQL语句

SQL概述

1.1 什么是SQL

结构化查询语句  structure  query  language

1.2 语法要求

可以单行书写,也可以多行书写

对大小写不敏感

结束标志是分号,不能省略

分类

DDL:数据定义语言,用来定义数据库对象:库、表、列

DML:数据操作语言,用来定义数据库记录(数据)

DCL:数据控制语言,用来定义权限和安全级别的

DQL:数据查询语言,用来查询记录(数据)

 

 

DDL(对库、表的操作,增、删、改)

 

查看当前所有的数据库

 

创建一个自己的数据库:create database 库名;

 

使用某一个数据库: use 库名;

 

查看当前数据库中所有的表名  show tables;

 

创建一个表

create table 表名(

列名 列类型,

列名 列类型,

……

列名 列类型,

列名 列类型

);

 

 

查看表结构: desc 表名;

 

删除表  drop table 表名;

 

修改表

添加一列

alter table 表名 add(

列名 列类型,

列名 列类型,

……

列名 列类型

);

 

 

修改列类型(不建议去该列类型,避免的方法,建表的时候考虑周全)

alter table 表名 modify 列名 列类型;

 

修改列名

alter table 表名 change 原列名 新列名 列类型;

 

删除列

alter table 表名 drop 列名;

 

修改表名

alter table表名 rename to 新表名;

 

 

 

 

DML(对表的记录/数据的操作,增删改)

DQLselect * from 表名;

1、 插入数据

insert into 表名 (列名1,列名2……列名N) values (值1,值2……N);

 

注意:

中文乱码:参考

 

1:在表名认是插入一后跟的是列名,如果没有指定列名,默整行数据,不允许插入半行数据

 

2:在插入数据的时候,指定了列名,但是没有全部指定,则插入的指定列的数据,没有指定的列默认为null

 

3:插入数据的时候,数据的顺序必须跟指定列的顺序保持一致,如果没有指定列名,则插入的顺序必须跟表结构的顺序一样

 

2、 修改数据

update 表名 set 列名1=列值1,列名2=列值2……列名N=列值N

 

以上的SQL语句,更改的是所有列的数据的值,很显然不合适,需要更改个别数据。

update 表名 set 列名1=列值1,列名2=列值2……列名N=列值N where 条件;

一般来讲,条件用唯一标识,id

 

 

 

 

总结:条件(where子句),一定是一个boolean类型的表达式

where子句中能够使用那些运算符

=   !=  <   >   <=   >=  and  or    between…and

is null    is not null    专门用来判断某字段是否为null

 

 

 

 

 

 

练习:把性别为null的数据的名字改为fff

 

 

 

练习:把性别不为null的数据的性别改成人妖

 

3、 删除数据(慎用)

delete from 表名;   //删除全部的数据

delete * from 表名;  //删除全部的数据

delete  from 表名 where 条件;//注意,删除的整条数据

练习:删除sexnull的数据

 

删除全部数据:

 

 

DCL(创建用户并授权)(理解就好)

一般来讲,一个项目,只有一个用户,不是root,是root创建出来的。对应的数据库也只有一个,这个用户只能操作这个数据库,不能去操作其他数据库。

1、 创建一个用户

create user 用户名@IP地址 identified by ‘密码’;

假如说创建成功了,那么这个用户只能够在这个IP地址上登录。

 

 

上面的192.168.1.117是个动态地址,不允许使用本机动态地址

本机地址127.0.0.1是本机静态地址,也可以使用localhost

 

 

2、 给用户授权

grant 权限1,权限2……权限N on 库名.* to 用户名@IP地址;

权限包括:createalterdropinsertupdatedeleteselect

 

验证是否授权成功

 

没有删除权限,所以删除失败(并不是SQL语句有问题)

 

3、 撤销权限

revoke 权限1,权限2……权限N on 库名.* from 用户名@IP地址

 

验证是否已经撤销添加数据的权限

 

4、 查看权限

show grants for 用户名@IP地址;

 

5、删除用户

drop user 用户名@IP地址;

 

验证

 

 

DQL(查询——不会改变数据(表的记录))

创建一个表students(建表和插入数据的SQL,在作业1)

一、 基础查询

1、 查询所有列

select * from 表名;

2、 查询指定列

select idname from 表名;

二、 条件查询

1、 where子句能够使用哪些运算符(补充)

   =   !=  <   >   <=   >=  and  or    between…and

is null    is not null    专门用来判断某字段是否为null

%   /  *  +  -   <>(不等于)   in     not in

 

2、 查询学号为1004、 1005、 1009 、 1011的数据

SELECT * FROM students WHERE id IN('1004','1005','1009','1011');

3、 查询学号不为1004、 1005、 1009 、 1011的数据

SELECT * FROM students WHERE id NOT IN(1004,1005,1009,1011);

4、 查询性别非男的数据

SELECT * FROM students WHERE sex != 'nan';

 

SELECT * FROM students WHERE sex <>'nan';

5、 查询成绩非空的数据

SELECT * FROM students WHERE score IS NOT NULL;

 

三、 模糊查询like

1、 查询姓名由6个字母构成的学生记录

SELECT * FROM students WHERE NAME LIKE '______';

一个_,代表一个字符(一个英文一个汉字都算一个字符)

 

2、 查询姓名由11个字母构成,并且第2个字母为i的学生记录

SELECT * FROM students WHERE NAME LIKE '_i_________';

 

3、 查询姓名以w开头的学生记录

SELECT * FROM students WHERE NAME LIKE 'w%';

%,代表0N个字符

 

4、 查询姓名中第3个字母为a的学生记录

SELECT * FROM students WHERE NAME LIKE '__a%';

 

5、 查询姓名中包含a字母的学生记录

SELECT * FROM students WHERE NAME LIKE '%a%';

 

四、 字段控制查询

1、 去除重复记录

两行或者两行以上的记录中,出现的数据相同,比如students表中的agesexscore字段就存在相同的数据,如果想去掉重复的记录,就需要使用distinct

SELECT DISTINCT score FROM students;

 

2、 (使用emp表,已共享)查看雇员的月薪与奖金之和

SELECT *,sal+comm FROM emp;

上面的结果是不对的,salcomm是数字类型,可以做加减法,但是因为commnull值,所以加完之后,得到的是null

SELECT *,sal+IFNULL(comm,0) FROM emp;

3、 改列名——添加别名

SELECT *,sal+IFNULL(comm,0) AS 钱 FROM emp;

SELECT *,sal+IFNULL(comm,0) 钱钱 FROM emp;

as可以省略

五、 排序  order by

1、 查询所有员工记录,按工资sal升序排序

SELECT * FROM emp ORDER BY sal ASC;

ASC代表升序,可以省略

2、 查询所有的员工记录,按工资sal降序排序

SELECT * FROM emp ORDER BY sal DESC;

desc代表降序,不能省略

3、 查询所有的员工,按工资降序排序,如果工资相同时,按编号升序排序

SELECT * FROM emp ORDER BY sal DESC,empno ASC;

六、 聚合函数

聚合函数是用来做纵向运算的函数

COUNT():统计指定列不为NULL的记录行数;(纵向统计)

MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0

AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0

1、 count

1查询emp表中有多少条记录(记录数)

SELECT COUNT(empno) FROM emp;

SELECT COUNT(*) FROM emp;

括号里能放  1 、非空字段   2*

 

2查询emp表中有奖金的人数

SELECT COUNT(comm) FROM emp;

3查询emp表中月薪大于25000的人数

SELECT COUNT(*) FROM emp WHERE sal > 25000;

4统计月薪与奖金之和大于25000的人数

SELECT COUNT(*) 人数 FROM emp WHERE sal+IFNULL(comm,0) > 25000;

5查询有奖金的人数,以及有领导的人数

SELECT COUNT(comm),COUNT(mgr) FROM emp

2、 sumavg

1查询所有员工月薪的和

SELECT SUM(sal) FROM emp;

2查询所有员工月薪和,以及所有员工的奖金和

SELECT SUM(sal),SUM(comm) FROM emp;

3查询所有员工月薪+奖金的和

SELECT SUM(sal),SUM(comm) FROM emp;

4统计所有员工的月薪+奖金的平均值

SELECT AVG(sal+IFNULL(comm,0)) FROM emp;

3、 maxmin

查询最高工资和最低工资

SELECT MAX(sal),MIN(sal) FROM emp ;

 

七、 分组查询  group by

当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要按照部门来分组。

1、 分组查询

查询每个部门的部门编号和每个部门的工资和

SELECT deptno,SUM(sal)

FROM emp

GROUP BY deptno;

查询每个部门的部门编号以及每个部门的人数:

SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;

查询每个部门的部门编号以及每个部门工资大于15000的人数:

SELECT deptno,COUNT(*) FROM emp WHERE sal > 15000 GROUP BY deptno;

语法:where子句必须放在from表名  的后面

2、 having子句

查询工资总和大于90000的部门编号以及工资和:

SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 90000;

知识点:同样作为子句,where必须放在from表名的后面

having子句必须放在最后

where子句后面不能加聚合函数,如果使用聚合函数作为条件,必须使用having子句进行引领。

 

注意:where是对分组前记录进行限制的条件,如果某条记录不满足where的条件,这条记录就不参与分组。

having是对分组之后的数据进行限制的。

查询出某部门员工编号大于1005的员工的工资和

SELECT *,SUM(sal) FROM emp WHERE empno>1005 GROUP BY deptno HAVING SUM(sal)>20000;

八、 方言limit,只能够在mysql数据中使用

limit用来限定查询结果的起始行,以及总行数。

1、 查询5行记录,起始行从0开始

SELECT * FROM emp LIMIT 0,5;

2、 查询10行记录,起始行从3开始

SELECT * FROM emp LIMIT 2,10;

 

注意:只要查询行数不是从第0行还是,则指的的我们视觉上的行数

3、 分页查询(有了sqlyog,一般没必要用)

如果一页记录为10条,希望查看第3页记录应该怎么查呢?

0—9

10---19

20---29

SELECT * FROM emp LIMIT 20,10;