1、一个表包括行和列
行:被称为数据/记录(data)
列:被称为字段(column)
学号(int) 姓名(varchar) 年龄(int)
18180100041 闫宁 21
18180100042 王龙 20
每一个字段应该包括哪些属性?
字段名、数据类型、相关的约束
2、学习MySQL主要是学习通用的SQL语句,SQL语句包括增删改查,SQL语句应该怎么分类?
DQL(数据查询语言):查询语句,凡是select语句都是DQL。
DML(数据操作语言):insert、delete、updata,对表中的数据进行增删改
DDL(数据定义语言):create、drop、alter,对表结构的增删改
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)
DCL(数据控制语言):grant授权,revoke撤销权限等
3、导入数据
第一步,DOS窗口:mysql -uroot -p
输入密码登陆数据库
第二步,查看有哪些数据库
show databases; //这个属于MySQL的命令,而不是SQL
+——————————+
| Database |
+——————————+
| informationschema |
| mysql |
| performance_schema |
| sys |
+——————————+
第三步,创建属于我们的数据库
create database mydatabase; //这个不是SQL语句,属于MySQL的命令
第四步,使用mydatabase数据
use mydatabase; //仍然是MySQL命令
第五步,查看当前使用的库有哪些表
+———————————+
| Tables_in_mydatabase |
+———————————+
| dept | //部门表
| emp | //员工表
| salgrade | //工资等级表
+———————————+
show tables;
第六步,初始化数据
mysql> source 路径
4、什么是sql脚本呢?
当一个文件的扩展名是.sql,并且该文件中编写了大量的SQL语句,我们称这样的文件为sql脚本
sql脚本中的数据量太大时,无法打开,可以使用source命令完成初始化
5、删除数据库
drop database mydatabase;
6、查看表的结构
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 | | //最高
+———-+————-+———+——-+————-+———-+
7、查看表中的数据
mysql> select from dept;
+————+——————+—————+
| DEPTNO | DNAME | LOC |
+————+——————+—————+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+————+——————+—————+
mysql> 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 |
+———-+————+—————-+———+——————+————-+————-+————+
mysql> select from salgrade;
+———-+———-+———-+
| GRADE | LOSAL | HISAL |
+———-+———-+———-+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
+———-+———-+———-+
8、常用命令
mysql> select database(); //查看当前使用的数据库
+——————+
| database() |
+——————+
| mydatabase |
+——————+
mysql> select version(); //查看当前mysql版本号
+—————-+
| version() |
+—————-+
| 8.0.17 |
+—————-+
\c //结束一条语句
9、查看创建表的语句
show create table emp;
10、简单的查询语句(DQL)
语法格式:
select 字段名1,字段名2,字段名3,…from 表名; //注意,SQL语句不区分大小写(但实际表中的大小写是有意义的,oracle里必须区分)
mysql> select ename,sal12 from emp; //从员工表中查询员工姓名和年薪
+————+—————+
| ename | sal12 |
+————+—————+
| SMITH | 9600.00 |
| ALLEN | 19200.00 |
| WARD | 15000.00 |
| JONES | 35700.00 |
| MARTIN | 15000.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
+————+—————+
mysql> select ename,sal12 as yearsal from emp; //给查询结果的列重命名
+————+—————+
| ename | yearsal |
+————+—————+
| SMITH | 9600.00 |
| ALLEN | 19200.00 |
| WARD | 15000.00 |
| JONES | 35700.00 |
| MARTIN | 15000.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
+————+—————+
mysql> select ename,sal12 yearsal from emp; //as可以省略,yearsal也可以换为中文,如果不能使用,则应该给中文加上’’(单引号)
+————+—————+
| ename | yearsal |
+————+—————+
| SMITH | 9600.00 |
| ALLEN | 19200.00 |
| WARD | 15000.00 |
| JONES | 35700.00 |
| MARTIN | 15000.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
+————+—————+
mysql> 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 |
+———-+————+—————-+———+——————+————-+————-+————+
11、条件查询
语法格式:
select
字段,字段…
from
表名
where
条件;
执行顺序,先from,再while,最后select
查询工资等于5000的员工
mysql> select ename from emp where sal = 5000;
+———-+
| ename |
+———-+
| KING |
+———-+
查询smith的工资
mysql> select sal from emp where ename = ‘smith’;
+————+
| sal |
+————+
| 800.00 |
+————+
查询工资大于等于3000的员工名
mysql> select ename from emp where sal >= 3000;
+———-+
| ename |
+———-+
| SCOTT |
| KING |
| FORD |
+———-+
查询工资不等于3000的员工
mysql> select ename from emp where sal <> 3000;
+————+
| ename |
+————+
| SMITH |
| ALLEN |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| KING |
| TURNER |
| ADAMS |
| JAMES |
| MILLER |
+————+
查询工资在【1000,3000】的员工
mysql> select ename from emp where sal >= 1000 and sal <= 3000;
+————+
| ename |
+————+
| ALLEN |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| SCOTT |
| TURNER |
| ADAMS |
| FORD |
| MILLER |
+————+
同上,并注意between … and… 是闭区间
mysql> select ename from emp where sal between 1000 and 3000;
+————+
| ename |
+————+
| ALLEN |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| SCOTT |
| TURNER |
| ADAMS |
| FORD |
| MILLER |
+————+
查询名字在【a,c)之间的
mysql> select ename from emp where ename between ‘a’ and ‘c’;
+———-+
| ename |
+———-+
| ALLEN |
| BLAKE |
| ADAMS |
+———-+
查询津贴为null的员工名,注意null是无值,而不是等于0
mysql> select ename from emp where comm is null;
+————+
| ename |
+————+
| SMITH |
| JONES |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| ADAMS |
| JAMES |
| FORD |
| MILLER |
+————+
找出工作岗位是manager或者salesman的员工
mysql> select ename from emp where job = ‘manager’ or job = ‘salesman’;
+————+
| ename |
+————+
| ALLEN |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| TURNER |
+————+
找出薪金大于1000 并且 部门编号是20或30 的员工,注意运算符的优先级
mysql> select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno =30);
+————+————-+————+
| ename | sal | deptno |
+————+————-+————+
| ALLEN | 1600.00 | 30 |
| WARD | 1250.00 | 30 |
| JONES | 2975.00 | 20 |
| MARTIN | 1250.00 | 30 |
| BLAKE | 2850.00 | 30 |
| SCOTT | 3000.00 | 20 |
| TURNER | 1500.00 | 30 |
| ADAMS | 1100.00 | 20 |
| FORD | 3000.00 | 20 |
+————+————-+————+
in等同于or:找出工作岗位是manager或salesman的员工
mysql> select ename,job from emp where job in(‘manager’,’salesman’);
+————+—————+
| ename | job |
+————+—————+
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| JONES | MANAGER |
| MARTIN | SALESMAN |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| TURNER | SALESMAN |
+————+—————+
not in 同理
模糊查询like ?
找出名字当中带有o的?(在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是)
%代表任意多个字符,代表任意一个字符。
select ename from emp where ename like ‘%o%’;
+———-+
| ename |
+———-+
| JONES |
| SCOTT |
| FORD |
+———-+
找出名字当中第二个字母是a的
mysql> select ename from emp where ename like ‘_a%’;
+————+
| ename |
+————+
| WARD |
| MARTIN |
| JAMES |
+————+
找出名字中有下划线的
mysql> select ename from emp where ename like ‘%\%’;
12、按照工资升序排列,找出员工名和薪资
mysql> select ename,sal from emp order by sal; //默认牌序是升序
+————+————-+
| ename | sal |
+————+————-+
| SMITH | 800.00 |
| JAMES | 950.00 |
| ADAMS | 1100.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| KING | 5000.00 |
+————+————-+
mysql> select ename,sal from emp order by sal desc; //降序排列是desc,升序排列是asc;
+————+————-+
| ename | sal |
+————+————-+
| KING | 5000.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| SMITH | 800.00 |
+————+————-+
mysql> select ename,sal from emp order by sal desc,ename asc; //首要按工资降序,其次按名字升序排列
+————+————-+
| ename | sal |
+————+————-+
| KING | 5000.00 |
| FORD | 3000.00 |
| SCOTT | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| MARTIN | 1250.00 |
| WARD | 1250.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| SMITH | 800.00 |
+————+————-+
mysql> select ename,sal from emp order by 2 desc; //根据选后的第二列排列(降序)(不建议如此做)
+————+————-+
| ename | sal |
+————+————-+
| KING | 5000.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| SMITH | 800.00 |
+————+————-+
mysql> select ename,sal from emp where job = ‘salesman’ order by sal desc; //找出工作岗位为salesman,并且按工资降序排列
+————+————-+
| ename | sal |
+————+————-+
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
+————+————-+
13、分组函数(也叫多行处理函数,输入多行,输出一行)
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
//所有的分组函数都是对某一组数据进行操作的
//分组函数自动忽略null
//分组函数不可直接出现在where语句当中,因为group by是在where结束之后才会执行的。
mysql> select sum(sal) from emp; //找出工资总和。最高,最低,平均工资同理
+—————+
| sum(sal) |
+—————+
| 29025.00 |
+—————+
mysql> select count(ename) from emp; //找出总人数
+———————+
| count(ename) |
+———————+
| 14 |
+———————+
mysql> select count(),sum(sal),max(sal),avg(sal) from emp; //分组函数可以同时使用
+—————+—————+—————+——————-+
| count() | sum(sal) | max(sal) | avg(sal) |
+—————+—————+—————+——————-+
| 14 | 29025.00 | 5000.00 | 2073.214286 |
+—————+—————+—————+——————-+
14、单行处理函数
什么是单行处理函数?
输入一行,输出一行
计算每个员工的年薪
ifnull(可能为null的数据,被当做什么处理) //这是一个ifnull函数
mysql> select ename, (sal+ifnull(comm,0))*12 as yearsal from emp;
+————+—————+
| ename | yearsal |
+————+—————+
| SMITH | 9600.00 |
| ALLEN | 22800.00 |
| WARD | 21000.00 |
| JONES | 35700.00 |
| MARTIN | 31800.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
+————+—————+
15、group by 和 having
group by:按照某个字段或者某些字段进行分组 //当一条sql语句没有group by的话,整张表的数据会自成一组
having:having是对分组之后的数据进行再次过滤
语句 执行顺序
select 5
…
from 1
…
where 2
…
group by 3
…
having 4
…
order by 6
…
案例:找出每个工作岗位的最高薪资。
//分组函数一般都会和group by 连用,这也是为什么它被称为 分组函数 的原因,并且任何一个分组函数都在group by 结束之后执行。
首先尝试嵌套查询
mysql> select ename,sal from emp where sal > (select avg(sal) from emp); //查询高于平均工资的员工
+———-+————-+
| ename | sal |
+———-+————-+
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+———-+————-+
mysql> select job,max(sal) from emp group by job; //案例
+—————-+—————+
| job | max(sal) |
+—————-+—————+
| CLERK | 1300.00 |
| SALESMAN | 1600.00 |
| MANAGER | 2975.00 |
| ANALYST | 3000.00 |
| PRESIDENT | 5000.00 |
+—————-+—————+
mysql> select ename,max(sal),job from emp group by job; //这样是错误的,当有group by时,select之后只能跟分组的字段和分组函数
+———-+—————+—————-+
| ename | max(sal) | job |
+———-+—————+—————-+
| SMITH | 1300.00 | CLERK |
| ALLEN | 1600.00 | SALESMAN |
| JONES | 2975.00 | MANAGER |
| SCOTT | 3000.00 | ANALYST |
| KING | 5000.00 | PRESIDENT |
+———-+—————+—————-+
mysql> select job,avg(sal) from emp group by job; //每个工作岗位的平均薪资
+—————-+——————-+
| job | avg(sal) |
+—————-+——————-+
| CLERK | 1037.500000 |
| SALESMAN | 1400.000000 |
| MANAGER | 2758.333333 |
| ANALYST | 3000.000000 |
| PRESIDENT | 5000.000000 |
+—————-+——————-+
mysql> select max(sal),deptno from emp group by deptno having max(sal) >2900; //找出每个部门的最高薪资,显示薪资大于2900的数据(也可以使用where)
+—————+————+
| max(sal) | deptno |
+—————+————+
| 3000.00 | 20 |
| 5000.00 | 10 |
+—————+————+
mysql> select avg(sal),deptno from emp group by deptno having avg(sal)>2000; //找出每个部门的平均薪资,显示其中大于2000的数据(无法使用where)
+——————-+————+
| avg(sal) | deptno |
+——————-+————+
| 2175.000000 | 20 |
| 2916.666667 | 10 |
+——————-+————+
16、完整的DQL语句顺序:
select 5
…
from 1
…
where 2
…
group by 3
…
having 4
…
order by 6
…