mysql查询数据

准备一张表和一些数据

--  创建一张表
CREATE TABLE `t_student` (
	`id` DOUBLE,
	`stuName` VARCHAR (60),
	`age` DOUBLE,
	`sex` VARCHAR (30),
	`gradeName` VARCHAR (60)
);

-- 插入一条数据
INSERT INTO `t_student` (
	`id`,
	`stuName`,
	`age`,
	`sex`,
	`gradeName`
)
VALUES
	(
		'1',
		'张三',
		'23',
		'男',
		'一年级'
	);

-- 插入一条数据
INSERT INTO `t_student` (
	`id`,
	`stuName`,
	`age`,
	`sex`,
	`gradeName`
)
VALUES
	(
		'2',
		'张三丰',
		'25',
		'男',
		'二年级'
	);

-- 插入一条数据
INSERT INTO `t_student` (
	`id`,
	`stuName`,
	`age`,
	`sex`,
	`gradeName`
)
VALUES
	(
		'3',
		'李四',
		'23',
		'男',
		'一年级'
	);

1.单表查询

1.1查询所有字段

(1)SELECT 字段 1,字段 2,字段 3...FROM 表名;

(2)SELECT * FROM 表名;

-- 查询所有字段
SELECT
	id,
	stuName,
	age,
	sex,
	gradeName
FROM
	t_student;

结果:


-- 查询所有字段
SELECT
	*
FROM
	t_student;

结果:


1.2 查询指定字段

SELECT 字段 1,字段 2,字段 3...FROM 表名;

-- 查询指定字段
SELECT
	stuName,
	gradeName
FROM
	t_student;

结果:


1.3 Where 条件查询

SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 条件表达式;

-- Where 条件查询
SELECT
	*
FROM
	t_student
WHERE
	id = 1;
结果:


-- Where 条件查询
SELECT
	*
FROM
	t_student
WHERE
	age > 22;

结果:


1.4 带 IN 关键字查询

SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] IN (元素 1,元素 2,元素 3);

第一种:

-- 带 IN 关键字查询
SELECT
	*
FROM
	t_student
WHERE
	age IN (21, 23);

结果:


第二种:

-- 带 IN 关键字查询
SELECT
	*
FROM
	t_student
WHERE
	age NOT IN (21, 23);

结果:


1.5带 BETWEEN AND 的范围查询

-- 带 BETWEEN AND 的范围查询
SELECT
	*
FROM
	t_student
WHERE
	age BETWEEN 21
AND 24;

结果:


-- 带 BETWEEN AND 的范围查询
SELECT
	*
FROM
	t_student
WHERE
	age NOT BETWEEN 21
AND 24;

1.6 带 LIKE 的模糊查询

SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] LIKE ‘字符串’;

“%” 代表任意字符;

“_” 代表单个字符;

第一种:

-- 带 LIKE 的模糊查询
SELECT
	*
FROM
	t_student
WHERE
	stuName LIKE '张三';

结果:


第二种:

-- 带 LIKE 的模糊查询
SELECT
	*
FROM
	t_student
WHERE
	stuName LIKE '张三%';

结果:


第三种:

-- 带 LIKE 的模糊查询
SELECT
	*
FROM
	t_student
WHERE
	stuName LIKE '张三__';

结果:


第四种:

-- 带 LIKE 的模糊查询
SELECT
	*
FROM
	t_student
WHERE
	stuName LIKE '%张三%';

结果:


1.7 空值查询

SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 IS [NOT] NULL;

-- 空值查询
SELECT
	*
FROM
	t_student
WHERE
	sex IS NULL;

结果:



-- 空值查询
SELECT
	*
FROM
	t_student
WHERE
	sex IS NOT NULL;

结果:


1.8 带 AND 的多条件查询

SELECT 字段 1,字段 2...FROM 表名 WHERE 条件表达式 1 AND 条件表达式 2 [...AND 条件表达式 n]

-- 带 AND 的多条件查询
SELECT
	*
FROM
	t_student
WHERE
	gradeName = '一年级'
AND age = 23

结果:


1.9 带 OR 的多条件查询

