①MySQL之DQL数据查询语言一

sql脚本分享

链接: https://pan.baidu.com/s/1ckA70v0CgSFecKhAKiu1cA
提取码: 76th

1,sql、DB、DBMS分别是什么,他们之间的关系?

DB:DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS:DataBase Management System(数据库管理系统,常见的有:MySQL、Oracle、DB2、Sybase、SQLServer...)
SQL:结构化查询语言(高级语言),是一门标准的通用的语言;标准的sql适合于所有的数据库产品。
    SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)

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数据库管理系统
    本地登录$:mysql -uroot -p
    远程登录$:mysql -hIP地址 -uroot -p  
第二步:查看有哪些数据库
    mysql> show databases;(这个不是SQL语句,属于MySQL的命令)
第三步:创建属于我们自己的数据库
    mysql> create database sqltest;
第四步:使用sqltest数据库
    mysql> use sqltest;
第五步:查看当前使用的数据库中有哪些表?
    mysql> show tables;
第六步:初始化数据(source 路径)
    mysql> source /Users/a1/Desktop/Java/Simon_JavaSE/数据库/脚本文件/bjpowernode.sql

注意:看到这里如果没有sql脚本进行学习,可返回顶部[sql脚本分享]进行下载.
5,sqltest.sql这个文件以.sql结尾,这样的文件被称为“sql脚本”。当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句,我们称为这样的文件为sql脚本。注意:直接使用source命令可以执行sql脚本,sql脚本中的数量太大的时候,无法打开;请使用source命令完成初始化。

6,删除数据库:(drop database 数据库名称;)

mysql> drop database sqltest;

7,查看表结构:(dese 表名;)

mysql> desc dept;

8,表中的数据

mysql> select * from emp;

9,常用命令

查看当前使用的数据库
mysql> select database();
查看mysql版本号
mysql> select version();
终止一条语句
mysql> \c
退出mysql
mysql> exit  

10,查看创建表的语句:(show create table 表名;)

mysql> show create table emp;

11,简单的查询语句(DQL)

语法结构:
    select 字段1,字段2,字段3,... from 表名;
提示:1,任何一条sql语句都是以";"结尾。2,sql语句不区分大小写。
    查询员工年薪(字段可以参与数学预算):
        mysql> select ename , sal * 12 from emp;

    给查询结果的列重命名:
        mysql> select ename , sal * 12 as yearsal from emp;
        mysql> select ename , sal * 12 as '年薪' from emp;
注意:标准的sql语句中要求字符串使用单引号括起来。虽然mysql支持双引号,尽量别用。

12,条件查询

1,语法结构:
    select 字段1,字段2,字段3,... 
    from 表名
    where 条件;
    执行顺序:先from,然后where,最后select

2,查询SMITH的工资
    mysql> select sal from emp where ename = 'SMITH';

3,查询工资等于(大于、小于等于)3000的员工 
    mysql> select ename , sal from emp where sal = 3000;
    mysql> select ename , sal from emp where sal > 3000;
    mysql> select ename , sal from emp where sal <= 3000;

4,查询工资不等于3000的员工 
    mysql> select ename , sal from emp where sal <> 3000;
    mysql> select ename , sal from emp where sal != 3000;
5,查询工资在1100和3000之间的员工,包括1100和3000
    mysql> select ename , sal from emp where sal >= 1100 and sal <= 3000;
    mysql> select ename , sal from emp where sal between 1100 and 3000; // between...and... 是闭区间,左小右大。
    between...and... 使用的时候必须左小有大。
    between...and... 除了可以使用在数字方面之后,还可以使用在字符串方面
        mysql> select ename , sal from emp where ename  between 'a' and 'd'; // 左闭右开。

6,找出哪些人没有津贴?
    mysql> select ename ,sal,comm from emp where comm = 0 or comm is null;

    在数据库中NULL不是一个值,代表什么也没有,为空。空不是一个值,不能用等号衡量。
    必须使用 is null 或者is not null
    mysql> select ename ,sal,comm from emp where comm is null;
    mysql> select ename ,sal,comm from emp where comm is not null;

7,找出工作岗位是MANAGER和SALESMAN的员工?
    mysql> select ename ,job from emp where job = 'MANAGER' or  job = 'SALESMAN';
    
    in等同于or
    mysql> select ename ,job from emp where job in ( 'MANAGER' , 'SALESMAN');
    mysql> select ename , sal from emp where sal in (1100 , 3000); // in后面的值不是区间,是具体的值。
    
    not in:不在这个几个值当中
    mysql> select ename , sal from emp where not sal in (1100 , 1600 ,3000);

