mysql简单的单表查询详解
MySQL的查询操作:
单表查询:简单查询
多表查询:连续查询
联合查询:
选择和投影:
投影:挑选要显示的字段
选择:挑选符合条件的行
投影:SELECT 字段1, 字段2, ... FROM tb_name;
SELECT * FROM tb_name;
选择:SELECT 字段1, ... FROM tb_name WHERE 子句;
布尔条件表达式
mysql> CREATE TABLE students (SID INT UNSIGNED AUTO_INCREMENT NOT NULL UNIQUE KEY ,Name CHAR (30) NOT NULL , Age TINYINT UNSIGNED NOT NULL , Gender ENUM('F','M') NOT NULL,Tutor CHAR(30));Query OK, 0 rows affected (0.01 sec)mysql> desc students;+--------+---------------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+--------+---------------------+------+-----+---------+----------------+| SID | int(10) unsigned | NO | PRI | NULL | auto_increment || Name | char(30) | NO | | NULL | || Age | tinyint(3) unsigned | NO | | NULL | || Gender | enum('F','M') | NO | | NULL | || Tutor | char(30) | YES | | NULL | |+--------+---------------------+------+-----+---------+----------------+
【插入数据】
mysql> insert into students values (1,'Guo Jing',27,'M','Song Jiang'),(2,'Yang Guo',28,'M','Hu Sanniang'),(3,'Guo polu',21,'M','Jii Baoyu');
mysql> INSERT INTO students VALUES (4,'Xue Baochai',19,'F','Rong Momo'),(5,'Xia Yuhe',37,'F','Shi Qian'),(6,'Wu Yong',51,'M','Lin Daiyu');
【显示数据】
mysql> select * from students;+-----+-------------+-----+--------+-------------+| SID | Name | Age | Gender | Tutor |+-----+-------------+-----+--------+-------------+| 1 | Guo Jing | 27 | M | Song Jiang || 2 | Yang Guo | 28 | M | Hu Sanniang || 3 | Guo polu | 21 | M | Jii Baoyu || 4 | Xue Baochai | 19 | F | Rong Momo || 5 | Xia Yuhe | 37 | F | Shi Qian || 6 | Wu Yong | 51 | M | Lin Daiyu |+-----+-------------+-----+--------+-------------+
【只显示25到40岁的】
mysql> select * from students where Age between 25 and 40;+-----+----------+-----+--------+-------------+| SID | Name | Age | Gender | Tutor |+-----+----------+-----+--------+-------------+| 1 | Guo Jing | 27 | M | Song Jiang || 2 | Yang Guo | 28 | M | Hu Sanniang || 5 | Xia Yuhe | 37 | F | Shi Qian |+-----+----------+-----+--------+-------------+
【名字,年龄 只显示25到40岁的】 between and
mysql> select Name,Age from students where Age between 25 and 40;+----------+-----+| Name | Age |+----------+-----+| Guo Jing | 27 || Yang Guo | 28 || Xia Yuhe | 37 |+----------+-----+
【更新表的数据】
mysql> update students set Gender='M'where Name='Wu Yong';
【显示 以 X开头的名字】like ‘X%’
mysql> select * from students where Name like 'X%';+-----+-------------+-----+--------+-----------+| SID | Name | Age | Gender | Tutor |+-----+-------------+-----+--------+-----------+| 4 | Xue Baochai | 19 | F | Rong Momo || 5 | Xia Yuhe | 37 | F | Shi Qian |+-----+-------------+-----+--------+-----------+
【显示 以 X开头的名字】增则表达式 RLIKE
mysql> select * from students where Name Rlike '^X.*';+-----+-------------+-----+--------+-----------+| SID | Name | Age | Gender | Tutor |+-----+-------------+-----+--------+-----------+| 4 | Xue Baochai | 19 | F | Rong Momo || 5 | Xia Yuhe | 37 | F | Shi Qian |+-----+-------------+-----+--------+-----------+
【添加null值】
mysql> insert into students values(7,'tom',11,'M','jerry'),(8,'tomy',13,'M',null);mysql> select * from students;+-----+-------------+-----+--------+-------------+| SID | Name | Age | Gender | Tutor |+-----+-------------+-----+--------+-------------+| 1 | Guo Jing | 27 | M | Song Jiang || 2 | Yang Guo | 28 | M | Hu Sanniang || 3 | Guo polu | 21 | M | Jii Baoyu || 4 | Xue Baochai | 19 | F | Rong Momo || 5 | Xia Yuhe | 37 | F | Shi Qian || 6 | Wu Yong | 51 | M | Lin Daiyu || 7 | tom | 11 | M | jerry || 8 | tomy | 13 | M | NULL |+-----+-------------+-----+--------+-------------+
【查找显示空值 】is null
mysql> select * from students where Tutor is null;+-----+------+-----+--------+-------+| SID | Name | Age | Gender | Tutor |+-----+------+-----+--------+-------+| 8 | tomy | 13 | M | NULL |+-----+------+-----+--------+-------+
【查找显示非空值 】is not null
mysql> select * from students where Tutor is not null;+-----+-------------+-----+--------+-------------+| SID | Name | Age | Gender | Tutor |+-----+-------------+-----+--------+-------------+| 1 | Guo Jing | 27 | M | Song Jiang || 2 | Yang Guo | 28 | M | Hu Sanniang || 3 | Guo polu | 21 | M | Jii Baoyu || 4 | Xue Baochai | 19 | F | Rong Momo || 5 | Xia Yuhe | 37 | F | Shi Qian || 6 | Wu Yong | 51 | M | Lin Daiyu || 7 | tom | 11 | M | jerry |+-----+-------------+-----+--------+-------------+
【布尔条件表达式操作符】:
=
<=>
<>
<
<=
>
>=
IS NULL
IS NOT NULL
LIKE: 支持的通配符: %(任意长度的任意字符), _(任意单个字符)
RLIKE, REGEXP: 支持使用正则表达式
IN: 判断指定字段的值是否在给定在列表中;
【组合条件测试】:
NOT, !
AND, &&
OR, ||
【多条件】BETWEEN ... AND ...: 位于指定的范围之间 where Age>25 and Gender='M'
mysql> select * from students where Age>25 and Gender='M';mysql> select * from students where Age>25 && Gender='M';mysql> select * from students where Age > 25 and Gender = 'M';+-----+----------+-----+--------+-------------+| SID | Name | Age | Gender | Tutor |+-----+----------+-----+--------+-------------+| 1 | Guo Jing | 27 | M | Song Jiang || 2 | Yang Guo | 28 | M | Hu Sanniang || 6 | Wu Yong | 51 | M | Lin Daiyu |+-----+----------+-----+--------+-------------+
【显示 顺序】 order by Name ;asc升序;desc降序;
mysql> select * from students where Age>25 and Gender='M' order by Name desc;+-----+----------+-----+--------+-------------+| SID | Name | Age | Gender | Tutor |+-----+----------+-----+--------+-------------+| 2 | Yang Guo | 28 | M | Hu Sanniang || 6 | Wu Yong | 51 | M | Lin Daiyu || 1 | Guo Jing | 27 | M | Song Jiang |+-----+----------+-----+--------+-------------+
【聚合函数】:
SUM(), AVG(), MAX(), MIN(), COUNT()个数
【计算年龄之和】
mysql> select sum(Age) from students;+----------+| sum(Age) |+----------+| 207 |+----------+
【支持where】
mysql> select sum(Age) from students where Age>25 && Gender='M' ;+----------+| sum(Age) |+----------+| 106 |+----------+
【 GROUP BY 分组:统计F、M 各个年龄之和】
mysql> select Gender,sum(Age) from students group by Gender;+--------+----------+| Gender | sum(Age) |+--------+----------+| F | 56 || M | 151 |+--------+----------+
【插入一个字段】
mysql> alter table students add ClassID TINYINT UNSIGNED;mysql> select * from students;+-----+-------------+-----+--------+-------------+---------+| SID | Name | Age | Gender | Tutor | ClassID |+-----+-------------+-----+--------+-------------+---------+| 1 | Guo Jing | 27 | M | Song Jiang | NULL || 2 | Yang Guo | 28 | M | Hu Sanniang | NULL || 3 | Guo polu | 21 | M | Jii Baoyu | NULL || 4 | Xue Baochai | 19 | F | Rong Momo | NULL || 5 | Xia Yuhe | 37 | F | Shi Qian | NULL || 6 | Wu Yong | 51 | M | Lin Daiyu | NULL || 7 | tom | 11 | M | jerry | NULL || 8 | tomy | 13 | M | NULL | NULL |+-----+-------------+-----+--------+-------------+---------+
【update 数值 】
mysql> update students set ClassID=2 where SID=1;mysql> select * from students;+-----+-------------+-----+--------+-------------+---------+| SID | Name | Age | Gender | Tutor | ClassID |+-----+-------------+-----+--------+-------------+---------+| 1 | Guo Jing | 27 | M | Song Jiang | 2 || 2 | Yang Guo | 28 | M | Hu Sanniang | 3 || 3 | Guo polu | 21 | M | Jii Baoyu | 3 || 4 | Xue Baochai | 19 | F | Rong Momo | 1 || 5 | Xia Yuhe | 37 | F | Shi Qian | 2 || 6 | Wu Yong | 51 | M | Lin Daiyu | 1 || 7 | tom | 11 | M | jerry | 1 || 8 | tomy | 13 | M | NULL | 4 |+-----+-------------+-----+--------+-------------+---------+
【统计每个ClassID 对应的人数 】
mysql> select ClassID,count(*) from students group by ClassID;+---------+----------+| ClassID | count(*) |+---------+----------+| 1 | 3 || 2 | 2 || 3 | 2 || 4 | 1 |+---------+----------+
【统计每个ClassID 对应的人数,并显示年龄之和 】
mysql> select ClassID,count(*) ,sum(Age) from students group by ClassID;+---------+----------+----------+| ClassID | count(*) | sum(Age) |+---------+----------+----------+| 1 | 3 | 81 || 2 | 2 | 64 || 3 | 2 | 49 || 4 | 1 | 13 |+---------+----------+----------+
【having 统计显示,每个ClassID人数大于等于2的】
mysql> select ClassID from students group by ClassID having count(Name) >=2;+---------+| ClassID |+---------+| 1 || 2 || 3 |+---------+
【统计显示,每个ClassID,年龄之和大于等于2的】
mysql> select ClassID from students group by ClassID having sum(Age) <=50;+---------+| ClassID |+---------+| 3 || 4 |+---------+
【limit】
limit 一个参数就显示几行
mysql> select *from students limit 3;+-----+----------+-----+--------+-------------+---------+| SID | Name | Age | Gender | Tutor | ClassID |+-----+----------+-----+--------+-------------+---------+| 1 | Guo Jing | 27 | M | Song Jiang | 2 || 2 | Yang Guo | 28 | M | Hu Sanniang | 3 || 3 | Guo polu | 21 | M | Jii Baoyu | 3 |+-----+----------+-----+--------+-------------+---------+
limit 两个参数用,隔开,第一个为跳过,第二个显示行数
mysql> select *from students limit 2,4;+-----+-------------+-----+--------+-----------+---------+| SID | Name | Age | Gender | Tutor | ClassID |+-----+-------------+-----+--------+-----------+---------+| 3 | Guo polu | 21 | M | Jii Baoyu | 3 || 4 | Xue Baochai | 19 | F | Rong Momo | 1 || 5 | Xia Yuhe | 37 | F | Shi Qian | 2 || 6 | Wu Yong | 51 | M | Lin Daiyu | 1 |+-----+-------------+-----+--------+-----------+---------+
练习:导入hellodb.sql,以下操作在students表上执行
1、以ClassID分组,显示每班的同学的人数;
2、以Gender分组,显示其年龄之和;
3、以ClassID分组,显示其平均年龄大于25的班级;
4、以Gender分组,显示各组中年龄大于25的学员的年龄之和;
1,mysql> select ClassID ,count(Name) from students group by ClassID;+---------+-------------+| ClassID | count(Name) |+---------+-------------+| 1 | 3 || 2 | 2 || 3 | 2 || 4 | 1 |+---------+-------------+2,mysql> select Gender,sum(Age) from students group by Gender;+--------+----------+| Gender | sum(Age) |+--------+----------+| F | 56 || M | 151 |+--------+----------+3,mysql> select ClassID,avg(Age) from students group by ClassID having avg(Age) >=25 ;+---------+----------+| ClassID | avg(Age) |+---------+----------+| 1 | 27.0000 || 2 | 32.0000 |+---------+----------+4,mysql> select Gender,sum(Age) from students where Age >=25 group by Gender ;+--------+----------+| Gender | sum(Age) |+--------+----------+| F | 37 || M | 106 |+--------+----------+
【重复数据只显示一次】distinct
mysql> select ClassID from students;+---------+| ClassID |+---------+| 2 || 3 || 3 || 1 || 2 || 1 || 1 || 4 |+---------+mysql> select distinct ClassID from students;+---------+| ClassID |+---------+| 2 || 3 || 1 || 4 |+---------+
【SELECT语句的执行流程:】
FROM clause --> WHERE clause --> GROUP BY --> HAVING clause --> ORDER BY ... --> SELECT --> LIMIT
【SELECT语句:】mysql> help select;
DISTINCT:指定的结果相同的只显示一次;mysql> help distinct;
SQL_CACHE:缓存于查询缓存中;
SQL_NO_CACHE:不缓存查询结果;