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:不缓存查询结果;