SELECT 字段 1,字段 2...FROM 表名 WHERE 条件表达式 1 OR 条件表达式 2 [...OR 条件表达式 n]

-- 带OR的多条件查询
SELECT
	*
FROM
	t_student
WHERE
	gradeName = '一年级'
OR age = 23

1.10 DISTINCT 去重复查询

SELECT DISTINCT 字段名 FROM 表名;

-- DISTINCT 去重复查询
SELECT DISTINCT
	gradeName
FROM
	t_student;

结果:


1.11 对查询结果排序

SELECT 字段 1,字段 2...FROM 表名 ORDER BY 属性名 [ASC|DESC]

-- 对查询结果排序
SELECT
	*
FROM
	t_student
ORDER BY
	age ASC;

结果:


-- 对查询结果排序
SELECT
	*
FROM
	t_student
ORDER BY
	age DESC;

结果:


1.12 GROUP BY 分组查询

GROUP BY 属性名 [HAVING 条件表达式][WITH ROLLUP]
1,单独使用(毫无意义);
2,与 GROUP_CONCAT()函数一起使用;
3,与聚合函数一起使用;
4,与 HAVING 一起使用(限制输出的结果);

5,与 WITH ROLLUP 一起使用(最后加入一个总和行);

第一种:

-- GROUP BY 分组查询
SELECT
	*
FROM
	t_student
GROUP BY
	gradeName;

结果:


第二种:

-- GROUP BY 分组查询
SELECT
	gradeName,
	GROUP_CONCAT(stuName)
FROM
	t_student
GROUP BY
	gradeName;

结果:


第三种:

-- GROUP BY 分组查询
SELECT
	gradeName,
	COUNT(stuName)
FROM
	t_student
GROUP BY
	gradeName;

结果:


第四种:

与 HAVING 一起使用(限制输出的结果);

-- GROUP BY 分组查询
SELECT
	gradeName,
	COUNT(stuName)
FROM
	t_student
GROUP BY
	gradeName
HAVING
	COUNT(stuName) < 3;

结果:


第五种:

-- GROUP BY 分组查询
SELECT
	gradeName,
	COUNT(stuName)
FROM
	t_student
GROUP BY
-- 与 WITH ROLLUP 一起使用(最后加入一个总和行);
	gradeName WITH ROLLUP;

结果:


第六种:

-- GROUP BY 分组查询
SELECT
	gradeName,
	GROUP_CONCAT(stuName)
FROM
	t_student
GROUP BY
	gradeName WITH ROLLUP;

结果:



1.13 LIMIT 分页查询

SELECT 字段 1,字段 2...FROM 表名 LIMIT 初始位置,记录数;

-- LIMIT 分页查询
SELECT
	*
FROM
	t_student
LIMIT 0,
 5;

结果:

2.使用聚合函数查询

创建一张表和数据

CREATE TABLE `t_grade` (
	`id` INT,
	`stuName` VARCHAR (60),
	`course` VARCHAR (60),
	`score` INT
);

INSERT INTO `t_grade` (
	`id`,
	`stuName`,
	`course`,
	`score`
)
VALUES
	('1', '张三', '语文', '91');

INSERT INTO `t_grade` (
	`id`,
	`stuName`,
	`course`,
	`score`
)
VALUES
	('2', '张三', '数学', '90');

INSERT INTO `t_grade` (
	`id`,
	`stuName`,
	`course`,
	`score`
)
VALUES
	('3', '张三', '英语', '87');

INSERT INTO `t_grade` (
	`id`,
	`stuName`,
	`course`,
	`score`
)
VALUES
	('4', '李四', '语文', '79');

INSERT INTO `t_grade` (
	`id`,
	`stuName`,
	`course`,
	`score`
)
VALUES
	('5', '李四', '数学', '95');

INSERT INTO `t_grade` (
	`id`,
	`stuName`,
	`course`,
	`score`
)
VALUES
	('6', '李四', '英语', '80');

INSERT INTO `t_grade` (
	`id`,
	`stuName`,
	`course`,
	`score`
)
VALUES
	('7', '王五', '语文', '77');

