MySQL三部曲之初见端倪

Posted Richard_i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL三部曲之初见端倪相关的知识,希望对你有一定的参考价值。

  1. 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

  2. 什么是表?

  • table是数据库当中的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。

  • 一个表包括行和列
    行:被称为数据(data)
    列:被称为字段(column)

学号(int)姓名(varchar)年龄(int)
001张三18
002李四24
003王五16
  • 每一个字段应该包括哪些属性?
  • 字段名、数据类型、相关的约束
  1. 学习MySQL主要还是学习通用的SQL语句,SQL语句包括增删改查,SQL语句是如何分类的?

    • DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
    • DML(数据操作语言):insert , delete , update 对表当中的数据进行增删改。
    • DDL(数据定义语言):create,drop ,alter 对表结构的增删改。
    • TCL(事务控制语言):commit提交事务,rollback回滚事务、(TCL中的T是Transaction)
    • DCL(数据控制语言):grant授权、revoke撤销权限等。
  2. 导入数据(后期练习时使用)

    • 第一步:登录MySQL数据库 root

    • 第二步:查看有哪些数据库

      • show database(这个不是SQL语句,属于MySQL的命令)

        mysql> show databases;
        +--------------------+
        | Database           |
        +--------------------+
        | information_schema |
        | mysql              |
        | performance_schema |
        | test               |
        +--------------------+
        
    • 第三步:创建属于自己的数据库

      • create database bjpowernode; (这个不是SQL语句,属于MySQL的命令)
    • 第四步:使用***bjpowernode***数据库

      • use bjpowernode;(这个不是SQL语句,属于MySQL的命令)
    • 第五步:查看数据库中有哪些表?

      • show tables;(这个不是SQL语句,属于MySQL的命令)
    • 第六步:初始化数据

      • mysql> source ( | source ) —> 文件路径
      • mysql> source
      • 注意:数据初始化完成之后,有三张表
      mysql> show tables;
      +-----------------------+
      | Tables_in_bjpowernode |
      +-----------------------+
      | dept                  |
      | emp                   |
      | salgrade              |
      +-----------------------+
      
  3. bjpowernode.sql,这个文件以sql结尾,这样的文件被称为"sql脚本"。什么是sql脚本?

    • 当一个文件的扩展名是".sql",并且该文件中编写了大量的sql语句,这样的文件叫SQL脚本。
    • 注意:直接使用source命令可以执行SQL脚本。
    • SQL脚本中的数据量太大时无法打开,请使用source命令完成初始化。
  4. 删除数据库:drop database bjpowernode;

  5. 查看表结构

    mysql> show tables;
    +-----------------------+
    | Tables_in_bjpowernode |
    +-----------------------+
    | dept                  |	(部门表)
    | emp                   |	(员工表)
    | salgrade              |	(工资登记表)
    +-----------------------+
    
    mysql> desc dept;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | DEPTNO | int(2)      | NO   | PRI | NULL    |       |	部门编号
    | DNAME  | varchar(14) | YES  |     | NULL    |       |	部门名称
    | LOC    | varchar(13) | YES  |     | NULL    |       |	部门位置
    +--------+-------------+------+-----+---------+-------+
    
    mysql> 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    |       |	部门编号
    +----------+-------------+------+-----+---------+-------+
    
    mysql> desc salgrade;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | GRADE | int(11) | YES  |     | NULL    |       |	等级
    | LOSAL | int(11) | YES  |     | NULL    |       |	最低薪资
    | HISAL | int(11) | YES  |     | NULL    |       |	最高薪资
    +-------+---------+------+-----+---------+-------+
    
  6. 表中的数据

    mysql> select * from dept;
    mysql> select * from emp;
    mysql> select * from salgrade;
    
  7. MySQL常用命令?

    select database();	查看当前正在使用的数据库
    select version();	查看mysql的版本号
    \\c	命令,结束一条语句
    exit	命令,退出MySQL
    
  8. 查看创建表的语句

   mysql> show create table emp;
   +-------+-------------------------------
   | Table | Create Table
   +-------+-------------------------------
   | emp   | CREATE TABLE `emp` (
     `EMPNO` int(4) NOT NULL,
     `ENAME` varchar(10) DEFAULT NULL,
     `JOB` varchar(9) DEFAULT NULL,
     `MGR` int(4) DEFAULT NULL,
     `HIREDATE` date DEFAULT NULL,
     `SAL` double(7,2) DEFAULT NULL,
     `COMM` double(7,2) DEFAULT NULL,
     `DEPTNO` int(2) DEFAULT NULL,
     PRIMARY KEY (`EMPNO`)
   ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
   +-------+-------------------------------

简单的查询(DQL数据查询)

  • 语法格式:select 字段名1, 字段名2, 字段名3,… form 表名;
  • 任何一条SQL语句以";"结尾。
  • SQL与极具不区分大小写
  • 注意:标准SQL语句中要求字符串使用单引号括起来,虽然MySQL支持双引号,尽量别用。
   查询员工的年薪
   mysql> select ename,empno,sal * 12 from emp; (字段可以参与数学运算)
   mysql> select ename,empno,sal * 12 as yearsal from emp;(给查询结果的列重命名 ‘as’ 关键字)
   mysql> select ename,empno,sal * 12 yearsal from emp;(‘as’ 关键字可以省略)
   mysql> select ename,empno,sal * 12 as '年薪' from emp; (别名中有中文,单引号括起来)
   mysql> select * from emp; (查询全部字段)
   实际开发中不建议使用 * ,效率较低。

条件查询

  • 语法格式:select 字段,字段… from 表名 where 条件;执行顺序: from --> where --> select
  • between…and…在使用时必须左小右大
  • between…and…也可以使用在字符串方面
    mysql> select ename,sal from emp where sal = 3000; (查询薪资等于3000的员工)
    mysql> select ename,sal from emp where sal <> 3000; (不等于3000,也可以用 != )
    mysql> select ename,sal from emp where ename = 'smith'; (查询员工姓名为Smith的工资)
    mysql> select ename,sal from emp where sal >= 1500 and sal <= 5000;(1500~5000薪资的员工)
    mysql> select ename,sal from emp where sal between 100 and 3100;(between...and...是闭区间)
    between..and..在使用时必须左小右大
    mysql> select ename from emp where ename between 'A' and 'D'; (左闭右开)

is null (is not null) , and , or , in,not in , like

  • 在数据库当中null不是一个值,代表什么也没有,为空。
  • 空不是一个值,不能用等号衡量。
  • 必须使用 is null 或者 is not null
  • 注意:当运算符的优先级不确定的时候加小括号。
mysql> select ename,sal,comm from emp where comm is null or comm = 0;(找出无津贴员工)
    mysql> select ename,sal,comm from emp where comm is not null;(找出有津贴员工)

(找出工作岗位是salasman和manager的员工)
mysql> select ename,job,hiredate from emp where job='salesman' or job ='manager';
(and和or联合起来使用:找出薪资大于1000的并且部门编号是20或者30部门的员工)
mysql> select ename,sal,deptno from emp where sal > 1000 and deptno = 20 or deptno =30; //错误
mysql> select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno =30); // 正确
  • in 等同于 or,找出工作岗位是salasman和manager的员工(in后面的值不是区间,是具体的值)
