Mysql select

查询数据

-- 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(输入值,实际值)。

猜你喜欢

转载自www.cnblogs.com/dailycode/p/9432719.html