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