mysql> select ename,job,hiredate from emp where job='salesman' or job ='manager';
mysql> select ename,sal,job from emp where job in ('salesman','manager');
mysql> select ename,sal from emp where sal in (800, 3000); //in后面的值不是区间,是具体的值
  • not in : 不在这几个值当中
mysql> select ename, sal from emp where sal not in(800,5000); (查询不是800,5000的值)
  • 模糊查询 like

    • 在模糊查询中,必须掌握的两个特殊的符号,一个是 % ,一个是 _
    • % 代表任意多个字符, _ 代表任意一个字符。
    mysql> select ename from emp where ename like '%A%'; (找出名字中含有A字母的)
    mysql> select ename from emp where ename like '_A%'; (找出第二个字母是A的)
    (找出名字中有下划线的,可以使用反斜杠转义,表示一个普通的下划线)
    mysql> select ename from emp where	 ename like '%\\_%';
    (找出最后一个字母是S的名字)
    mysql> select ename from emp where ename like '%S';
    

排序(升序、降序)Order by

  • —> 默认是升序

  • 指定升降序,asc 表示升序,desc 表示降序

    mysql> select ename , sal from emp order by sal; (默认升序)
    
    mysql> select ename ,sal from emp order by sal desc; (指定降序)
    
    mysql> select ename ,sal from emp order by sal asc; (指定升序)
    
    (按照工资的降序排列,当工资相同的时候再按照名字的升序排列)
    mysql> select ename , sal from emp order by sal desc , ename asc;
    (找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列)
    mysql> select ename,sal,job from emp
        -> where job = 'salesman'
        -> order by sal desc;
        
        执行顺序  from---> where ---> select ---> order by...
    
    • 注意:越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候,才会启用后面的字段。

分组函数

  • count(计数),sum(求和), avg(平均值), max(最大值), min(最小值)
    • 所有的分组函数都是对“某一组”数据进行操作的
    • 分组函数又称:多行处理函数
    • 多行处理函数特点:输入多行,最终输出的结果是一行。
    • 分组函数有一个特点:自动忽略null。
    • 在数据库中只要有null进行了运算,最后结果一定是null,所有数据库都是这样规定的
    • 分组函数不可直接使用在where子句当中
    • 分组函数可以组合使用
