查询数据
-- select select选项 [字段列表 from 表名列表 [where 条件][group by 分组][having 条件][order by 排序][limit 限制]];
select选项
all,查询所有,默认;
distinct:重复记录(2个记录行所有对应字段值都相等)只保留一条;通常多表查询时为区别同名字段需要定义别名[as];
DROP DATABASE IF EXISTS db1;
CREATE DATABASE db1;
USE db1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(name VARCHAR(32) NOT NULL);
INSERT INTO t1 (name) VALUES ("t1");
INSERT INTO t1 (name) VALUES ("t1");
SELECT ALL * FROM t1;
SELECT DISTINCT * FROM t1;
mysql> SELECT ALL * FROM t1;
+------+
| name |
+------+
| t1 |
| t1 |
+------+
2 rows in set (0.00 sec)
mysql> SELECT DISTINCT * FROM t1;
+------+
| name |
+------+
| t1 |
+------+
1 row in set (0.00 sec)
字段列表
以逗号分隔;
多表查询时可能存在不同表存在相同字段名称的情形,这就需要用到字段别名;
DROP DATABASE IF EXISTS db1;
CREATE DATABASE db1;
USE db1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(name VARCHAR(32) NOT NULL);
INSERT INTO t1 (name) VALUES ("t1");
DROP TABLE IF EXISTS t2;
CREATE TABLE t2(name VARCHAR(32) NOT NULL);
INSERT INTO t2 (name) VALUES ("t2");
SELECT t1.name as t1n, t2.name as t2n FROM t1,t2;
mysql> SELECT t1.name as t1n, t2.name as t2n FROM t1,t2;
+-----+-----+
| t1n | t2n |
+-----+-----+
| t1 | t2 |
+-----+-----+
1 row in set (0.00 sec)
from 表名列表
以逗号分隔;
多表查询时,比如select * from t1,t2,t3,......;查询结果是笛卡尔积(也是一个二维表结构),记录数为所有表记录数积,列为所有表列和,除了增加数据库压力外毫无意义。通常用法是动态查询感兴趣的列其结果以别名方式充当数据源;
DROP DATABASE IF EXISTS db1;
CREATE DATABASE db1;
USE db1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(name VARCHAR(32) NOT NULL, address VARCHAR(32) NOT NULL, noneed INT DEFAULT 0);
INSERT INTO t1 VALUES ("a", "Earth", DEFAULT);
INSERT INTO t1 VALUES ("b", "Mars", DEFAULT);
DROP TABLE IF EXISTS t2;
CREATE TABLE t2(name VARCHAR(32) NOT NULL, phone VARCHAR(32) NOT NULL, noneed INT DEFAULT 0);
INSERT INTO t2 VALUES ("a", "123456789", DEFAULT);
INSERT INTO t2 VALUES ("b", "987654321", DEFAULT);
SELECT * FROM t1,t2;
SELECT t1temp.name AS name,t1temp.address AS address,t2temp.phone AS phone FROM (SELECT name,address FROM t1) AS t1temp, (SELECT name,phone FROM t2)
AS t2temp WHERE t1temp.name = t2temp.name;
mysql> SELECT * FROM t1,t2;
+------+---------+--------+------+-----------+--------+
| name | address | noneed | name | phone | noneed |
+------+---------+--------+------+-----------+--------+
| a | Earth | 0 | a | 123456789 | 0 |
| b | Mars | 0 | a | 123456789 | 0 |
| a | Earth | 0 | b | 987654321 | 0 |
| b | Mars | 0 | b | 987654321 | 0 |
+------+---------+--------+------+-----------+--------+
4 rows in set (0.00 sec)
mysql> SELECT t1temp.name as name,t1temp.address as address,t2temp.phone as phon
e FROM (SELECT name,address FROM t1) as t1temp, (SELECT name,phone FROM t2) as t
2temp WHERE t1temp.name = t2temp.name;
+------+---------+-----------+
| name | address | phone |
+------+---------+-----------+
| a | Earth | 123456789 |
| b | Mars | 987654321 |
+------+---------+-----------+
2 rows in set (0.00 sec)
[where 条件]
从数据库中逐条读取,判断条件,符合才存储到动态结果表;注意,where之后都是在内存中进行操作。
[group by 分组]
分组目的是统计(注意,如果统计目标是字段而字段值为NULL的项不被计入),count、sum、avg、max、min等;
group by只会保留每个分组的首条记录;
group by field1,field2,...
DROP DATABASE IF EXISTS db1;
CREATE DATABASE db1;
USE db1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(name VARCHAR(32) NOT NULL,
address VARCHAR(32) NOT NULL,
did INT NOT NULL,
age INT NOT NULL,
gender INT NOT NULL);
INSERT INTO t1 VALUES ("a", "Earth", 1, 11, 1);
INSERT INTO t1 VALUES ("b", "Venus", 2, 22, 1);
INSERT INTO t1 VALUES ("c", "Jupiter", 1, 33, 1);
INSERT INTO t1 VALUES ("d", "Mercury", 2, 44, 0);
INSERT INTO t1 VALUES ("e", "Mars", 1, 55, 0);
INSERT INTO t1 VALUES ("f", "Saturn", 2, 66, 0);
SELECT COUNT(*),AVG(age),MAX(age),MIN(age)
FROM t1; -- 所有记录分为1组统计,默认。
SELECT did,COUNT(*),GROUP_CONCAT(name),AVG(age),MAX(age),MIN(age)
FROM t1 GROUP BY did; -- 按did分组。
SELECT did,COUNT(*),GROUP_CONCAT(name),AVG(age),MAX(age),MIN(age)
FROM t1 GROUP BY did ASC,gender DESC; -- 复合分组。
SELECT did,COUNT(*),GROUP_CONCAT(name),AVG(age),MAX(age),MIN(age)
FROM t1 GROUP BY did ASC,gender DESC WITH ROLLUP; -- 回溯统计。
mysql> SELECT COUNT(*),AVG(age),MAX(age),MIN(age)
-> FROM t1; -- 所有记录分为1组统计,默认。
+----------+----------+----------+----------+
| COUNT(*) | AVG(age) | MAX(age) | MIN(age) |
+----------+----------+----------+----------+
| 6 | 38.5000 | 66 | 11 |
+----------+----------+----------+----------+
1 row in set (0.00 sec)
mysql> SELECT did,COUNT(*),GROUP_CONCAT(name),AVG(age),MAX(age),MIN(age)
-> FROM t1 GROUP BY did; -- 按did分组。
+-----+----------+--------------------+----------+----------+----------+
| did | COUNT(*) | GROUP_CONCAT(name) | AVG(age) | MAX(age) | MIN(age) |
+-----+----------+--------------------+----------+----------+----------+
| 1 | 3 | a,c,e | 33.0000 | 55 | 11 |
| 2 | 3 | b,d,f | 44.0000 | 66 | 22 |
+-----+----------+--------------------+----------+----------+----------+
2 rows in set (0.00 sec)
mysql> SELECT did,COUNT(*),GROUP_CONCAT(name),AVG(age),MAX(age),MIN(age)
-> FROM t1 GROUP BY did ASC,gender DESC; -- 复合分组。
+-----+----------+--------------------+----------+----------+----------+
| did | COUNT(*) | GROUP_CONCAT(name) | AVG(age) | MAX(age) | MIN(age) |
+-----+----------+--------------------+----------+----------+----------+
| 1 | 2 | a,c | 22.0000 | 33 | 11 |
| 1 | 1 | e | 55.0000 | 55 | 55 |
| 2 | 1 | b | 22.0000 | 22 | 22 |
| 2 | 2 | d,f | 55.0000 | 66 | 44 |
+-----+----------+--------------------+----------+----------+----------+
4 rows in set (0.00 sec)
mysql> SELECT did,COUNT(*),GROUP_CONCAT(name),AVG(age),MAX(age),MIN(age)
-> FROM t1 GROUP BY did ASC,gender DESC WITH ROLLUP; -- 回溯统计。
+-----+----------+--------------------+----------+----------+----------+
| did | COUNT(*) | GROUP_CONCAT(name) | AVG(age) | MAX(age) | MIN(age) |
+-----+----------+--------------------+----------+----------+----------+
| 1 | 2 | a,c | 22.0000 | 33 | 11 |
| 1 | 1 | e | 55.0000 | 55 | 55 |
| 1 | 3 | a,c,e | 33.0000 | 55 | 11 |
| 2 | 1 | b | 22.0000 | 22 | 22 |
| 2 | 2 | d,f | 55.0000 | 66 | 44 |
| 2 | 3 | b,d,f | 44.0000 | 66 | 22 |
| NULL | 6 | a,c,e,b,d,f | 38.5000 | 66 | 11 | //顶层总和字段名称NULL
+-----+----------+--------------------+----------+----------+----------+
7 rows in set (0.00 sec)
[having 条件]
DROP DATABASE IF EXISTS db1;
CREATE DATABASE db1;
USE db1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(name VARCHAR(32) NOT NULL,
address VARCHAR(32) NOT NULL,
did INT NOT NULL,
age INT NOT NULL,
gender INT NOT NULL);
INSERT INTO t1 VALUES ("a", "Earth", 1, 11, 1);
INSERT INTO t1 VALUES ("b", "Venus", 2, 22, 1);
INSERT INTO t1 VALUES ("c", "Jupiter", 1, 33, 1);
INSERT INTO t1 VALUES ("d", "Mercury", 2, 44, 0);
INSERT INTO t1 VALUES ("e", "Mars", 1, 55, 0);
INSERT INTO t1 VALUES ("f", "Saturn", 2, 66, 0);
SELECT did,COUNT(*),GROUP_CONCAT(name),AVG(age),MAX(age),MIN(age)
FROM t1 GROUP BY did ASC HAVING COUNT(*) > 1; -- 以聚合函数结果为条件,可以使用别名。
SELECT did,COUNT(*) AS num,GROUP_CONCAT(name),AVG(age),MAX(age),MIN(age)
FROM t1 GROUP BY did ASC HAVING num > 1; -- where能做的,having都可以,反之不尽然。
[order by 排序]
DESC/ ASC,默认ASC,可以多字段。
[limit 限制]
比如取第N条、第N条起共M条、
SELECT * FROM t1 LIMIT 1; -- 第0条。
SELECT * FROM t1 LIMIT 2,3; -- 第2条起共3条即2-3-4,注意索引0始,取的数量=min(输入值,实际值)。