Mysql笔记01

数据库概述

1.什么是数据库?什么是数据库管理系统?什么是SQL?

数据库:英文单词DataBase,简称DB,按照一定合适存储数据的一些文件组合.

顾名思义:存储数据额的仓库,实际上就是一堆文件,这些文件中存储了特定格式的数据.

数据库管理系统:

数据库管理系统是专门管理数据库中的数据的,数据库管理系统可以对数据库当中的数据进行增删改查

常见的数据库管理系统:

MySQL,Oracle,MS SqlSqever,DB2,sybasse

SQL:结构化查询语言

我们需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作

SQL是一套标准,在数据库管理系统中是通用的

三者之间的关系

DBMS–>执行–>SQL–操作–>DB

安装

  • 先安装,选精简版

  • 第二步:需要对MySQL进行实例配置

  • 注意:一路下一步就行了

  • 需要注意的事项

    端口号:端口号port是任何一个软件/应用都会有的,端口号是应用的唯一代表.端口号通常和IP地址在一起,IP地址用来定位计算机的,端口号port是用来定位计算机上的某个服务/某个应用的!

    在同一台计算机上,端口号不能重复,具有唯一性

    mysql数据库启动的时候,这个服务战友的默认端口号是3306

字符编码方式

设置mysql数据库的字符编码方式为UTF-8

一定要注意:先选中第三个,再选中utf-8

服务名称?

默认是MySQL,不需要变动

选择配置环境变量Path:

mysql超级管理员用户名不能改,一定是:root

你需要设置mysql数据库的超级管理员密码

我的:123456

设置密码的同事.可以激活root账户的远程访问

激活:表述root账号可以在外地登录

卸载

双击安装包进行卸载–>remove

第二部:删除目录c盘–>ProgramData–>删除Mysql

第三部:把c盘–>Program Files(x86) 下面的mysql干掉

最后删除环境变量

启动mysql

使用bin目录下的mysql.exe命令来链接mysql服务器

Mysql常用命令

命令不区分大小写,不见分号不执行(或者\c可以终止)

  1. 登录 mysql -uroot -p123456

  2. 退出mysql:exit

  3. 查看数据库中有哪些数据库: show databases; 注意:以分号结尾

    ±-------------------+
    | Database |
    ±-------------------+
    | information_schema |
    | mysql |
    | performance_schema |
    | test |
    ±-------------------+

    默认自带的这几个

  4. 怎么选择使用某个数据库?

    mysql>use test;

    Database changed

    表示正在使用一个名字 叫做test的数据库

  5. 怎样创建数据库?

    mysql>create database bjpowernode;

  6. 查看某个数据库下有哪些表

    show tables;

  7. 导入数据:mysql> source E:\bjpowernode.sql;

  8. 怎么查看表中的数据?

    select *from 表名;

  9. 不看表中的数据,只看表的结构,有一个命令:

    desc 表名(describe缩写为desc)

  10. 查看mySql的版本号: select version();

  11. 查看当前使用的哪个数据库select database();

数据库中最基本的单元

是:table(表)

以表格的形似表示数据,因为表比较直观

任何一张表都有行和列:

  • 行(row):被称为数据/记录
  • 列(column):被称为字段

了解一下:每一个字段都有:字段名、数据类型、约束等属性

字段名可以理解,是一个普通的名字,见名知意

数据类型:字符串,数字,日期等,后期讲

约束:约束也有很多,其中一个叫做唯一性约束.

​ 这种约束添加之后,该字段中的数据不能重复.

关于SQL语句的分类

sql语句有很多,最好进行分门别类,这样更容易记忆

分为

  • DQL:数据查询语言(凡是带有select关键字的都是查询语句)

    select…

  • DML:数据操作语言(凡是对表当中的数据进行增删改的都是DML)

    insert 增

    delete 删

    update 改

  • DDL:数据定义语言(凡是带有create、drop、alterd的都是DDL)

    DDL主要操作的是表的结构,不是表中的数据

    create:新建

    drop:删除

    alter:修改

    这个增删改与DMl不同,这个主要是对表结构进行cao’zuo

  • TCL:是事务控制语言

    包括:

    事务提交:commit;

    事务回滚:rollback;

  • DCL:是数据控制语言

    例如:授权grant、撤销权限revoke…