mysql> select sum(sal) from emp;  (找出工资总和)
mysql> select sum(sal) from emp;   (平均工资)
...
(找出工资高于平均工资的员工)
mysql> select ename,sal from emp where sal > avg(sal);
ERROR 1111 (HY000): Invalid use of group function
错误:无效的使用的了分组函数
mysql> select ename, sal  from emp where sal > (select avg(sal) from emp);
	因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。why?
	怎么解释?
		因为 group by 是在 where 执行之后才会执行的(分组函数用不了,是因为还没有分组)
		而分组函数必须要 group by 分组才能执行
		select...	5.选择数据
		from...		1.先从表取出数据
		where...	2.条件过滤,哪个数据
		group by...	3.数据分组
		having...	4.数据过滤
		order by... 6.排序输出
count (*) 和 count(具体字段)有什么区别?
count(*) : 不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm) : 表示统计comm字段中不为null的数据总数量。

分组函数可以组合使用
mysql> select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
+----------+----------+-------------+----------+----------+
| count(*) | sum(sal) | avg(sal)    | max(sal) | min(sal) |
+----------+----------+-------------+----------+----------+
|       14 | 29025.00 | 2073.214286 |  5000.00 |   800.00 |
+----------+----------+-------------+----------+----------+
1 row in set (0.00 sec)

单行处理函数

  • 输入一行,输出一行
  • ifnull(comm,0) —> 如果comm为null,则使其等同于0。
  • ifnull(可能为null的数据,被当做什么处理) 空处理函数
计算每个员工的年薪?
mysql> select ename, (sal+comm) * 12 yearsal from emp;  // comm为null值时,员工薪资为null,不正确
使用ifnull函数;
mysql> select ename, (sal + ifnull(comm,0)) * 12 yearsal from emp;

Group by || Having

  • group by :按照某个字段或者某些字段进行分组;

    • 注意:分组函数一般都会和 group by 联合使用,这也是为什么被称为分组函数的原因。
    • 任何一个分组函数(count,sum,avg,max,min)都是在group by 语句执行结束后才执行的。
    • 当一条SQL语句没有group by的话,整张表的数据会自成一组。
    • 记住:当一条语句中有 group by 的话,select 后面只能跟分组函数和参与分组的字段。
    • 找出每个工作岗位的最高薪资;
    mysql> select job,max(sal) from emp group by job;	//找出每个工作岗位的最高薪资;
    +-----------+----------+
    | job       | max(sal) |
    +-----------+----------+
    | ANALYST   |  3000.00 |
    | CLERK     |  1300.00 |
    | MANAGER   |  2975.00 |
    | PRESIDENT |  5000.00 |
    | SALESMAN  |  1600.00 |
    +-----------+----------+
    
    mysql> select job,max(sal) from emp group by job;
    以上在mysql当中,有查询结果,但结果没有意义,在oracle数据库中会报错,语法错误。
    oracle的语法规则比MySQL语法规则严谨。
    记住:当一条语句中有 group by 的话,select 后面只能跟分组函数和参与分组的字段。
    
    找出每个工作岗位的平均薪资。
    mysql> select job, avg(sal) from emp group by job;
    
    多个字段能不能联合起来一块分组?
    案例:找出每个不同部门不同工作岗位的最高薪资;
    mysql> select deptno,job,max(sal) from emp group by deptno,job;
    
    
    • having:对分组之后的数据进行再次过滤;

      • 找出每个部门的最高薪资,要求显示薪资大于2900的数据。
        • sql语句一般多层逻辑建议拆分思考编写
    mysql> select deptno, max(sal) from emp group by deptno;(找出每个部门的最高薪资)
    +--------+----------+
    | deptno | max(sal) |
    +--------+----------+
    |     10 |  5000.00 |
    |     20 |  3000.00 |
    |     30 |  2850.00 |
    +--------+----------+
    (找出每个部门的最高薪资,要求显示薪资大于2900的数据)
    //这种方式效率低,因前面算出的最大值,后面又删掉
    select deptno, max(sal) from emp group by deptno having max(sal) > 2900; 
    +--------+----------+
    | deptno | max(sal) |
    +--------+----------+
    |     10 |  5000.00 |
    |     20 |  3000.00 |
    +--------+----------+
    // 效率较高, where语句,可以从一开始就过滤掉2900以下的
    mysql> select deptno,max(sal) from emp where sal > 2900 group by deptno;
    +--------+----------+
    | deptno | max(sal) |
    +--------+----------+
    |     10 |  5000.00 |
    |     20 |  3000.00 |
    +--------+----------+
    2 rows in set (0.00 sec)
    
    (找出每个部门的平均薪资,要求显示薪资大于2900的数据)

去重 distinct

  • distinct 只能出现在所有字段的最前面
mysql> select distinct deptno,job from emp;      (联合去重多个字段)
mysql> select count(distinct job),job from emp; (统计所有岗位数量,去重)

以上是关于MySQL三部曲之初见端倪的主要内容,如果未能解决你的问题,请参考以下文章

java学习笔记之mysql2

mysql中一个字段升序,另一个字段降序

Mysql——实现按字段部分升序,部分降序的方法

MYSQL 按升序和降序排序

MySQL ORDER BY 两个子句(降序和升序)

MYSQL复杂查询(条件不定查询+按降序/升序分页显示)