在数据库的增删改查语句中,最常用的是数据库的查询语言,所以本次就来详细的介绍一下数据库的查询语言
首先准备三张表 emp(员工表), dept(部门表),salgrade(工资等级表) 【正文会给到】
然后介绍一下学习的顺序:简单查询、条件查询、模糊查询、排序、聚合函数(也叫统计函数,又叫组函数)、分组、分组后的限定、分页、多表联查、子查询。

数据库查询语言的学习

一.准备学习所需要的三张表

1.将此处的SQL导入数据库,用于接下来的查询语言的学习
/*
Navicat MySQL Data Transfer

Source Server         : localhost-mysql
Source Server Version : 50709
Source Host           : localhost:3306
Source Database       : mysql1907

Target Server Type    : MYSQL
Target Server Version : 50709
File Encoding         : 65001

Date: 2019-09-04 23:31:24
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for dept
-- ----------------------------



DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `DEPTNO` int(4) NOT NULL,
  `DNAME` varchar(14) DEFAULT NULL,
  `LOC` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES ('40', 'OPERATIONS', 'BOSTON');

-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `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` float(7,2) DEFAULT NULL,
  `COMM` float(7,2) DEFAULT NULL,
  `DEPTNO` int(4) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`),
  KEY `FK_DEPTNO` (`DEPTNO`) USING BTREE,
  CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800.00', null, '20');
INSERT INTO `emp` VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600.00', '300.00', '30');
INSERT INTO `emp` VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250.00', '500.00', '30');
INSERT INTO `emp` VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975.00', null, '20');
INSERT INTO `emp` VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250.00', '1400.00', '30');
INSERT INTO `emp` VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850.00', null, '30');
INSERT INTO `emp` VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450.00', null, '10');
INSERT INTO `emp` VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000.00', null, '20');
INSERT INTO `emp` VALUES ('7839', 'KING', 'PRESIDENT', null, '1981-11-17', '5000.00', null, '20');
INSERT INTO `emp` VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500.00', '0.00', '30');
INSERT INTO `emp` VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100.00', null, '20');
INSERT INTO `emp` VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950.00', null, '30');
INSERT INTO `emp` VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000.00', null, '20');
INSERT INTO `emp` VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300.00', null, '10');

-- ----------------------------
-- Table structure for salgrade
-- ----------------------------
DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (
  `GRADE` decimal(10,0) DEFAULT NULL,
  `LOSAL` decimal(10,0) DEFAULT NULL,
  `HISAL` decimal(10,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of salgrade
-- ----------------------------
INSERT INTO `salgrade` VALUES ('1', '700', '1200');
INSERT INTO `salgrade` VALUES ('2', '1201', '1400');
INSERT INTO `salgrade` VALUES ('3', '1401', '2000');
INSERT INTO `salgrade` VALUES ('4', '2001', '3000');
INSERT INTO `salgrade` VALUES ('5', '3001', '9999');
2.导入数据库之后,如图所示

emp(员工表)

mysql 查看数据是否为中文 mysql数据查询语言_mysql 查看数据是否为中文

dept(部门表)

mysql 查看数据是否为中文 mysql数据查询语言_子查询_02

salgrade(工资等级表)

mysql 查看数据是否为中文 mysql数据查询语言_mysql 查看数据是否为中文_03

二.数据库查询语言的学习

包括简单查询、条件查询、模糊查询、排序、聚合函数(也叫统计函数,又叫组函数)、
	分组、分组后的限定、分页、多表联查、子查询
查询的概念及语法
查询:用户对于数据表或者视图最常用的操作就是查询,也叫检索。通过select语句来实现
	查询语法:
		select {colums}                   //colums为字段名
		from {table|view|other select}    //table为表名, view为视图, other select为子查询
		[where 条件]
		[group by 分组条件]
		[having 分组后的限定]
		[order by 排序]
1.简单查询
1.查询指定的列:
		语法:select 列1,列2,列3,..  from 表名

练习1.查询员工表的全部信息

select * from emp;

练习2.查询员工表中的员工编号、员工姓名、职位

select empno,ename,job from emp;
2.起别名(as可以省略不写)
		语法:select 列1 as 别名 from 表名

练习3.将员工表中的字段empno 起别名为 员工编号

//标准写法
select empno as 员工编号 from emp;
//一般写法
select empno 员工编号 from emp;
3.字符串类型可以去做连续的运算

练习4.将员工表中的员工姓名一列展示为 “我的名字是:xxx!”

//使用concat进行字符串的拼接
select concat('我的名字是:',ename,'!') from emp;
4.去重:distinct
	语法:select distinct 列1,列2 .... from 表名

练习5.将员工表中职位(job)进行去重

//把一个字段下的数据进行去重的处理,相同的数据只保留一个
select distinct job from emp;
2.条件查询
SQL运算符:
	1.比较运算符 : = , != , <> , > , < , >= , <=
	2.逻辑运算符 : and , or , not
	3.范围 : between and , in ,not in 
	4.null : is null,is not null
3.模糊查询like 一般去查varchar类型的
like      一般去查varchar类型的
	% : 匹配0-多个任意的字符
	_ : 匹配一个任意的字符
	like '_a' : 只有两个字符
	like '%a%' : 包含a
	like 'a%' : 以a字母开头的
	like '%a' : 以a字母结尾的
4.排序
order by  条件可以有多列  默认是升序的:asc   降序:desc
	语法:select * from 表名 order by 列1,列2;
5.聚合函数(组函数)
也叫聚合函数,又叫组函数,通常用于求真个表中某列的数据的:总和,平均值,最大值,最小值,总数
	通常不搭配表中的字段一起查询
	sum();   求和函数
	max();   求最大值函数
	min();   求最小值函数
	avg();   求平均数函数
	count(); 求总数的函数
6.分组
group by 列名,按照指定的列进行分组,使相同的会分在一组
	语法:select 列名 from 表名 group by 列名
		或者 select 列名1,列名2 from 表名 group by 列名1,列名2
	分组的注意事项:
		1.select 后面跟的列名和group by 后的列名一致
		2.当group by 单独使用的时候,只显示每组的第一条记录
			所以group by 单独使用的意义不大,大多要配合聚合函数
		3.group by 后面也可以跟多个列进行分组,表示这些列都相同的时候在一组
7.分组之后的限定
分组后的限定查询:having
		二次筛选:就是分组后再次对数据进行筛选,需要用having子句来完成
		语法:select 列名 from 表名 group by 列名 having 条件

	having子句和where子句都是用于限定条件
		对比:
			1.where 与 having 后面都是跟条件
			2.where 是对表中数据进行原始筛选
			3.having 是对group by 的结果二次筛选
			4.having 必须配合group by 去使用,一般也会和聚合函数一起去使用
			5.可以先有where ,后面跟着group by 和 having
		区别和结论:
			1.语法上:在having中使用组函数(聚合函数),而where后不能用组函数
			2.执行上:where是先过滤再分组,having是先分组再过滤
8.分页
limit 是 mysql 特有的,方言
		limit用于限定查询结果的起始行,以及总行数
		语法:select * from 表名 limit start,count;
9.多表联查
笛卡尔积:
		两张表在连接查询的时候,如果没有连接条件,那么会产生笛卡尔积(冗余数据)
	内连接:
		查询出来的数据一定满足连接的规则
	外连接:
		左外连接
			左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能查询出来,左表中不满足条件的记录,右表部分都为null
		右外连接
			右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能查询出来。右表不满足条件的记录,左表部分全部为null
		习惯性使用左外连接
	三表联查:
10.子查询
子查询:是指sql语句中包含另外一个select语句
		子查询出现的位置:
			from 后,作为表
			where 后,作为条件
	
	注意事项:
		1.子查询必须在() 里
		2.在子查询中不能使用order by 子句
		3.子查询可以再嵌套子查询,最多不能超过255层

	子查询的分类(单行子查询,多行子查询)
		单行子查询:(放在where后面)
			子查询的结果是单行的数据
			在where条件后,需要配合单行运算符:>,<,>=,<=,!=,=
		多行子查询:(放在from后面)
			子查询的结果是多行数据