-
列出表的所有字段
通过SQL语句SELECT列出表的所有字段,具体语法形式如下:
SELECT field1,field2,…,fieldn FROM tablename;
其中:
filed1~fieldn参数表示需要查询的字段名;
tablename参数表示表的名称。
-
“*”符号表示所有字段
查询所有字段数据,除了使用上面的方式外,还可以通过符号“*”来实现,具体语法形式如下:
SELECT * FROM tablename;
其中:
符号“*”表示所有字段名;
tablename参数表示表的名称。
与上一种方式相比,“*”符号方式的优势比较明显,
即可用该符号代替表中的所有字段,但是这种方式不够灵活,
只能按照表中字段的固定顺序显示,不能随便改变字段的顺序。
-
查询指定字段数据
查询指定字段数据,只需修改关键字SELECT后的字段列表为指定字段即可。
SELECT field1,field2,…,fieldn FROM tablename;
例如,从班级表中查询班主任字段,SQL语句如下所示。
SELECT teacher FROM class;
如果关键字SELECT后面的字段不包含在所查询的表中,那么MySQL会报错。
-
DISTINCT 去重查询
当在MySQL中执行简单数据查询时,有时会显示出重复数据。为了实现查询不重复数据,MySQL提供了DISTINCT功能,SQL语法如下:
SELECT DISTINCT field1,field2,…,fieldn FROM tablename;
在上述语句中,关键字DISTINCT去除重复的数据。下面将通过一个具体的示例来说明如何实现查询不重复数据。
执行SQL语句SELECT,在数据库school中查询班级表 class 中teacher字段的数据。具体步骤如下:
mysql> create table class(name varchar(64)); #创建表class
mysql> insert into class values('张三'),('李四'),('张三'),('张三'); #插入多条记录
mysql> select name from class ; #查询class表中的name 域,包含重复记录
mysql> select distinct name from class ; #查询class表中的name 域,去重
-
IN查询
有的时候,当我们需要查询的目标记录限定在某个集合中的时候,在MySQL中可以使用关键字IN来实现,关键字IN可以实现判断字段的数值是否在指定集合中,该关键字的具体语句形式如下:
SELECT field1,field2,…,fieldn
FROM tablename WHERE filedm IN(value1,value2,value3,…,valuen);
使用NOT IN可以反向查询非集合中的数据
SELECT field1,field2,…,fieldn
FROM tablename WHERE filedm NOT IN(value1,value2,value3,…,valuen);
集合查询的注意: 集合中慎用 NULL
在具体使用关键字IN时,查询的集合中如果存在NULL,则不会影响查询,NULL 存不存在的效果都一样;但如果使用关键字NOT IN,查询的集合中如果存在NULL,则不会查询到任何的结果。
-
BETWEEN AND查询
当我们需要查询指定范围内的数据(如: id 从0 到 100)的时候,MySQL提供了关键字BETWEEN AND,用来实现判断字段的数值是否在指定范围内的条件查询。该关键字的具体语法形式如下:
SELECT field1,field2,…,fieldn
FROM tablename WHERE fieldm BETWEEN minvalue AND maxvalue
在上述语句中,参数fieldn表示名称为tablename的表中的字段名,通过关键字BETWEEN和AND来设置字段field的取值范围,如果字段field的值在所指定的范围内,那么满足查询条件,该记录会被查询出来,否则不会被查询出来。
BETWEEN minvalue AND maxvalue,表示的是一个范围间的判断过程,只针对数字类型。
1.符合范围的数据记录查询
通过关键字BETWEEN和AND设置查询范围,以实现查询语文成绩(字段Chinese)在80和90之间的学生,具体SQL如下:
mysql> create table class(id int , name varchar(128), age tinyint unsigned); #创建class表
mysql> insert into class values(1, '张三' 18),(2, '李四' 23),(3, '王五', 25); #插入多条记录
mysql> select * from class where age between 10 and 30; #查询class表中年龄在10 和 30 之间的年龄
2.不符合范围的数据记录查询
通过关键字NOT设置反向查询非查询范围的条件,具体SQL语句如下:
SELECT name,chinese FROM class WHERE age NOT BETWEEN 10 AND 30;
上面语句等同于:
select age from class where age <10 or chinese >30;
-
LIKE模糊查询
当我们只想用字符串中间的一部分特征查找含有特征字串的信息时,MySQL提供了关键字LIKE来实现模糊查询,需要使用通配符 % ,具体语法形式如下:
SELECT field1,field2,…,fieldn
FROM tablename WHERE fieldm LIKE value%;
在上述语句中,参数tablename表示表名,参数fieldn表示表中的字段名字,%表示通配符
通过关键字LIKE来判断字段field的值是否与value字符串匹配,如果相匹配,则满足查询条件,
该记录就会被查询出来;否则就不会被查询出来。
在MySQL中,字符串必须加上单引号(‘’)和双引号(″″)。由于关键字LIKE可以实现模糊查询,因此该关键字后面的字符串参数除了可以使用完整的字符串外,还可以包含通配符。LIKE关键字支持的通配符如表5-1所示。
1.查找某个字段含有 ‘三’ 字的记录:
mysql> create table class(id int, name varchar(64)); #创建class表
mysql> insert into class values(1, '张三'),(2, '唐三藏'),(3, '张三丰'), (4, '三脚猫'), (5, '猫三脚');
mysql> select * FROM class WHERE name LIKE '%三%'; //查找class表所有包含'三'的字段
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 唐三藏 |
| 3 | 张三丰 |
| 4 | 三脚猫 |
| 5 | 猫三脚 |
+----+--------+
注意:将会把teacher字段为“张三”、“唐三藏”、“张三丰”、“三脚猫”
等等含“三”的记录全找出来。
2.查找teacher字段中既有“三”又有“猫”的记录,请使用and条件
mysql> SELECT * FROM class WHERE name LIKE '%三%' AND name LIKE '%猫%';
+----+--------+
| id | name |
+----+--------+
| 4 | 三脚猫 |
| 5 | 猫三脚 |
+----+--------+
3.查询name字段中既有“三”又有“猫”的记录,同时“猫”在“三”之后的记录
mysql> SELECT * FROM class WHERE name LIKE '%三%猫%';
+----+--------+
| id | name |
+----+--------+
| 4 | 三脚猫 |
+----+--------+
注意: 虽然能搜索出 “三脚猫”,但不能搜索出符合条件的 “猫三脚”。
4.只找出“唐三藏”这样name为三个字且中间一个字是“三”的;
mysql> SELECT * FROM class WHERE name LIKE '_三_';
+----+--------+
| id | name |
+----+--------+
| 2 | 唐三藏 |
| 3 | 张三丰 |
| 5 | 猫三脚 |
+----+--------+
注意:_表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符)
5.只找出“三脚猫”这样teacher为三个字且第一个字是“三”的;
mysql> SELECT * FROM class WHERE name LIKE '三__';
+----+--------+
| id | name |
+----+--------+
| 4 | 三脚猫 |
+----+--------+
-
对查询结果排序
在MySQL中,从表中查询出的数据可能是无序的,或者其排列顺序不是用户所期望的顺序,为了使查询结果的顺序满足用户的要求,可以使用关键字ORDER BY对记录进行排序,其语法形式如下:
SELECT field1, field2, field3, …, fieldn FROM tablename ORDER BY fieldm [ASC|DESC];
在上述语句中,
参数tablename表示所要进行排序的表名,
参数fieldn表示表中的字段名字,
参数fieldm表示按照该字段进行排序;
ASC表示按升序进行排序;
DESC表示按降序进行排序。默认的情况下按ASC进行排序。
注意:如果存在一条记录字段的值为空值(NULL),那么按升序排序时
,含空值的记录将最先显示,可以理解为空值是该字段的最小值;按降序排列时,字段为空值的记录将最后显示。
(1)执行SQL语句SELECT,查询表class中所有的数据记录,按照语文成绩(字段chinese)升序排序,具体SQL语句如下:
mysql> create table class(id int, name varchar(128), math tinyint, chinese tinyint, english tinyint);
mysql> insert into class values(1, '甲', 80, 87, 91),(2,'乙', 72, 64, 89),(3, '丙', 54, 69, 87),(4,'丁', 78, 79, 89);
mysql> SELECT id,name,chinese FROM class ORDER BY chinese ASC; #按升序的方式查询学员记录
mysql> SELECT id,name,chinese FROM class where between 2 and 3 ORDER BY chinese ASC; #只查询id列为2-3的
-
简单分组查询
MySQL软件提供了5个统计函数来帮助用户统计数据,可以使用户很方便地对记录进行统计数、计算和、计算平均数、计算最大值和最小值,而不需要查询所有数据。
在具体使用统计函数时,都是针对表中所有记录数或指定特定条件(WHERE子句)的数据记录进行统计计算。在现实应用中,经常会先把所有数据记录进行分组,再对这些分组后的数据记录进行统计计算。
MySQL通过SQL语句GROUP BY来实现,分组数据查询语法如下:
SELECT function()[,filed ] FROM tablename WHERE CONDITION GROUP BY field;
在上述语句中,参数field表示某字段名,通过该字段对名称为tablename的表的数据记录进行分组。
注意:在具体进行分组查询时,分组所依据的字段上的值一定要具有重复值,否则分组没有任何意义。
五个统计函数简介
1.统计数量
COUNT(*):该种方式可以实现对表中记录进行统计,不管表字段中包含的是NULL值还是非NULL值。
COUNT(field):该种方式可以实现对指定字段的记录进行统计,在具体统计时将忽略NULL值。
2.统计计算平均值
该函数只有一种使用方式。
AVG(field)使用方式:该种方式可以实现对指定字段的平均值进行计算,在具体统计时将忽略NULL值。
3. 统计计算求和
该函数只有一种使用方式。
SUM(field)使用方式:该种方式可以实现计算指定字段值之和,在具体统计时将忽略NULL值。
4. 统计最大值
该函数只有一种使用方式。
MAX(field)使用方式:该种方式可以实现计算指定字段值中的最大值,在具体统计时将忽略NULL值。
5. 统计最小值
该函数只有一种使用方式。
MIN(field)使用方式:该种方式可以实现计算指定字段值中的最小值,在具体统计时将忽略NULL值。
mysql> create table grade(id int, name varchar(128), math tinyint, chinese tinyint , english tinyint, class_id int); #创建表grade
mysql> insert into grade values(1, '甲', 80, 87, 91, 1),(2,'乙', 72, 64, 89,2),(3, '丙', 54, 69, 87,2),(4,'丁', 78, 79, 89, 1); #插入多条记录
mysql> select class_id, sum(math) from grade group by class_id; #对两个班级的数学成绩进行统计
+----------+-----------+
| class_id | sum(math) |
+----------+-----------+
| 1 | 158 |
| 2 | 126 |
+----------+-----------+
mysql> select class_id, avg(math), avg(chinese), avg(english) from grade group by class_id; #统计两个班级科目的平均分,会忽略掉NULL 记录
+----------+-----------+--------------+--------------+
| class_id | avg(math) | avg(chinese) | avg(english) |
+----------+-----------+--------------+--------------+
| 1 | 79.0000 | 83.0000 | 90.0000 |
| 2 | 63.0000 | 66.5000 | 88.0000 |
+----------+-----------+--------------+--------------+
-
统计分组查询
在MySQL中,只实现简单的分组查询有时候可能没有任何实际意义,因为关键字GROUP BY单独使用时,默认查询出每个分组中随机的一条记录,具有很大的不确定性,一般建议将分组关键字与统计函数一起使用。
如果想显示每个分组中的字段,可以通过函数GROUP_CONCAT()来实现。该函数可以实现显示每个分组中的指定字段,函数的具体语法形式如下:
SELECT GROUP_CONCAT(field) FROM tablename WHERE CONDITION GROUP BY field;
在上述语句中会显示每个数组中的字段值。
使用GROUP_CONCAT()对班级进行统计分组,并显示每组中学生的姓名。
执行SQL语句GROUP_CONCAT(),显示每个分组,具体SQL语句如下:
mysql> create table grade(id int, name varchar(128), math tinyint, chinese tinyint , english tinyint, class_id int); #创建表grade
mysql> insert into grade values(1, '甲', 80, 87, 91, 1),(2,'乙', 72, 64, 89,2),(3, '丙', 54, 69, 87,2),(4,'丁', 78, 79, 89, 1); #插入多条记录
mysql> select class_id, count(*), group_concat(name) from grade group by class_id; #按class_id 进行分组,统计数学总分并显示每个分组中的姓名
+----------+----------+--------------------+
| class_id | count(*) | group_concat(name) |
+----------+----------+--------------------+
| 1 | 2 | 甲,丁 |
| 2 | 2 | 乙,丙 |
+----------+----------+--------------------+