数据库
一、常见的数据库管理系统
? Oracle MySQL DB2 Sybase “ MS SqlServer 等支持标准sql的数据库管理系统”
二、sql、DB、DBMS分别是什么,他们之间的关系?
DB:
? DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS:
? DataBase Management System(数据库管理系统,常见的有:MySQL 、Oracle 、DB2、 Sybase 、Sqlserver...........)
SQL:
? 结构化查询语句,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
? SQL属于高级语言,只要看得懂英语单词的,写出来的sql语句,可以容易读懂。
? SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql.(sql语句的编译由DBMS完成)。
关系:
? DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
? DBMS---(执行)----》SQL------(操作)------》DB
三、什么是表?
表:table
表:
table是数据库的基本组成单元,所有的数据都以表的形式组织,目的是可读性强。
一个表包括行和列:
? 行:被称为数据/记录(data)
? 列:被称为字段(column)
学号 | 姓名 | 年龄 |
---|---|---|
110 | 张三 | 20 |
120 | 李四 | 21 |
每一个字段应该包括什么属性?
? 字段名、数据类型、相关的约束。
四、SQL语句怎么分类呢?
DQL(数据查询语言):
? 查询语句,凡是select语句都是DQL.
DML(数据操作语言):
? insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言):
? create drop alter,对表结构的增删改。
TCL(事务控制语言):
? commit提交事务,rollback回滚事务。
DCL(数据控制语言) :
? grant授权、revoke撤销权限等。
五、导入数据
第一步:登录mysql数据库管理系统
? dos命令窗口:
? mysql -uroot -p333
第二步:查看有哪些数据库
? show databases;(这个不是SQL语句,属于MYSQL的命令)
+--------------------------------+
| Database |
+--------------------------------+
| information_schema |
| db_flower_shop |
| dbtest |
| demo2 |
| goods |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+----------------------------------+
第三步:创建我们属于我们自己的数据库
? create database bjpowernode;(这个不是SQL语句,属于MYSQL的命令)
第四步:使用bjpowernode数据
? use bjpowernode; (这个不是SQL语句,属于MYSQL的命令)
第五步:查看当前使用的数据库中有那些表
? show tables;(这个不是SQL语句,属于MYSQL的命令)
第六步:初始化数据
? source + 脚本位置
六、什么是sql脚本?
? 当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句,我们称这样的文件为sql脚本。
注意:直接使用source命令可以执行sql脚本。
? sql脚本中的数据量太大的时候,无法打开,可以使用source命令完成初始化。
七、删除数据库
? drop database bjpowernode;
八、查看表结构:
+----------------------------+
| Tables_in_world |
+----------------------------+
| city | (城市表)
| country | (国家表)
| countrylanguage | (语言表)
+----------------------------+
desc city;
九、表中的数据
select * from city;
十、常用命令
? select database(); 查看当前使用的是哪个数据库
+-----------------+
| database() |
+-----------------+
| world |
+-----------------+
? select version(); 查看mysql的版本号
+----------------+
| version() |
+-----------------+
| 5.7.20-log |
+-----------------+
? \c 命令,结束一条语句。
? exit 命令,退出mysql。
十一、查看创建表的语句
? show create table world;
十二、简单的查询语句(DQL)
语法格式:
? select 字段名1,字段名2,字段名3...........from表名;
提示:
? 1、任何一条sql语句以“;”结尾。
? 2、sql语句不区分大小写。
? 3、标准sql语句中要求字符串使用单引号括起来
查询所有字段:
? select * from world; //开发中不建议使用,效率较低
十三、条件查询
语法格式:
? select
? 字段,字段.....
? from
? 表名
? where
? 条件;
执行顺序:先from,然后where,最后select。
? select ename ,sal from emp where sal between 1100 and 3000; // between ......and .......是闭区间【1100~3000】
在数据库中NULL不是一个值,代表什么也没有,为空。必须使用is null 或者is not null。
? select ename,sal ,comm from emp where comm is not null;
? select ename,sal,comm from emp where comm is null or comm =0;
找出工作岗位是MANEGER和SALESMAN的员工
? select ename,job from emp where job =‘MANEGER‘ or job =‘SALESMAN‘;
and和or联合起来用:找出薪资大于1000的并且部门编号是20或者30部门的员工。(注意当优先级不确定的时候加小括号)
? select ename,sal,deptno from emp where sal>1000 and (deptno = 20 or deptno = 30);
in等同于or:找出工作岗位是MANEGER和SALESMAN的员工。
? select ename,job from emp where job in (‘MANEGER‘ ,‘SALESMAN‘); // in 后面的不是区间,是具体的值
not in :不在这几个值当中。除了这几个值都找出来
模糊查询like:
(必须掌握两个特殊符号,一个是%,一个是_)%代表多个字符,__代表任意1个字符。
找出名字当中有O的:
? select ename from emp where ename like ‘%O%‘;
找出名字中第二个字母是A的:
? select ename from emp where ename like ‘_A%‘;
查找名字中有下划线的:
? select ename from emp where ename like‘%\_%‘;
找出名字最后一个字母是T的:
? select ename from emp where ename like‘%T‘;
十四、排序(升序、降序)
按照工资升序,找出员工名和薪资
语法格式
? select
? ename,sal
? from
? emp
? order by
? sal;
注意:默认是升序。asc表示升序,desc表示降序。
? select ename,sal, from emp order by sal; //升序
? select ename,sal, from emp order by sal asc; //升序
? select ename,sal, from emp order by sal desc; //降序
?
按照工资的降序排列,当工资相同的时候在按照名字的升序排列
? select ename,sal, from emp order by sal desc ,ename asc;
注意:越靠前的字段越能起到主导的作用,只有当前面的字段无法完成排列的时候,才会启用后面的字段。
找出工作岗位是SALESMAN的员工,并要求按薪资的降序排列
? select
? ename,job,sal //3 (执行顺序)
? from
? emp //1
? where
? job=‘SALESMAN‘ //2
? order by
? sal desc; //4
十五、分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注意:所有的分组函数都是对“某一组”数据进行操作的。
找出工资的总和
? select sum(sal) from emp;
找出最高工资
? select max(sal) from emp;
找出最低工资
? select min(sal) from emp;
找出平均工资
? select avg(sal) from emp;
找出总人数
? select count(*) from emp;
? select count(ename) from emp;
分组函数一共5个
分组函数还有另外一个名字:多行处理函数
多行处理函数的特点:输入多行,最终输出的结果是1行
分组函数会自动忽略NULL
找出工资高于平均工资的员工
? select avg(sal) from emp; //平均工资
? select ename,sal from emp where sal>avg(sal); //这一句是错误的,因为group by是在where之后执行的。
? 应为:select ename,sal from emp where sal >具体平均工资数值
? 也可以两句合为一句:select ename,sal from emp where sal>(select avg(sal) from emp); //子查询
注意:SQL语句中有一个语法规则,分组函数不可直接使用在where句子当中。
count(*)和cuont(具体的某个字段),他们有什么区别?
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm):表示统计comm字段中不为NULL的数据总数量。
分组函数也能组合起来用
select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
十六、单行处理函数
什么是单行处理函数?
? 输入一行,输出一行。
计算每个员工的年薪
? select ename,(sal+comm)*12 as yearsal from emp;
注意:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
使用ifnull函数:
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
十七、group by 和 having
group by:按照某个字段或者某些字段进行分组。
having:是对分组之后的数据进行再次过滤。
找出每个岗位的最高薪资
? select max(sal),job from emp group by job;
注意:分组函数一般都会和group by联合使用,这也是为什么它会被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。当一条sql语句没有group by的话,整张表的数据都会自成一组。
注意:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。
每个工作岗位的平均薪资
? select job,avg(sal) from emp group by job;
多个字段能不能联合起来一起分组
找出不同工作岗位的最高薪资
? select deptno,job,max(sal) from emp group by deptno,job;
找出每个部门的最高薪资,要求显示薪资大于2900的数据
第一步:找出每个部门的最高薪资
? select max(sal),deptno from emp group by deptno;
第二步:找出薪资大于2900
? select max(sal),deptno from emp group by deptno having max(sal) > 2900; // 这种方式效率较低
? select max(sal),deptno from emp where sal >2900 group by deptno; // 效率较高,建议能使用where过滤的,先用where
十八、总结一个完整的DQL语句怎么写
select 5
? .......
from 1
? .......
where 2
? .......
group by 3
? .....
having 4
? ......
order by 6
? .....
十九、关于查询结果采集的去重
? select distinct job from emp; // distinct关键字去除重复记录。
? select ename,distinct job from emp; //这句是错误的
注意:distinct只能出现在所有字段的最前面。