关于导入的几张表

±----------------------+
| Tables_in_bjpowernode |
±----------------------+
| dept |
| emp |
| salgrade |
±----------------------+

dept是部门表

emp是员工表

salgrade是工资等级表

怎么查看表中的数据?

select *from 表名;

emp

+-------+--------+-----------+------+------------+---------+---------+--------+

| EMPNO | ENAME | JOB  | MGR  | HIREDATE | SAL  | COMM | DEPTNO |
| ----- | ----- | ---- | ---- | -------- | ---- | ---- | ------ |
|       |       |      |      |          |      |      |        |

+-------+--------+-----------+------+------------+---------+---------+--------+

| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20   |
| ---- | ----- | ----- | ---- | ---------- | ------ | ---- | ---- |
|      |       |       |      |            |        |      |      |

| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30   |
| ---- | ----- | -------- | ---- | ---------- | ------- | ------ | ---- |
|      |       |          |      |            |         |        |      |

| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30   |
| ---- | ---- | -------- | ---- | ---------- | ------- | ------ | ---- |
|      |      |          |      |            |         |        |      |

| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20   |
| ---- | ----- | ------- | ---- | ---------- | ------- | ---- | ---- |
|      |       |         |      |            |         |      |      |

| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30   |
| ---- | ------ | -------- | ---- | ---------- | ------- | ------- | ---- |
|      |        |          |      |            |         |         |      |

| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30   |
| ---- | ----- | ------- | ---- | ---------- | ------- | ---- | ---- |
|      |       |         |      |            |         |      |      |

| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10   |
| ---- | ----- | ------- | ---- | ---------- | ------- | ---- | ---- |
|      |       |         |      |            |         |      |      |

| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20   |
| ---- | ----- | ------- | ---- | ---------- | ------- | ---- | ---- |
|      |       |         |      |            |         |      |      |

| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10   |
| ---- | ---- | --------- | ---- | ---------- | ------- | ---- | ---- |
|      |      |           |      |            |         |      |      |

| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30   |
| ---- | ------ | -------- | ---- | ---------- | ------- | ---- | ---- |
|      |        |          |      |            |         |      |      |

| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20   |
| ---- | ----- | ----- | ---- | ---------- | ------- | ---- | ---- |
|      |       |       |      |            |         |      |      |

| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30   |
| ---- | ----- | ----- | ---- | ---------- | ------ | ---- | ---- |
|      |       |       |      |            |        |      |      |

| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20   |
| ---- | ---- | ------- | ---- | ---------- | ------- | ---- | ---- |
|      |      |         |      |            |         |      |      |

| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10   |
| ---- | ------ | ----- | ---- | ---------- | ------- | ---- | ---- |
|      |        |       |      |            |         |      |      |

+-------+--------+-----------+------+------------+---------+---------+--------+

dept

±-------±-----------±---------+
| DEPTNO | DNAME | LOC |
±-------±-----------±---------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
±-------±-----------±---------+

salgrade

±------±------±------+
| GRADE | LOSAL | HISAL |
±------±------±------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
±------±------±------+