8,找出薪资大于1000并且部门编号是20或30的部门好员工(and和or联合使用)
    mysql> select ename ,sal ,DEPTNO from emp where sal > 1000 and (DEPTNO = 20 or DEPTNO = 30);
    注意:当运算符的优先级不确定的时候加小括号。

    模糊查询like: 找出名字当中含有o的?
        (在模糊查询当中,必须掌握两个特殊符号:1,'%'代表任意多个字符;2,'_'代表任意1个字符。)
        mysql> select ename from emp where ename like '%o%' ;
    找出第二个字母是A的名字?
    mysql> select ename from emp where ename like '_a%';
    找出名字中有下划线的( 斜杠具有转译作用)?
    mysql> select ename from emp where ename like '%\_%';  

13,排序order by(升序、降序)

1,按照工资升序,找出员工名和薪资
    mysql> select ename,sal from emp order by sal;
    mysql> select ename,sal from emp order by sal asc;
2,工资升序:
    mysql> select ename,sal from emp order by sal desc;

3,注意:默认是升序,asc表示升序,desc表示降序。

4,按照工资的降序排列,当工资相同的时候再按照名字的升序排列。
    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;

14,分组函数:多行处理函数(输入多行,最终输入一行)

count:计数;sum:求和;avg:平均值;max:最大值;min:最小值。
所有的分组函数都是对“某一组”数据进行操作的。
分组函数自动忽略NULL。
SQL语句语法规则:分组函数不可直接使用在where字句当中。

count(*)和count(具体的某个字段),他们有什么区别?
    count(*):不是统计某个字段中数据的个数,而是统计总记录条数。
    count(具体的某个字段):表示统计某个字段中不为NULL的数据总数量。


找出工资总和:
    mysql> select sum(sal) from emp;
找出最高、最低工资:
    mysql> select max(sal) from emp;
    mysql> select min(sal) from emp;
找出平均工资:
    mysql> select avg(sal) from emp;
找出总人数:
    mysql> select count(ename) from emp;
分组函数自动忽略NULL
    mysql> select count(comm) 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);

    分组函数不可直接使用在where字句当中。
        分组函数一般都会和group by联合使用;分组函数都是在group by语句执行结束之后才会执行。
        因为group by是在where执行之后才会执行的。

分组函数也能组合起来用:
    mysql> select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;

15,单行处理函数:输入一行,输出一行。

计算每个员工的年薪(包含津贴)
    mysql> select ename, (sal + comm) * 12 as yearsal from emp;
    重点:所有的数据库规定:只要有NULL参与的运算结果一定是NULL。
ifnull()空处理函数:ifnull(可能为NULL的数据,被当做什么处理),属于单行处理函数
    mysql> select ename, (sal + ifnull(comm,0)) * 12 as yearsal from emp;

16,group by 和 having

group by :按照某个字段或者某些字段进行分组。
having :是对分组之后的数据进行再次过滤。
分组函数一般都会和group by联合使用;分组函数都是在group by语句执行结束之后才会执行。

找出每个工作岗位的最高薪资:
    mysql> select job, max(sal) from emp group by job;
找出每个工作岗位的平均薪资:
    mysql> select job, avg(sal) from emp group by job;

多个字段联合起来一块分组
找出每个部门不同工作岗位的最高薪资。
    mysql> select DEPTNO,job, max(sal) from emp group by DEPTNO , job ;
    mysql> select DEPTNO,job, max(sal) from emp group by DEPTNO , job order by DEPTNO desc; // 按DEPTNO降序排

找出每个部门的最高薪资,显示薪资大于2900。
    mysql> select DEPTNO, max(sal) from emp group by DEPTNO having max(sal) > 2900; // 效率低
    mysql> select DEPTNO, max(sal) from emp where sal > 2900 group by DEPTNO; // 效率高 建议能使用where就使用where
找出每个部门的平均薪资,显示薪资大于2000。
    mysql> select DEPTNO, avg(sal) from emp group by DEPTNO having avg(sal) > 2000; // 效率低

17,总结一个完整的DQL语句

    select     5
        ..
    from       1
        ..
    where      2
        ..
    group by   3
        ..
    having     4
        ..
    order by   6
        ..

下篇:②MySQL之DQL数据查询语言二

你可能感兴趣的:(①MySQL之DQL数据查询语言一)