MySQL基础篇

MySQL基础篇(1)

  1. SQL、DB、DBMS分别是什么?他们之间的关系?
     SQL:
       结构化查询语言,是一门标准通用的语言。标准的SQL适用于所有的数据库产品。
       SQL属于高级语言,只要能看懂英语单词的,写出来的SQL语句,可以读懂什么意思。
       SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行SQL(SQL语句的编译由DBMS完成)。
      DB:
       DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)DB
      DBMS:
       DataBase Management System (数据库管理系统,常见的有:MySQL、Oracle、DB2、Sybase、SQL Server…)。
       
       DBMS负责执行SQL语句,通过执行SQL语句来操作DB当中的数据。
       DBMS–(执行)–>SQL–(操作)–>DB

  2. 什么是表?
       表: table
       表: table是数据库的基本组成单元,所有的数据都是以表格的形式组织,目的是可读性强。
       一个表包括行和列:
        行:被称为数据/记录(data)
        列:被称为字段(column)
       每一个字段应该包括哪些属性?
         字段名、数据类型、相关的约束。

  3. 学习MySQL主要还是学习通用的SQL语句,那么SQL语句是如何分类的?
     DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
     DML(数据操作语言): insert、delete、update,对表中数据进行增删改。
     DDL(数据定义语言): create、drop、alter,对表结构的增改删。
     TCL(事物控制语言): commit(提交事务)、rollback(回滚事务。(TCL中的T指的是Transaction)。
     DCL(数据控制语言): grant(授权)、revoke(撤销权限)等。

  4. 导入数据(使用演示数据)
     第一步: 登录MySQL数据库管理系统
          win+R键输入cmd启动dos命令窗口:
              mysql -uroot -p密码
     第二步: 查看有哪些数据库
         show databases;(这个不是SQL语句,属于MySQL命令。)
     第三步: 创建属于我们自己的数据库
         create database 数据库名;(这个不是SQL语句,属于MySQL命令。)
     第四步: 使用bjpowernode数据库
         use 数据库名;(这个不是SQL语句,属于MySQL命令。)
     第五步: 查看当前数据库中有哪些表;
         show tables;(这个不是SQL语句,属于MySQL命令。)
     第六步: 初始化数据
         source+空格+sql文件位置
         例:mysql> source C:\Users\Hasee\Desktop\杜老师最新MySQL\resources\bjpowernode.sql

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

  6. 删除数据库:
     drop database 数据库名;

  7. 查看表结构:
     desc 表名;

  8. 常用命令?
     查看创建表的语句: show create table 表名;
     查看当前使用的是哪个数据库: select database();
     查看MySQL的版本号: select version();
     结束一条语句: \c
     退出MySQL: exit

  9. 简单的查询语句(DQL)
     语法格式:
      select 字段名1,字段名2,字段名3… from 表名;
     提示:
      1. 任何一条SQL语句都以;结尾。
      2. SQL语句不区分大小写。
     其中字段可以直接参与数学运算。
      如查询员工的年薪?select ename,sal*12 from emp; 
     如何给查询结果的列重命名?
      使用as,但是as可以省略。
      如查询员工的年薪?select ename,sal\*12 as yearsal from emp; 
      如查询员工的年薪?select ename,sal\*12 yearsal from emp; 
     如何使用中文别名?
      中文别名必须使用英文单引号括起来。
       select ename,sal*12 as 年薪 from emp;//错误
       select ename,sal*12 as '年薪' from emp;
      注意:标准SQL语句中要求字符串使用单引号括起来。虽然MySQL支持双引号,尽量别用。
     查询所有字段?
       select * from emp;//实际开发中不建议使用 * ,效率较低。

  10. 条件查询。
       语法格式:
         select
           字段1,字段2…
         from
            表名
          where
            条件;
       执行顺序:
        先from,再where,最后select
        
       查询工资等于5000的员工姓名?
         select ename from emp where sal=5000;
       查询SMITH的工资?
         select sal from emp where ename = ‘smith;//字符串使用单引号括起来。
       找出工资高于3000的员工?
         select ename,sal from emp where sal > 3000;
         select ename,sal from emp where sal >= 3000;
         select ename,sal from emp where sal < 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?
         select ename ,sal from emp where sal>=1100 and sal >=3000;
         select ename ,sal from emp where sal between 1100 and 3000;//between … and …使用在数字上时是闭区间[1100,3000]。
         select ename, sal from emp where sal between 3000 and 1100; //使用错误,查询不到任何数据。
         between … and … 在使用时必须左小右大。
         between … and … 除了可以使用在数字方面之外,还可以使用在字符串方面。使用在字符串方面时左闭右开。
         select ename from emp where ename between 'A' and 'C';
         select ename from emp where ename between 'A' and 'D';
       找出哪些人的津贴为NULL?
          在数据库当中NULL并不是一个值,代表什么也没有,为空。
          空并不是一个值,不能使用等号衡量。
          必须使用is null 或者 is not null。
          如:select ename,sal,comm from emp where comm is null;
          select ename,sal,comm from emp where comm = null; // 错误
       找出哪些人的津贴不为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;
       找出工作岗位为MANAGER和SALESMAN的员工?
         select ename,job from emp where job='manager' or job='salesman';
       and和or联合使用:找出薪资大于1000并且部门编号是20或30部门的员工?
         select ename,sal,deptno from emp where sal >1000 and deptno = 20 or deptno = 30; //错误
         select ename,sal,deptno from emp where sal >1000 and (deptno = 20 or deptno =30);//正确
         注意:当运算符的优先级不确定时加小括号。
       in相当于or:找出工作岗位是MANAGER和SALESMAN的员工?
         select ename,job from emp where job = 'salesman' or job = 'manager';
         select ename,job from emp where job in ('salesman','manager');
         select ename,job from emp where sal in (800,5000);
         注:in后面的值不是区间,是具体的值
         select ename,job from emp where sal in (800,950,500);
       not in :不在这几个值当中。
         select ename,job from emp where sal not in (800,5000);
       模糊查询like?
         在模糊查询中,必须掌握的两个特殊符号,一个是%,一个是_。其中%代表任意多个字符,_代表任意1个字符。
         还有转义字符\的使用。
         也可以使用not like模糊查询不含XXX的数据。
         MySQL基础篇_第1张图片

  11. 排序(升序、降序)
      注意:默认是升序。如何指定升序或者降序呢?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 enam,job,sal from emp where job = 'salesman' order by sal desc;
      执行顺序:
        select
           字段      3
        from
           表名      1
        where
           条件      2
        order by
           …       4
        order by是最后执行的。

  12. 分组函数?
       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个。
       分组函数还有另外一个名字:多行处理函数。
       多行处理函数的特点:输入多行,最终输出的结果是一行。
       
       分组函数自动忽略NULL;即假设使用分组函数来处理还有NULL的一列数据是,会自动忽略含有NULL的数据。
         select count(comm) from emp;
         select sum(comm) from emp;
         select sum(comm) from emp where comm is not null; //不需要额外添加这个过滤条件。sum函数自动忽略NULL。
       找出工资高于平均工资的员工?
         select avg(sal) from emp;//平均工资
         select ename,sal from emp where sal> avg(sal) ;error
         思考以上的错误信息:无效的使用了分组函数?
           原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where字句中。
           如何解释?
             因为group by是在where执行之后才会执行的。就算没有使用group by则默认将所有数据看作一组。
             select
               …   5
             from
               …   1
             where
               …  2
             group by
               …  3
             having
               …  4
             order by
               …  6
        
        count(*)和count(某个具体字段名),他们有什么区别?
          count(*):不是统计某个字段中数据的个数,而是统计总记录的条数。
          count(某个具体的字段): 表示统计xxx字段中不为NULL的数据总数量。
        分组函数也可以组合使用?
          select count(\*),sum(sal),avg(sal),max(sal),min(sal) from emp;
        找出工资高于平均工资的员工?
          select ename,sal from emp where sal >(select avg(sal) from emp);

  13. 单行处理函数
       什么是单行处理函数?
         输入一行,输出一行。
         
       计算每个员工的年薪?
         select ename,(sal+comm)*12 as’年薪’ from emp;
         重点:所有的数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
         使用ifnull函数:
         select ename,(sal+ifnull(comm,0))*12 as '年薪‘ from emp;
       ifnull()空处理函数?
         ifnull(可能为NULL的数据,被当作什么处理):属于单行处理函数。

  14. group by 和 having
       
       group by : 按照某个字段或者某些字段进行分组。
       having : having是对分组之后的数据进行再次过滤。
       找出每个工作岗位的最高薪资?
         select max(sal),job from emp group by job;
       注意:分组函数一般都会和group by 联合使用,这也是为什么它被称为分组函数的原因。
       并且任何一个分组函数(count max min avg sum) 都是在group by 语句执行结束后才会执行。
       当一条SQL语句没有group by的话,整个表的数据会自成一组。
       select ename,max(sal),job from emp group by job;
       以上在MySQL当中,查询结果是有的,但是结果没有意义,在Oracle数据库中会报错,语法错误。
       Oracle的语法规则比MySQL语法规则严谨。
       记住一个规则:当一条语句中有group by 的话,select 后面只能跟分组函数和参与分组的字段。
       每个工作岗位的平均薪资?
         select job,avg(sal) from emp group by job;
       多个字段能不能联合起来一块分组?
         找出每个部门不同岗位的最高薪资?
           select deptno,job, max(sal) from emp group by deptno,job;
           将deptno和job联合起来看作一个字段当作分组的标准。
         找出每个部门的最高薪资,要求显示薪资大于2900的数据?
           select max(sal),deptno from emp where sal >2900 group by deptno; //效率较高,建议能够使用where过滤的尽量使用where.
           select max(sal),deptno from emp group by deptno having max(sal) >2900; // 效率较低
         找出每个部门的平均薪资,要求显示薪资大于2000的数据?
           select deptno,avg(sal) from emp group by deptno having avg(sal) >2000;
           where 后面不能使用分组函数:
             select deptno,avg(sal) from emp where avg(sal) > 2000 group by deptno; error
             这种情况下只能使用having过滤.

  15. 总结一个完整的DQL语句怎么写?
       select
         …  5
       from
         …  1
       where
         …  2
       group by
         …  3
       having
         …  4
       order by
         …  6

注:全文根据动力节点杜聚宾老师的资料整理的个人笔记,交流学习之需,切勿与利益挂钩,再次感谢杜老师的详细讲解。
MySQL基础篇_第2张图片

你可能感兴趣的:(MySQL基础,mysql,数据库)