DQL语句

  1. 简单查询:

    • 查询一个字段:select 字段名 from 表名 ;

      select deptno from dept;

      其中要注意:

      select和from都是关键字,字段名和表名都是标识符

      强调:对于sql语句来说,是通用的,所以SQL语句都以";"结尾.

      另外SQl语句不区分大小写,都行

    • 查询两个或者多个字段:

      使用逗号隔开 : select deptno,dname from dept;

    • 查询所有字段:

      • 一:可以把每个字段都写上

      • 二:可以使用* select * from dept;

        这种方式的缺点:1.效率较低2.可读性差

        实际开发中不建议

    • 给查询的列起别名

      select deptno,dname as deptname from dept;

      使用as关键字起别名

      注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname

      记住:select语句是永远不会进行修改操作的,因为他只负责检索

      as关键字可以省略,假设起别名的时候,别名中有空格,怎么办?

      使用单引括起来 ‘别名’

      注意:在所有的数据库标准中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中使用不了.

      另外**:字段可以使用数学表达式**

  2. 条件查询

    • 什么是调价查询?不是将表中所有数据查询出来.是查询出来符合条件的 语法格式:select 字段1,字段2,字段3,… from 表名 where 条件;

    • 都有哪些条件?

      • = 等于
        查询薪资等于800的员工姓名和编号?
        select empno,ename from emp where sal = 800;
        查询SMITH的编号和薪资?
        select empno,sal from emp where ename = ‘SMITH’; //字符串使用单引号

      • <>或!= 不等于
        查询薪资不等于800的员工姓名和编号?
        select empno,ename from emp where sal != 800;
        select empno,ename from emp where sal <> 800; // 小于号和大于号组成的不等号

      • < 小于
        查询薪资小于2000的员工姓名和编号?
        mysql> select empno,ename,sal from emp where sal < 2000;

      • <= 小于等于
        查询薪资小于等于3000的员工姓名和编号?
        select empno,ename,sal from emp where sal <= 3000;

      • 大于>
        查询薪资大于3000的员工姓名和编号?
        select empno,ename,sal from emp where sal > 3000;

      • 大于等于>=

        查询薪资大于等于3000的员工姓名和编号?
        select empno,ename,sal from emp where sal >= 3000;

        between … and …. 两个值之间, 等同于 >= and <=

        查询薪资在2450和3000之间的员工信息?包括2450和3000

        • 第一种方式**:>= and <=** (and是并且的意思

          select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;

        • 第二种方式:between … and …
          select
          empno,ename,sal
          from
          emp
          where
          sal between 2450 and 3000;
          注意:
          使用between and的时候,必须遵循左小右大。
          between and是闭区间,包括两端的值。

      ​ is null 为 null(is not null 不为空)

      • 查询哪些员工的津贴/补助为null?
        mysql> select empno,ename,sal,comm from emp where comm = null; 是不可以的

      ​ mysql> select empno,ename,sal,comm from emp where comm is null;

      注意:在数据库中null不能使用等号进行衡量,需要使用is null,因为数据库中的null代表什么也没有,他不是一个值,所以不能使用等号衡量

      • 查询哪些员工的津贴/补助不为null?

        select empno,ename,sal,comm from emp where comm is not null;

      • and并且

        查询工作岗位是MANAGER并且工资大于2500的员工信息?
        select
        empno,ename,job,sal
        from
        emp
        where
        job = ‘MANAGER’ and sal > 2500;

      • or 或者
        查询工作岗位是MANAGER和SALESMAN的员工?
        select empno,ename,job from emp where job = ‘MANAGER’;
        select empno,ename,job from emp where job = ‘SALESMAN’;

        ​ select
        ​ empno,ename,job
        ​ from
        ​ emp
        ​ where
        ​ job = ‘MANAGER’ or job = ‘SALESMAN’;

      • and和or同时出现的话,有优先级问题吗?
        查询工资大于2500,并且部门编号为10或20部门的员工?
        select
        *
        from
        emp
        where
        sal > 2500 and deptno = 10 or deptno = 20;
        分析以上语句的问题?
        and优先级比or高.
        以上语句会先执行and,然后执行or。
        以上这个语句表示什么含义?
        找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。

        ​ select
        ​ *
        ​ from
        ​ emp
        ​ where
        ​ sal > 2500 and (deptno = 10 or deptno = 20);
        and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”
        以后在开发中,如果不确定优先级,就加小括号就行了。

      • in 包含,相当于多个 or (not in 不在这个范围中)
        查询工作岗位是MANAGER和SALESMAN的员工?
        select empno,ename,job from emp where job = ‘MANAGER’ or job = ‘SALESMAN’;
        select empno,ename,job from emp where job in(‘MANAGER’, ‘SALESMAN’);

        注意:in不是一个区间。in后面跟的是具体的值。

        查询薪资是800和5000的员工信息?
        select ename,sal from emp where sal = 800 or sal = 5000;
        select ename,sal from emp where sal in(800, 5000); //这个不是表示800到5000都找出来,表示800和500

      • // not in 表示不在这几个值当中的数据。
        select ename,sal from emp where sal not in(800, 5000, 3000);

         	not可以取非,主要用在is或in中
         	
         	is null
         	
         	is not null
         	
         	in 
         	
         	not in
        
      • like:称为模糊查询,支持%或下划线匹配

        %匹配任意多个字符

        下划线:任意一个字符

        找出名字中含有O的?
        mysql> select ename from emp where ename like ‘%O%’;

        找出名字以T结尾的?
        select ename from emp where ename like ‘%T’;

        找出名字以K开始的?
        select ename from emp where ename like ‘K%’;

        找出第二个字每是A的?
        select ename from emp where ename like ‘_A%’;

        找出第三个字母是R的?
        select ename from emp where ename like ‘__R%’;

排序

  1. 查询所有员工薪资,排序

    select ename,sal from emp order by sal; 默认是升序

    怎么降序?

    select ename,sal from emp order by sal desc;

    指定升序

    select ename,sal from emp order by sal asc;

  2. 可以两个字段排序吗?或者说按照多个字段排序

    查询你员工名字和薪资,要求按照薪资升序,如果薪资一样的话,再按照名字升序排列.

    select enam,sal from emp order by sal asc,ename asc;//sal在前,为主导

  3. 根据字段的位置可以排序(了解)

    select ename,sal from emp order by 2;//2表示第二列,第二列是sal

    按照查询结果中的第二列sal排序

    • 综合案例:找出工资在1250到3000之间的员工信息,要求按照薪资降序排列

    select

    ​ ename,sal

    from

    ​ emp

    where

    ​ sal between 1250 and 3000

    order by

    ​ sal desc;

    关键字顺序不能变

    执行顺序:

    • 第一步 :from
    • 第二部:where
    • 第三部:select
    • 第四部:order by(排序总是在最后执行)

数据处理函数

  1. 数据处理函数又被称为单行处理函数

  2. 单行处理函数的特点:一个输入对应一个输出

    和单行处理函数相对的是,多行处理函数.(多个输入,对应一个输出)

  3. 多行处理函数常见的有哪些?

  • lower 转换小写

    mysql> select lower(ename) asz ename from emp;

  • upper 转换大写

    mysql> select * from t_student;

  • substr取子串 (substr(被截取的字符串,起始下标,截取的长度))

    select substr(ename, 1, 1) as ename from emp;

    注意:起始下标从1开始,没有0

    找出员工名字第一个字母为A的员工的信息?

    • 第一种方式;

      select ename from emp where ename like ‘A%’;

    • 第二种方式;

      select ename from emp where sunstr(ename,1,1) = ‘A’;

  • length 取长度

    select length (ename) as enamelength from emp; //as用于取别名

  • trim去空格

    select *from emp where ename =trim (’ king’);

  • round()四舍五入

    select后面可以跟某个表字段名(可以等同看做变量名),也可以跟字面量,字面值(看做数据)

    select round(1236.567,1) as result from emp;

    1表示保留一位小数,如果是-1的话,则会是1240,向前保留end

  • rand()生成随机数

    select round(rund()*100) from emp ;

  • ifnull 可以将null转换为一个具体的值

    ifnull,是一个空处理函数,是专门处理空的

    在所有的数据库当中,只要有null参与的数学运算,最终结果就是NULL.

    select ename

    注意:NULL只要参与运算,每种结果一定是NULL,为了避免这个现象,需要使用ifnull函,ifnull函数用法:ifnull(数据,被当做是哪个值)

    如果数据为null的是时候,把这个数据结构当做哪个值.

    select ename, sal + comm as salcomm from emp;

  • case…when…then…when…then…else…end

    当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是 SALESMAN的时候,工资上调50%.(注意:不修改数据库,只是将查询结果显示为工资上调)

    select ename,job,sal as oldsal (case job when ‘MANAGER’ then sal *1.1 when ‘SALESMAN’ then sal * 1.5 else sal end ) as newsal from emp;

分组函数(多行处理函数)

多行处理函数的特点:输入多行,最终输出一行

五个:

  • count 计数
  • sum 求和
  • avg 平均值
  • max 最大值
  • min最小值

注意:分组函数在使用的时候必须先进行分组,然后才能使用.如果你没有对数据进行分组,整张表默认为一组

找出最高工资:

select max(sal) from emp;

计算工资和:

select sum(sal) from emp;

计算平均工资

select avg(sal) from emp; 十四个工资加起来,然后除以14

计算个数:

select count(ename) from emp;

分组函数使用过程中有哪些需要注意?

  1. 分组函数自动忽略null,不需要对null提前处理

  2. 分组函数中count(*)和count(具体字段)有什么区别?

    count(具体字段):表示统计该字段下所有不为null的元素的总数

    count(*):统计表中的总行数(只要有一行数据,则++),因为每行数据不可能每个都为null

  3. 分组函数不能直接使用在where语句中

    找出比最低工资搞得员工信息

    select ename,sal from emp where sal> min (sal);

    表面上没有问题

    ???

    说完分组查询(group by)之后就明白了

  4. 所有的分组函数可以组合起来一起用

    select sum(sal),min(sal) from emp;

分组查询(☆☆☆)

  1. 什么是分组查询? \

    在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组数据进行操作,这个时候我们需要使用分组查询,怎么进行分组查询呢?

    select

    ​ …

    from

    ​ …

    group by

    ​ …

    计算每个部门的工资和?

    计算每个工作岗位的平均薪资?

    找出每个工作岗位的最高查询?

  2. 将之前的关键字全部组合在一起,来看一下他们的执行顺序

    select

    ​ …

    from

    ​ …

    where

    ​ …

    group by

    ​ …

    order by

    ​ …

    以上的关键字顺序不能颠倒,需要记忆

    执行顺序:

    1.from

    2.where

    3.group by

    4.select

    5.order by

    为什么分组函数不能直接使用在where后面?

    select ename,sal from emp where sal >min(sal);//报错

    因为分组函数在使用的时候必须先分组之后才能使用.

    where执行的时候,还没有分组,所以where后面不能出现分组函数

    select sum(sal) from emp;
    这个没有分组,为啥sum()函数可以用呢?
    因为select在group by之后执行。

    找出每个岗位的工资和:

    实现思路:按照工作岗位进行分组,然后对工资 求和

    select job,sum(sal) from emp group by job;

    以上这个语句的执行顺序:先从emp表中查询数据.根据job字段进行分组,然后对每一组的数据进行sum(sal)

    如果要添加

    以上语句在mysql中可以执行,但是毫无意义。
    以上语句在oracle中执行报错。
    oracle的语法比mysql的语法严格。(mysql的语法相对来说松散一些!)

    重点结论:
    在一条select语句当中,如果有group by语句的话,
    select后面只能跟:参加分组的字段,以及分组函数。
    其它的一律不能跟。

  3. 找出每个部门们,不同工作岗位的最高薪资

    select job,max(sal) from emp group by job;

    技巧:两个字段联合成一个字段看(两个字段联合分组)

    select deptno,job,max(sal) from emp group by deptno,job;

  4. 使用having字句可以对分完组之后的数据进一步过滤,having不能单独使用,不能代替where字句,having必须和group by联合使用

    找出每个部门的最高薪资,要求显示 最高薪资大于3000

    • 第一步:找出每个部门最高薪资
      按照部门编号分组,求每一组最大值。
      select deptno,max(sal) from emp group by deptno;
    • 第二步:要求显示最高薪资大于3000
      select
      deptno,max(sal)
      from
      emp
      group by
      deptno
      having
      max(sal) > 3000;

    select deptno,max(sal) from emp group by deptno having max(sal) > 3000;

    思考:以上执行语句效率是否很低?

    比较低,实际上可以这样考虑:先将大于3000的的都找出来,然后在分组

    select deptno,max(sal) from emp where sal > 3000 group by deptno;

    优化策略:where 和 having,优先使用where ,where 没办法的,在使用having

    where没办法 的例子:

    找出每个部门的平均薪资:要求显示平均薪资高于的 2500的

    • 第一步:找出每个部门平均薪资
      select deptno,avg(sal) from emp group by deptno;
    • 第二步:要求显示平均薪资高于2500的
      select
      deptno,avg(sal)
      from
      emp
      group by
      deptno
      having
      avg(sal) > 2500;

大总结:

select

​ …

from

​ …

where

​ …

group by

​ …

having

​ …

order by

​ …

以上关键字只能按照这个顺序来,不能颠倒.

执行顺序?

from

where

group by

having

select

order by

从某张表中查询数据,先经过where条件筛选出有价值的数据.对这些有价值的数据进行分组.分组之后可以使用having继续筛选

select查询出来,最后排序输出!

找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER之外,要求按照平均薪资降序排.

select job,avg(sal) as avgsal from emp where job <> ‘MANAGER’ group by job having avg(sal) >1500 order by avgsal desc;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值