INSERT INTO `t_grade` (
	`id`,
	`stuName`,
	`course`,
	`score`
)
VALUES
	('8', '王五', '数学', '81');

INSERT INTO `t_grade` (
	`id`,
	`stuName`,
	`course`,
	`score`
)
VALUES
	('9', '王五', '英语', '89');

2.1 COUNT()函数

(1)COUNT()函数用来统计记录的条数;

(2)与 GOUPE BY 关键字一起使用;

第一种:

-- COUNT()函数
SELECT
	COUNT(*)
FROM
	t_grade;

结果:


第二种:

-- COUNT()函数
SELECT
	COUNT(*) AS total
FROM
	t_grade;

结果:


第三种:

-- COUNT()函数
SELECT
	stuName,
	COUNT(*)
FROM
	t_grade
GROUP BY
	stuName;

结果:


2.2 SUN()函数

(1)SUM()函数是求和函数;

(2)与 GOUPE BY 关键字一起使用;

第一种:

-- SUN()函数
SELECT
	stuName,
	COUNT(*)
FROM
	t_grade
GROUP BY
	stuName;

结果:


第二种:

-- SUN()函数
SELECT
	stuName,
	SUM(score)
FROM
	t_grade
GROUP BY
	stuName;

结果:


2.3 AVG()函数

(1)AVG()函数是求平均值的函数;

(2)与 GOUPE BY 关键字一起使用;

第一种:

-- AVG()函数
SELECT
	stuName,
	AVG(score)
FROM
	t_grade
WHERE
	stuName = "张三";

结果:


第二种:

-- AVG()函数
SELECT
	stuName,
	AVG(score)
FROM
	t_grade
GROUP BY
	stuName;

结果:


2.4 MAX()函数

(1)MAX()函数是求最大值的函数;

(2)与 GOUPE BY 关键字一起使用;

第一种:

-- MAX()函数
SELECT
	stuName,
	course,
	MAX(score)
FROM
	t_grade
WHERE
	stuName = "张三";

结果:


第二种:

-- MAX()函数
SELECT
	stuName,
	MAX(score)
FROM
	t_grade
GROUP BY
	stuName;

结果:


2.5 MIN()函数

(1) MIN()函数是求最小值的函数;

(2)与 GOUPE BY 关键字一起使用;

第一种:

-- MIN()函数
SELECT
	stuName,
	course,
	MIN(score)
FROM
	t_grade
WHERE
	stuName = "张三";

结果:



第二种:

-- MIN()函数
SELECT
	stuName,
	MIN(score)
FROM
	t_grade
GROUP BY
	stuName;

结果:


3.连接查询(两个或两个以上的表)

连接查询是将两个或两个以上的表按照某个条件连接起来,从中选取需要的数据;

准备基本表信息

DROP TABLE
IF EXISTS `t_book`;

