前言
Navicat Premium 17 数据表需要经常清缓存,不然之前的自增的数据可能会一直存在,所以把之前的表删除重新创建是对练习数据库最简单的办法。新建数据库的命令如下:
sql
/* 创建有 自增主键的属性id,非空的属性name,唯一的属性tel,代表性别的属性sex,代表年龄的属性age,代表职位的默认为"学生"的属性position */
CREATE TABLE student(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
tel INT(11) UNIQUE,
sex char(1),
age int(4),
position VARCHAR(4) DEFAULT('学生'));
/*添加数据,因为id是自增的position是默认的所以不需要填写*/
INSERT INTO student
(name,tel,sex,age)
VALUES
('张三','1516666777','男',18),
('张四','1516666778','男',19),
('李三','1516666779','女',20),
('李五','1516666780','男',22),
('张三','1516666788','男',17),
('赵武','1516666789','女',23),
('不思量','1516666795','女',22),
('自难忘','1516666796','男',21),
('李明','1516666678','男',20),
('小明','1516666679','男',22),
('萧炎','1516666567','男',23),
('孙武','1516666122','男',18),
('李华','1516666123','女',19),
('孙武','1516666124','男',19);
创建数据表结果如下:
一. 查询一列数据或几列数据
1.1 查询一列数据
SELECT `name` FROM student;
在数据表 student 中查询 'name' 属性
命令原型:SELECT 属性名 FROM 表名;
反引号:它是为了区分MYSQL的保留字与普通字符而引入的符号,一般不影响正常使用。
1.2 查询多列数据
SELECT tel,sex FROM student;
在数据表 student 中查询 tel,sex 属性
命令原型:SELECT 属性名,属性名··· FROM 表名;
1.3 查看全部列数据
SELECT * FROM 表名;
查看表中所有的数据
1.4 查询经过计算的值
SELECT age+10 FROM student;
查询结果是 年龄+10,是一个表达式
命令原型:SELECT 表达式1,表达式2 FROM 表名;
普通的表达式可以理解为 属性乘1
二. 查询某一列重复数据
2.1 单属性数据去重
SELECT DISTINCT `name` FROM student;
对数据表 student 的 name 属性进行去重
命令原型:SELECT DISTINCT 属性名 FROM 表名;
2.2 多属性数据去重
sql
INSERT INTO student (name,tel,sex,age) VALUES ('李华','1516676777','男',19);
/* 插入一条数据,与第十三条数据性别不同,电话号码也不同,电话号码是禁止重复*/
SELECT DISTINCT `name`,sex FROM student;
对数据表 student 的 name 属性进行去重,当两条数据都重复的时候才会去重
命令原型:SELECT DISTINCT 属性名1,属性名2,属性名3... FROM 表名;
应用在多个字段时,只有当多个字段重复才会去重
2.3 去重保留全部数据
SELECT DISTINCT * FROM student;
对 student 数据表的 全部属性进行去重,这种情况必须要全部的数据相同才能去重
SELECT DISTINCT * FROM 数据表;
这个 * 代表全部的属性
三. 查询满足条件的元组
3.1 查询条件表格
查询条件 | 关键词 |
---|---|
比较 | =,>,<,>=,<=,!=,<>,!>,!<; NOT+上述比较运算符 |
范围 | BETWEEN AND,NOT BETWEEN AND |
集合 | IN,NOT IN |
字符匹配(相当于等号) | LIKE,NOT LIKE |
空值 | IS NULL,IS NOT NULL |
多重条件(逻辑运算) | AND,OR,NOT |
查询满足指定条件的元组可以通过WHERE子句实现。
3.2 等于查询
SELECT `name` FROM student WHERE `name`='张三'
查询数据表 student 中 name 属性等于张三的数据,并且展示他们的 name 属性
命令原型:SELECT 属性名 FROM 表名 WHERE 等于条件;
3.3 小于查询
SELECT name,age FROM student WHERE age<=20;
查询年龄小于等于20岁的人,并且展示name和age属性
命令原型:SELECT 属性名 FROM 表名 WHERE 小于条件;
3.4 NOT查询
SELECT DISTINCT `name`,age FROM student WHERE NOT age<20;
查询年龄不小于20岁的人,并且展示name和age属性
命令原型:SELECT 属性名 FROM 表名 WHERE NOT 判断条件;
3.5 范围查询
SELECT * FROM student WHERE age BETWEEN 19 AND 22;
查询年龄在19到22岁之间的人,包括19岁和22岁,并且展示全部的属性
命令原型:SELECT 属性名 FROM 表名 WHERE 属性名 BETWEEN 包含AND的范围区间;
下图的只有一条语句的时候没有分号系统也会默认结束,但是不建议大家这样写,养成好习惯很重要
* 代表的是全部的属性
3.6 范围之外查询
SELECT * FROM student WHERE age BETWEEN NOT 19 AND 22;
查询年龄在19到22岁之外的人,不包括19岁和22岁,并且展示全部的属性
命令原型:SELECT 属性名 FROM 表名 WHERE 属性名 BETWEEN NOT 包含AND的范围区间;
3.7 集合查询
SELECT * FROM `student` WHERE name IN ('张三','李华','小明');
查询name 属性 中有张三,李华,小明的数据,并且展示全部的属性
命令原型:SELECT 属性名 FROM 表名 WHERE IN 数据集合;
3.8 集合之外查询
SELECT * FROM `student` WHERE name NOT IN ('张三','李华','小明');
查询name 属性中不包含张三,李华,小明任何一个的数据,并且展示全部的属性
命令原型:SELECT 属性名 FROM 表名 WHERE NOT IN 数据集合;
3.9 字符匹配
SELECT * FROM student WHERE name LIKE '张三';
查询数据表 student 中 name 属性等于张三的数据,并且展示他们的 name 属性
字符匹配的命令原型:SELECT 属性名 FROM 表名 WHERE 属性名 LIKE 数据;
禁止字符匹配的命令原型:SELECT 属性名 FROM 表名 WHERE 属性名 NOT LIKE 数据;
sql
SELECT * FROM student WHERE name LIKE '张三';
/* 两者是等价关系 */
SELECT `name` FROM student WHERE `name`='张三'
3.10 空值查询
sql
/* 插入含有空值的数据 */
INSERT INTO student (name,tel,sex) VALUES ('张三','1516456777','男');
INSERT INTO student (name,tel,age) VALUES ('空值','1516123777',18);
插入两条含有空值的数据之后现在有十七条数据(当时电脑可能卡了,所以顺序有些错误,其他无碍)
SELECT id,sex,name FROM student WHERE sex IS NULL;
查询数据表 student 中 sex 属性中为空的数据,并且展示他们的 name 属性
命令原型:SELECT 属性名 FROM 表名 WHERE 属性名 IS NULL;
注意:查询的表格中属性的顺序由查询命令中属性的顺序决定的,如下图所示
3.11 数据非空查询
SELECT id,sex,name FROM student WHERE sex IS NOT NULL;
查询数据表 student 中 sex 属性中为非空的数据,并且展示他们的 id,sex,name 属性
命令原型:SELECT 属性名 FROM 表名 WHERE 属性名 IS NOT NULL;
3.12 AND查询
SELECT name,age,sex FROM student WHERE age<=20 AND sex='男';
查询数据表 student 中 年龄小于20且性别为男 的数据,并且展示他们的 name,age,sex三个属性
命令原型:SELECT 属性名 FROM 表名 WHERE 判断条件1 AND 判断条件2;
3.13 OR查询
SELECT name,age,sex FROM student WHERE age<=20 OR sex='男';
查询数据表 student 中 年龄小于20 或者 性别为男 的数据,并且展示他们的 name,age,sex三个属性
命令原型:SELECT 属性名 FROM 表名 WHERE 判断条件1 OR 判断条件2;
四. 基于LIKE的模糊查询
基于LIKE的模糊查询一般伴随着两个符号:
百分号(%):代表任意长度的字符,长度可以为0,也可以是长度为字符串上限的长度。例如:张%,表示查询姓张的字符串;张%三,表示查询张某三的字符串,张一三,张一二三等。
下划线(_):代表任意单个字符。例如:张_三表示以张开头,以三结尾的长度为3的任意字符串。张一三、张二三等。
4.1 百分号查询
SELECT * FROM `student` WHERE name LIKE '张%';
查询数据表 student 中 姓张的数据,并且展示他们的 全部属性
命令原型:SELECT 属性名 FROM 表名 WHERE 属性名 LIKE 含有百分号的条件;
注意:这个时候不能用等于查询
4.2 下划线查询
sql
/* 插入一条数据,作为 下划线查询 的对比 */
INSERT INTO student (name,tel,sex) VALUES ('李明明','1526456777','女');
插入一条含有空值的数据之后现在有十八条数据
SELECT * FROM `student` WHERE name LIKE '李_';
查询数据表 student 中 姓李且名字只有两个字 的数据,并且展示他们的 全部属性
命令原型:SELECT 属性名 FROM 表名 WHERE 属性名 LIKE 含有下划线条件;
注意:这个时候不能用等于查询
4.3 混合查询
SELECT * FROM `student` WHERE name LIKE '_明%';
查询数据表 student 中 名字第二个字是明 的数据,并且展示他们的 全部属性
命令原型:SELECT 属性名 FROM 表名 WHERE 属性名 LIKE 含有百分号和下划线的条件;
注意:这个时候不能用等于查询
五. 升序降序排序
用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。
5.1 降序排序
SELECT * FROM student ORDER BY age DESC;
将数据表按照年龄的降序进行排序
命令原型:SELECT 属性名 FROM 数据表 ORDER BY 属性名 DESC;
5.2 升序排序
SELECT * FROM student ORDER BY `name` ASC;
将数据表按照姓名的升序进行排序
命令原型:SELECT 属性名 FROM 数据表 ORDER BY 属性名 ASC;
首字母大写的顺序排序
5.3 条件排序
SELECT * FROM student WHERE `name`='张三' ORDER BY `name` ASC;
将数据表中名字为张三的按照年龄的升序进行排序
命令原型:SELECT 属性名 FROM 数据表 WHERE 条件 ORDER BY 属性名 ASC;
六. 统计查询
6.1 统计有多少行
SELECT COUNT(*) FROM student;
查询有多少行
命令原型:SELECT COUNT(*) FROM 表名;;
6.2 统计属性值的种类
SELECT COUNT(DISTINCT age) FROM student;
查询年龄有几种
命令原型:SELECT COUNT(DISTINCT 属性名) FROM 表名;
PS:空值不计数
6.3 计算一列数据的和
SELECT SUM(age) FROM student;
计算所有age岁数的和
命令原型:SELECT SUM(属性名) FROM 表名;
PS:空值不能加入,并且必须是数值型
6.4 计算平均值
SELECT AVG(age) FROM student;
计算所有age岁数的平均
命令原型:SELECT AVG(属性名) FROM 表名;
PS:空值不能加入,并且必须是数值型
6.5 最大值
SELECT MAX(age) FROM student;
计算所有age岁数的最大值
命令原型:SELECT MAX(属性名) FROM 表名;
6.6 最小值
SELECT MIN(age) FROM student;
计算所有age岁数的最小值
命令原型:SELECT MIN(属性名) FROM 表名;
6.7 分组查询
分组查询将查询结果按某一列或多列的值分组,值相等的为一组。
SELECT name,COUNT(id) FROM student GROUP BY `name`;
查询 name 属性种类的个数,以及对应 id 的个数
命令原型:SELECT 属性名1,COUNT(属性名2) FROM 表名 GROUP BY 属性名1;
PS:空值不能计入
好好吃饭
好好睡觉