一、Mysql数据库

一、Mysql数据库

1、sql、DB、DBMS分别是什么,他们之间的关系?
  • DB: DataBase(数据库,数据库实际上在硬盘上以文件形式存在)
  • DBMS:DataBase Management System(数据库管理系统,常见的有:Mysql、Oracle、DB2)
  • SQL:结构化查询语言,一门标准化通用语言,标准的sql适合用于所有的数据库产品,SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行SQL(SQL语句的编译由DBMS完成)
  • DBMS负责执行SQL语句,通过执行SQL语句来操作DB中的数据
  • DBMS --(执行)–> SQL --(操作)–> DB
2、SQL语句的分类
  1. DQL(数据库查询语言):查询语句,凡是select语句都是DQL
  2. DML(数据库操作语言):insert、delete、update,对表中的数据进行增删改
  3. DDL(数据定义语句):create、drop、alter,对表结构的增删改
  4. TCL(事务控制语句):commint提交事务,rollback回滚事务,(T是Transaction)
  5. DCL(数据控制语句):grant授权、revoke撤销权限等
3、文件以sql结尾,这样的文件被称为“sql脚本”。什么是sql脚本呢?

​ 当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句,我们称这样的文件为sql脚本
​ 注意:直接使用source命令可以执行sql脚本
​ sql脚本中的数据量太大的时候,无法打开,请使用source命令完成初始化

4、MySql常用命令
  1. show databases; 查看有哪些数据库
  2. use database_name; 使用哪个数据库
  3. select database(); 查看当前正在使用的数据库
  4. \c 退出编写sql语句
  5. exit ; 退出Mysql数据库
  6. show tables; 查看当前数据库中的表
  7. show tables from database_name; 查看其他库中的表
  8. desc table_names; 查看表结构
5、什么是表?
  1. table是数据库的基本组成单元,所有的数据都以表格的形式组成,目的是可读性强
  2. 一个表包含行和列:
    1. 行:被称为数据/记录(data)
    2. 列:被称为字段(column)
  3. 每一个字段都应该包含 字段名、数据类型、相关的约束
6、简单查询
  • 所有的数据都是mnyuansql数据库中

    • desc dept;
      +--------+-------------+------+-----+---------+-------+
      | Field  | Type        | Null | Key | Default | Extra |
      +--------+-------------+------+-----+---------+-------+
      | DEPTNO | int(2)      | NO   | PRI | NULL    |       |
      | DNAME  | varchar(14) | YES  |     | NULL    |       |
      | LOC    | varchar(13) | YES  |     | NULL    |       |
      +--------+-------------+------+-----+---------+-------+
      
    • desc emp;
      +----------+-------------+------+-----+---------+-------+
      | Field    | Type        | Null | Key | Default | Extra |
      +----------+-------------+------+-----+---------+-------+
      | EMPNO    | int(4)      | NO   | PRI | NULL    |       |
      | ENAME    | varchar(10) | YES  |     | NULL    |       |
      | JOB      | varchar(9)  | YES  |     | NULL    |       |
      | MGR      | int(4)      | YES  |     | NULL    |       |
      | HIREDATE | date        | YES  |     | NULL    |       |
      | SAL      | double(7,2) | YES  |     | NULL    |       |
      | COMM     | double(7,2) | YES  |     | NULL    |       |
      | DEPTNO   | int(2)      | YES  |     | NULL    |       |
      +----------+-------------+------+-----+---------+-------+
      
    • desc salgrade;
      +-------+---------+------+-----+---------+-------+
      | Field | Type    | Null | Key | Default | Extra |
      +-------+---------+------+-----+---------+-------+
      | GRADE | int(11) | YES  |     | NULL    |       |
      | LOSAL | int(11) | YES  |     | NULL    |       |
      | HISAL | int(11) | YES  |     | NULL    |       |
      +-------+---------+------+-----+---------+-------+
      
  • 语法格式:

    select 字段1,字段2... from 表名;
    
  • 例题:

    --1.查询员工的年薪(字段可以参与数学运算)
    --注:字符串尽量使用单引号
    --as可以给字段起别名,as可以省略
    select ename,sal * 12 as 'year_sal' from emp;
    --2.查询所有字段(开发中不建议使用,效率低)
    select * from emp;
    
7、条件查询
  • 语法格式:

    select 
    	字段1,字段2...
    from 
    	表名
    where 
    	查询条件;
    
  • 执行顺序:先from再where再select

  • where支持的条件运算符:

    运算符说明
    =等于
    <>或!=不等于
    <小于
    <=小于等于
    >大于
    >=大于等于
    between … and ….两个值之间,等同于 >= and <=
    is null为null(is not null 不为空)
    and并且
    or或者
    in包含,相当于多个or(not in不在这个范围中)
    notnot可以取非,主要用在is 或in中
    likelike称为模糊查询,支持%或下划线匹配%匹配任意个字符下划线,一个下划线只匹配一个字符
  • 例题:

    --查询工资等于5000的员工姓名
    select ename from emp where sal = 5000;
    --查询SMITH的工资
    select ename,sal from emp where ename = 'SMITH';
    --找出工资高于3000的员工
    select ename,sal from emp where sal > 3000;
    --找出工资不等于3000的
    select ename,sal from emp where sal <> 3000; --或
    select ename,sal from emp where sal != 3000;
    --找出工资在1100和3000之间的员工,包括1100和3000
    --between...and...不仅可以用数字之间,也可以用在字符串之间(较少)
    select ename,sal from emp where sal >= 1100 and sal <= 3000; --或
    select ename,sal from emp where sal between 1100 and 3000;
    --找出那些人没有津贴,数据库中null代表没有值,不是为空值
    select ename,comm from emp where comm is null or comm = 0;
    --找出工作岗位是MANAGER和SALESMAN的员工
    select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN'; --或
    select ename,job from emp where job in ('MANAGER','SALESMAN');
    --找出薪资大于1000并且部门编号是20或30的员工
    select ename,sal from emp where sal > 1000 and deptno > 20 or deptno < 30;--错误的
    select ename,sal from emp where sal > 1000 and (deptno > 20 or deptno < 30);
    --找出名字中具有'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';
    
