MySQL三部曲之初见端倪
Posted Richard_i
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL三部曲之初见端倪相关的知识,希望对你有一定的参考价值。
-
sql、DB、DBMS分别是什么,他们之间的关系?
-
DB:DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
-
DBMS:DataBase Management System(数据库管理系统,常见的有:mysql Oracle DB2 Sybase SqlServer…)
-
SQL:结构化查询语言,是一门标准通用的语言,标准的sql适合于所有数据库产品。
SQL属于高级语言,只要能看懂英语单词,写出来的sql语句,可以读懂什么意思。
SQL语句在执行的时候,实际上内部也会先进行编译,然后再试下SQL(SQL语句的编译由DBMS完成) -
DBMS负责执行SQL语句,通过执行SQL语句来操作DB当中的数据。
-
DBMS–>(执行)-> SQl(操作)-> DB
-
-
什么是表?
-
table是数据库当中的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。
-
一个表包括行和列
行:被称为数据(data)
列:被称为字段(column)
学号(int) | 姓名(varchar) | 年龄(int) |
---|---|---|
001 | 张三 | 18 |
002 | 李四 | 24 |
003 | 王五 | 16 |
- 每一个字段应该包括哪些属性?
- 字段名、数据类型、相关的约束
-
学习MySQL主要还是学习通用的SQL语句,SQL语句包括增删改查,SQL语句是如何分类的?
- DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
- DML(数据操作语言):insert , delete , update 对表当中的数据进行增删改。
- DDL(数据定义语言):create,drop ,alter 对表结构的增删改。
- TCL(事务控制语言):commit提交事务,rollback回滚事务、(TCL中的T是Transaction)
- DCL(数据控制语言):grant授权、revoke撤销权限等。
-
导入数据(后期练习时使用)
-
第一步:登录MySQL数据库 root
-
第二步:查看有哪些数据库
-
show database(这个不是SQL语句,属于MySQL的命令)
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+
-
-
第三步:创建属于自己的数据库
- create database bjpowernode; (这个不是SQL语句,属于MySQL的命令)
-
第四步:使用***bjpowernode***数据库
- use bjpowernode;(这个不是SQL语句,属于MySQL的命令)
-
第五步:查看数据库中有哪些表?
- show tables;(这个不是SQL语句,属于MySQL的命令)
-
第六步:初始化数据
- mysql> source ( | source ) —> 文件路径
- mysql> source
- 注意:数据初始化完成之后,有三张表
mysql> show tables; +-----------------------+ | Tables_in_bjpowernode | +-----------------------+ | dept | | emp | | salgrade | +-----------------------+
-
-
bjpowernode.sql,这个文件以sql结尾,这样的文件被称为"sql脚本"。什么是sql脚本?
- 当一个文件的扩展名是".sql",并且该文件中编写了大量的sql语句,这样的文件叫SQL脚本。
- 注意:直接使用source命令可以执行SQL脚本。
- SQL脚本中的数据量太大时无法打开,请使用source命令完成初始化。
-
删除数据库:drop database bjpowernode;
-
查看表结构
mysql> show tables; +-----------------------+ | Tables_in_bjpowernode | +-----------------------+ | dept | (部门表) | emp | (员工表) | salgrade | (工资登记表) +-----------------------+
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 | | 最高薪资 +-------+---------+------+-----+---------+-------+
-
表中的数据
mysql> select * from dept; mysql> select * from emp; mysql> select * from salgrade;
-
MySQL常用命令?
select database(); 查看当前正在使用的数据库 select version(); 查看mysql的版本号 \\c 命令,结束一条语句 exit 命令,退出MySQL
-
查看创建表的语句
mysql> show create table emp;
+-------+-------------------------------
| Table | Create Table
+-------+-------------------------------
| emp | CREATE TABLE `emp` (
`EMPNO` int(4) NOT NULL,
`ENAME` varchar(10) DEFAULT NULL,
`JOB` varchar(9) DEFAULT NULL,
`MGR` int(4) DEFAULT NULL,
`HIREDATE` date DEFAULT NULL,
`SAL` double(7,2) DEFAULT NULL,
`COMM` double(7,2) DEFAULT NULL,
`DEPTNO` int(2) DEFAULT NULL,
PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-------------------------------
简单的查询(DQL数据查询)
- 语法格式:select 字段名1, 字段名2, 字段名3,… form 表名;
- 任何一条SQL语句以";"结尾。
- SQL与极具不区分大小写
- 注意:标准SQL语句中要求字符串使用单引号括起来,虽然MySQL支持双引号,尽量别用。
查询员工的年薪
mysql> select ename,empno,sal * 12 from emp; (字段可以参与数学运算)
mysql> select ename,empno,sal * 12 as yearsal from emp;(给查询结果的列重命名 ‘as’ 关键字)
mysql> select ename,empno,sal * 12 yearsal from emp;(‘as’ 关键字可以省略)
mysql> select ename,empno,sal * 12 as '年薪' from emp; (别名中有中文,单引号括起来)
mysql> select * from emp; (查询全部字段)
实际开发中不建议使用 * ,效率较低。
条件查询
- 语法格式:select 字段,字段… from 表名 where 条件;执行顺序: from --> where --> select
- between…and…在使用时必须左小右大
- between…and…也可以使用在字符串方面
mysql> select ename,sal from emp where sal = 3000; (查询薪资等于3000的员工)
mysql> select ename,sal from emp where sal <> 3000; (不等于3000,也可以用 != )
mysql> select ename,sal from emp where ename = 'smith'; (查询员工姓名为Smith的工资)
mysql> select ename,sal from emp where sal >= 1500 and sal <= 5000;(1500~5000薪资的员工)
mysql> select ename,sal from emp where sal between 100 and 3100;(between...and...是闭区间)
between..and..在使用时必须左小右大
mysql> select ename from emp where ename between 'A' and 'D'; (左闭右开)
is null (is not null) , and , or , in,not in , like
- 在数据库当中null不是一个值,代表什么也没有,为空。
- 空不是一个值,不能用等号衡量。
- 必须使用 is null 或者 is not null
- 注意:当运算符的优先级不确定的时候加小括号。
mysql> select ename,sal,comm from emp where comm is null or comm = 0;(找出无津贴员工)
mysql> select ename,sal,comm from emp where comm is not null;(找出有津贴员工)
(找出工作岗位是salasman和manager的员工)
mysql> select ename,job,hiredate from emp where job='salesman' or job ='manager';
(and和or联合起来使用:找出薪资大于1000的并且部门编号是20或者30部门的员工)
mysql> select ename,sal,deptno from emp where sal > 1000 and deptno = 20 or deptno =30; //错误
mysql> select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno =30); // 正确
- in 等同于 or,找出工作岗位是salasman和manager的员工(in后面的值不是区间,是具体的值)
mysql> select ename,job,hiredate from emp where job='salesman' or job ='manager';
mysql> select ename,sal,job from emp where job in ('salesman','manager');
mysql> select ename,sal from emp where sal in (800, 3000); //in后面的值不是区间,是具体的值
- not in : 不在这几个值当中
mysql> select ename, sal from emp where sal not in(800,5000); (查询不是800,5000的值)
-
模糊查询 like
- 在模糊查询中,必须掌握的两个特殊的符号,一个是 % ,一个是 _
- % 代表任意多个字符, _ 代表任意一个字符。
mysql> select ename from emp where ename like '%A%'; (找出名字中含有A字母的) mysql> select ename from emp where ename like '_A%'; (找出第二个字母是A的) (找出名字中有下划线的,可以使用反斜杠转义,表示一个普通的下划线) mysql> select ename from emp where ename like '%\\_%'; (找出最后一个字母是S的名字) mysql> select ename from emp where ename like '%S';
排序(升序、降序)Order by
-
—> 默认是升序
-
指定升降序,asc 表示升序,desc 表示降序
mysql> select ename , sal from emp order by sal; (默认升序) mysql> select ename ,sal from emp order by sal desc; (指定降序) mysql> select ename ,sal from emp order by sal asc; (指定升序) (按照工资的降序排列,当工资相同的时候再按照名字的升序排列) 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; 执行顺序 from---> where ---> select ---> order by...
- 注意:越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候,才会启用后面的字段。
分组函数
- count(计数),sum(求和), avg(平均值), max(最大值), min(最小值)
- 所有的分组函数都是对“某一组”数据进行操作的
- 分组函数又称:多行处理函数
- 多行处理函数特点:输入多行,最终输出的结果是一行。
- 分组函数有一个特点:自动忽略null。
- 在数据库中只要有null进行了运算,最后结果一定是null,所有数据库都是这样规定的
- 分组函数不可直接使用在where子句当中
- 分组函数可以组合使用
mysql> select sum(sal) from emp; (找出工资总和)
mysql> select sum(sal) 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);
因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。why?
怎么解释?
因为 group by 是在 where 执行之后才会执行的(分组函数用不了,是因为还没有分组)
而分组函数必须要 group by 分组才能执行
select... 5.选择数据
from... 1.先从表取出数据
where... 2.条件过滤,哪个数据
group by... 3.数据分组
having... 4.数据过滤
order by... 6.排序输出
count (*) 和 count(具体字段)有什么区别?
count(*) : 不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm) : 表示统计comm字段中不为null的数据总数量。
分组函数可以组合使用
mysql> select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
+----------+----------+-------------+----------+----------+
| count(*) | sum(sal) | avg(sal) | max(sal) | min(sal) |
+----------+----------+-------------+----------+----------+
| 14 | 29025.00 | 2073.214286 | 5000.00 | 800.00 |
+----------+----------+-------------+----------+----------+
1 row in set (0.00 sec)
单行处理函数
- 输入一行,输出一行
- ifnull(comm,0) —> 如果comm为null,则使其等同于0。
- ifnull(可能为null的数据,被当做什么处理) 空处理函数
计算每个员工的年薪?
mysql> select ename, (sal+comm) * 12 yearsal from emp; // comm为null值时,员工薪资为null,不正确
使用ifnull函数;
mysql> select ename, (sal + ifnull(comm,0)) * 12 yearsal from emp;
Group by || Having
-
group by :按照某个字段或者某些字段进行分组;
- 注意:分组函数一般都会和 group by 联合使用,这也是为什么被称为分组函数的原因。
- 任何一个分组函数(count,sum,avg,max,min)都是在group by 语句执行结束后才执行的。
- 当一条SQL语句没有group by的话,整张表的数据会自成一组。
- 记住:当一条语句中有 group by 的话,select 后面只能跟分组函数和参与分组的字段。
- 找出每个工作岗位的最高薪资;
mysql> select job,max(sal) from emp group by job; //找出每个工作岗位的最高薪资; +-----------+----------+ | job | max(sal) | +-----------+----------+ | ANALYST | 3000.00 | | CLERK | 1300.00 | | MANAGER | 2975.00 | | PRESIDENT | 5000.00 | | SALESMAN | 1600.00 | +-----------+----------+ mysql> select job,max(sal) from emp group by job; 以上在mysql当中,有查询结果,但结果没有意义,在oracle数据库中会报错,语法错误。 oracle的语法规则比MySQL语法规则严谨。 记住:当一条语句中有 group by 的话,select 后面只能跟分组函数和参与分组的字段。 找出每个工作岗位的平均薪资。 mysql> select job, avg(sal) from emp group by job; 多个字段能不能联合起来一块分组? 案例:找出每个不同部门不同工作岗位的最高薪资; mysql> select deptno,job,max(sal) from emp group by deptno,job;
-
having:对分组之后的数据进行再次过滤;
- 找出每个部门的最高薪资,要求显示薪资大于2900的数据。
- sql语句一般多层逻辑建议拆分思考编写
- 找出每个部门的最高薪资,要求显示薪资大于2900的数据。
mysql> select deptno, max(sal) from emp group by deptno;(找出每个部门的最高薪资)
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000.00 |
| 20 | 3000.00 |
| 30 | 2850.00 |
+--------+----------+
(找出每个部门的最高薪资,要求显示薪资大于2900的数据)
//这种方式效率低,因前面算出的最大值,后面又删掉
select deptno, max(sal) from emp group by deptno having max(sal) > 2900;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000.00 |
| 20 | 3000.00 |
+--------+----------+
// 效率较高, where语句,可以从一开始就过滤掉2900以下的
mysql> select deptno,max(sal) from emp where sal > 2900 group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000.00 |
| 20 | 3000.00 |
+--------+----------+
2 rows in set (0.00 sec)
(找出每个部门的平均薪资,要求显示薪资大于2900的数据)
去重 distinct
- distinct 只能出现在所有字段的最前面
mysql> select distinct deptno,job from emp; (联合去重多个字段)
mysql> select count(distinct job),job from emp; (统计所有岗位数量,去重)
以上是关于MySQL三部曲之初见端倪的主要内容,如果未能解决你的问题,请参考以下文章