-- 创建图书表 
CREATE TABLE `t_book` (
	`id` INT (11) NOT NULL AUTO_INCREMENT,
	`bookName` VARCHAR (20) DEFAULT NULL,
	`price` DECIMAL (6, 2) DEFAULT NULL,
	`author` VARCHAR (20) DEFAULT NULL,
	`bookTypeId` INT (11) DEFAULT NULL,
	PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 5 DEFAULT CHARSET = utf8;

--  插入图书信息
INSERT INTO `t_book` (
	`id`,
	`bookName`,
	`price`,
	`author`,
	`bookTypeId`
)
VALUES
	(
		1,
		'Java编程思想',
		'100.00',
		'埃史尔',
		1
	),
	(
		2,
		'Java从入门到精通',
		'80.00',
		'李钟尉',
		1
	),
	(
		3,
		'三剑客',
		'70.00',
		'大仲马',
		2
	),
	(
		4,
		'生理学(第二版)',
		'24.00',
		'刘先国',
		4
	);

-- 创建图书分类表 
DROP TABLE
IF EXISTS `t_booktype`;

CREATE TABLE `t_booktype` (
	`id` INT (11) NOT NULL AUTO_INCREMENT,
	`bookTypeName` VARCHAR (20) DEFAULT NULL,
	PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 4 DEFAULT CHARSET = utf8;

-- 插入图书分类信息
INSERT INTO `t_booktype` (`id`, `bookTypeName`)
VALUES
	(1, '计算机类'),
	(2, '文学类'),
	(3, '教育类');

3.1 内连接查询

内连接查询是一种最常用的连接查询。内连接查询可以查询两个或者两个以上的表;

第一种:不带条件的查询

-- 查询两张表信息
SELECT
	*
FROM
	t_book,
	t_bookType;

结果:


第二种:带条件的查询

-- 查询两张表信息
SELECT
	*
FROM
	t_book,
	t_bookType
WHERE
	t_book.bookTypeId = t_bookType.id;

结果:


-- 查询两张表信息
SELECT
	bookName,
	author,
	bookTypeName
FROM
	t_book,
	t_bookType
WHERE
	t_book.bookTypeId = t_bookType.id;

结果:


第三种:给表取别名查询

-- 查询两张表信息
SELECT
	bookName,
	author,
	bookTypeName
FROM
	t_book,
	t_bookType
WHERE
	t_book.bookTypeId = t_bookType.id;

结果:


3.2 外连接查询

外连接可以查出某一张表的所有信息;

SELECT 属性名列表 FROM 表名 1 LEFT|RIGHT JOIN 表名 2 ON 表名 1.属性名 1=表名 2.属性名 2;

3.2.1 左连接查询

可以查询出“表名 1” 的所有记录,而“表名 2” 中,只能查询出匹配的记录;

-- 左连接查询
SELECT
	*
FROM
	t_book
LEFT JOIN t_bookType ON t_book.bookTypeId = t_bookType.id;

结果:


-- 左连接查询
SELECT
	tb.bookName,
	tb.author,
	tby.bookTypeName
FROM
	t_book tb
LEFT JOIN t_bookType tby ON tb.bookTypeId = tby.id;

结果:



3.2.2 右连接查询

可以查询出“表名 2” 的所有记录,而“表名 1” 中,只能查询出匹配的记录;

-- 右连接查询
SELECT
	*
FROM
	t_book
RIGHT JOIN t_bookType ON t_book.bookTypeId = t_bookType.id;

结果:


-- 右连接查询
SELECT
	tb.bookName,
	tb.author,
	tby.bookTypeName
FROM
	t_book tb
RIGHT JOIN t_bookType tby ON tb.bookTypeId = tby.id;

结果:


3.3.多条件连接查询

-- 多条件连接查询
SELECT
	tb.bookName,
	tb.author,
	tby.bookTypeName
FROM
	t_book tb,
	t_bookType tby
WHERE
	tb.bookTypeId = tby.id
AND tb.price > 70;

结果:


4.子查询

准备表和数据

-- 创建一直表
CREATE TABLE `t_pricelevel` (
	`id` INT,
	`priceLevel` INT,
	`price` FLOAT,
	`description` VARCHAR (300)
);

-- 插入数据
INSERT INTO `t_pricelevel` (
	`id`,
	`priceLevel`,
	`price`,
	`description`
)
VALUES
	(
		'1',
		'1',
		'80.00',
		'价格贵的书'
	);

-- 插入数据
INSERT INTO `t_pricelevel` (
	`id`,
	`priceLevel`,
	`price`,
	`description`
)
VALUES
	(
		'2',
		'2',
		'60.00',
		'价格适中的书'
	);

-- 插入数据
INSERT INTO `t_pricelevel` (
	`id`,
	`priceLevel`,
	`price`,
	`description`
)
VALUES
	(
		'3',
		'3',
		'40.00',
		'价格便宜的书'
	);
DROP TABLE
IF EXISTS `t_book`;

-- 创建图书表 
CREATE TABLE `t_book` (
	`id` INT (11) NOT NULL AUTO_INCREMENT,
	`bookName` VARCHAR (20) DEFAULT NULL,
	`price` DECIMAL (6, 2) DEFAULT NULL,
	`author` VARCHAR (20) DEFAULT NULL,
	`bookTypeId` INT (11) DEFAULT NULL,
	PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 5 DEFAULT CHARSET = utf8;

--  插入图书信息
INSERT INTO `t_book` (
	`id`,
	`bookName`,
	`price`,
	`author`,
	`bookTypeId`
)
VALUES
	(
		1,
		'Java编程思想',
		'100.00',
		'埃史尔',
		1
	),
	(
		2,
		'Java从入门到精通',
		'80.00',
		'李钟尉',
		1
	),
	(
		3,
		'三剑客',
		'70.00',
		'大仲马',
		2
	),
	(
		4,
		'生理学(第二版)',
		'24.00',
		'刘先国',
		4
	);

-- 创建图书分类表 
DROP TABLE
IF EXISTS `t_booktype`;

CREATE TABLE `t_booktype` (
	`id` INT (11) NOT NULL AUTO_INCREMENT,
	`bookTypeName` VARCHAR (20) DEFAULT NULL,
	PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 4 DEFAULT CHARSET = utf8;

-- 插入图书分类信息
INSERT INTO `t_booktype` (`id`, `bookTypeName`)
VALUES
	(1, '计算机类'),
	(2, '文学类'),
	(3, '教育类');

4.1 带 In 关键字的子查询

一个查询语句的条件可能落在另一个 SELECT 语句的查询结果中。

-- 带 In 关键字的子查询
SELECT
	*
FROM
	t_book
WHERE
	booktypeId IN (SELECT id FROM t_booktype);

结果:


-- 带 In 关键字的子查询
SELECT
	*
FROM
	t_book
WHERE
	booktypeId NOT IN (SELECT id FROM t_booktype);

结果:


4.2带比较运算符的子查询

查询可以使用比较运算符。

-- 带比较运算符的子查询
SELECT
	*
FROM
	t_book
WHERE
	price >= (
		SELECT
			price
		FROM
			t_pricelevel
		WHERE
			priceLevel = 1
	);

结果:


4.3 带 Exists 关键字的子查询

假如子查询查询到记录,则进行外层查询,否则,不执行外层查询;

-- 带 Exists 关键字的子查询
SELECT
	*
FROM
	t_book
WHERE
	EXISTS (SELECT * FROM t_booktype);

结果:


-- 带 Exists 关键字的子查询
SELECT
	*
FROM
	t_book
WHERE
	NOT EXISTS (SELECT * FROM t_booktype);

结果:


4.4 带 Any 关键字的子查询

ANY 关键字表示满足其中任一条件;

-- 带 Any 关键字的子查询
SELECT
	*
FROM
	t_book
WHERE
	price >= ANY (
		SELECT
			price
		FROM
			t_pricelevel
	);

结果:


4.5 带 All 关键字的子查询

ALL 关键字表示满足所有条件;

-- 带 All 关键字的子查询
SELECT
	*
FROM
	t_book
WHERE
	price >= ALL (
		SELECT
			price
		FROM
			t_pricelevel
	);

结果:


5.合并查询结果

5.1 UNION

使用 UNION 关键字,数据库系统会将所有的查询结果合并到一起,然后去除掉相同的记录;

-- 合并查询结果
SELECT
	id
FROM
	t_book
UNION
	SELECT
		id
	FROM
		t_booktype;

结果:


5.2 UNION ALL

使用 UNION ALL,不会去除掉系统的记录;

-- 合并查询结果
SELECT
	id
FROM
	t_book
UNION ALL
	SELECT
		id
	FROM
		t_booktype;

结果:


6.为表和字段取别名

6.1 为表取别名

格式: 表名 表的别名

-- 为表取别名
SELECT
	*
FROM
	t_book t
WHERE
	t.id = 1;

结果:


-- 为表取别名
SELECT
	t.bookName
FROM
	t_book t
WHERE
	t.id = 1;

结果:


6.2 为字段取别名

格式: 属性名 [AS] 别名

-- 为字段取别名
SELECT
	t.bookName bName
FROM
	t_book t
WHERE
	t.id = 1;

结果:


-- 为字段取别名
SELECT
	t.bookName AS bName
FROM
	t_book t
WHERE
	t.id = 1;

结果:


猜你喜欢

转载自blog.csdn.net/qq_35136982/article/details/80792524