8、数据排序
  • 语法格式:

    select
    	字段1,字段2...
    from
    	表名
    where 
    	查询条件
    order by
    	排序字段;
    
  • 执行顺序:先from再where再select最后再order by

  • 例题:

    --按照工资升序,找出员工名和薪资?
    select ename,sal from emp order by sal;
    --默认是升序:asc表示升序 desc 表示降序
    --按照工资的降序排序,当工资相同时再按照名字的升序排列
    select ename,sal from emp order by sal desc,ename;
    --注意:越靠前的字段越能起到主导作用,只有当前的字段无法完成排序时,才会启用后面的字段
    --找出工作岗位是'SALESMAN'的员工,并且按照薪资的降序排序
    select ename,job,sal from emp where job = 'SALEMAN' order by sal desc;
    --证明排序order by语句是最后执行的
    select sal * 12 as salary from emp where job = 'SALESMAN' order by salary asc;
    
9、分组函数
  1. count() 计数

  2. sum() 求和

  3. avg() 平均值

  4. max 最大值

  5. min 最小值

  6. 分组函数一共5个,所有的分组函数都是对"某一组"数据进行操作,别名:多行处理函数,特点:输入多行,最终输出结果是1行,分组函数自动忽略null值

    • 例题:

      --找出最高工资
      select max(sal) from emp;
      --找出最低工资
      select min(sal) from emp;
      --计算平均工资
      select avg(sal) from emp;
      --计算工资总和
      select sum(sal) from emp;
      --找出总人数
      select count(ename) from emp; -- 或
      select count(*) from emp;
      --计算全部人员年薪,在数据库总有nul参与的运算,结果都为null
      select ename,(sal + comm) * 12 as year_sal from emp; --错误的
      select ename,(sal + ifnull(comm,0)) * 12 as year_sal from emp;
      --ifnull() 单行处理函数将可能为null的做为什么处理,单行处理函数:输入一行,输出一行
      
    • count(*) 和 count(具体的某个字段),他们之间有什么区别?

      • count(*):不是统计某个字段中数据的个数,而是统计总记录数。(和某个字段无关)
      • count(comm):表示统计comm字段中不为null的数据总数量
10、分组查询
  • 语法格式:

    select
    	字段1,字段2...
    from
    	表名
    where 
    	查询条件
    group by
    	字段名;
    
  • 执行顺序:先from再where条件再group by分组,最后再select

  • 注意:分组函数是要在group by之后执行的

  • 例题:

    --找出工资高于平均工资的员工
    select ename,sal from emp where sal > avg(sal); --错误的
    --分组函数(count max min avg sum)执行在group by语句之后,而group by 语句执行在where语句之后,
    --也就是说只有where执行完了,才能执行到group by语句,然后再到分组函数,所以报错
    --至于 select sum(sal) from emp;像这样直接使用分组函数的sql语句实际上是省略了group by语句,
    --将整张表看成一组,所以在where语句中不能使用分组函数
    select ename,sal from emp where sal > (select avg(sal) from emp);--子查询,正确的
    --找出每个工作岗位的最高薪资
    select max(sal),job from emp group by job;
    --经过分组后select后面只能出现分组函数和分组依据的字段,否则都是错误的
    select max(sal),job,ename from emp group by job;--错误的
    --仔细想想ename的条数必定比分组后的
    --多,那数据该怎么展现呢?所以该语句是错误的
    --多个字段能不能联合起来一块分组? 答案是可以的,理解的时候可以把多个字段联合起来看成一个新字段
    --找出每个部门不同工作岗位的最高薪资
    select deptno,job,max(sal) from emp group by deptno,job;
    --找出每个部门的最高薪资,要求显示薪资大于2900的数据
    select max(sal) from emp where sal > 2900 group by deptno; --或
    select max(sal) from emp group by deptno having max(sal) > 2900; --效率较低
    --找出每个部门的平均薪资,要求显示薪资大于2000的数据
    select avg(sal) from emp group by deptno having avg(sal) > 2000;
    
  • 一个完成的DQL语句应该如何编写?

    select 						5
    	字段1,字段2...
    from						1
    	表名
    where						2
    	查询条件
    group by					3
    	分组条件
    having						4
    	分组后的查询条件
    order by					6
    	排序..;
    
11、去除重复记录
  1. distinct 关键字必须出现在所有字段的最前面

  2. 使用distinct去重的时候,若后面有多个字段,是将多个字段联合后,再进行去重处理

  3. 例题:

    -- 查询有几种工作 job
    select distinct job from emp;
    -- 统计岗位的数量
    select count(distinct job) from emp;
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值