mysql select select_MySQL-Select语句高级应用

1.1 SELECT高级应用

1.1.1 前期准备工作

本次测试使用的是world数据库,由mysql官方提供下载地址:

world文件导入方法,官方说明:

下载sqlyog软件,用于之后的数据库管理用:

创建用户,能够让sqlyog登录数据库即可,注意权限控制。

mysql> grant all on *.* to root@'%' identified by '123';

Query OK,0 rows affected (0.00 sec)

授权用户后参看

mysql> select user,host from mysql.user where user like 'root';+------+-----------+

| user | host |

+------+-----------+

| root | % |

| root | 10.0.0.1 |

| root | 127.0.0.1 |

| root | localhost |

+------+-----------+

4 rows in set (0.00 sec)

1.1.2 select语法格式说明

mysql> help select;

Name:'SELECT'Description:

Syntax:SELECT

[ALL | DISTINCT | DISTINCTROW]

[HIGH_PRIORITY]

[STRAIGHT_JOIN]

[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]

[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]select_expr[, select_expr ...]

[FROM table_references

[PARTITION partition_list]

[WHERE where_condition]

[GROUP BY {col_name | expr | position}

[ASC | DESC], ... [WITH ROLLUP]][HAVING where_condition]

[ORDER BY {col_name | expr | position}

[ASC | DESC], ...][LIMIT {[offset,] row_count |row_count OFFSET offset}][PROCEDURE procedure_name(argument_list)]

[INTO OUTFILE 'file_name'

[CHARACTER SET charset_name]export_options| INTO DUMPFILE 'file_name'

| INTO var_name [, var_name]][FOR UPDATE | LOCK IN SHARE MODE]]

1.2 select中where子句使用

SELECT *|{[DISTINCT] column|select_expr [alias], ...]}[FROM [database.]table][WHERE conditions];

where条件的说明:

WHERE条件又叫做过滤条件,它从FROM子句的中间结果中去掉所有条件conditions不为TRUE(而为FALSE或者NULL)的行。

WHERE子句跟在FROM子句后面,不能在WHERE子句中使用列别名。

【示例一】where字句的基本使用

SELECT * FROM world.`city` WHERE CountryCode='CHN';or

SELECT * FROM world.`city` WHERE CountryCode='chn';

sql说明:从数据库中查找是中国的城市。

d25b1b8ee8f15cae9b78560e185eff81.png

注意:

WHERE中出现的字符串和日期字面量必须使用引号括起来

这里,字符串字面量写成大写或小写结果都一样,即不区分大小写进行查询。

这和ORACLE不同,ORACLE中WHERE条件中的字面量是区分大小写的

【示例二】where字句中的逻辑操作符

SELECT * FROMworld.`city`WHERE CountryCode='chn' AND district = 'shanxi';

sql说明: 从数据库中查找是中国的并且是山西的城市

c13b2b02d48997af5e993a641eb3e644.png

逻辑操作符介绍:

逻辑操作符

说明

and

逻辑与。只有当所有的子条件都为true时,and才返回true。否则返回false或null

or

逻辑或。只要有一个子条件为true,or就返回true。否则返回false或null

not

逻辑非。如果子条件为true,则返回false;如果子条件为false,则返回true

xor

逻辑异或。当一个子条件为true而另一个子条件为false时,其结果为true;

当两个条件都为true或都为false时,结果为false。否则,结果为null

【示例三】:where字句中的范围比较

SELECT * FROMworld.`city`WHEREpopulationBETWEEN 100000 AND 200000 ;

sql说明: 从数据库中查找人口数量在 100000-200000 之间的城市

42ff86aab14bdccc78a15c2635bb8fce.png

【示例四】:where字句中的IN

SELECT * FROMcityWHERE countrycode IN ('CHN','JPN');

sql说明: 查询中国和日本的所有城市

aec9a4349b816d849566898b65f746a4.png

【示例五】:where字句中的like

USEworld;SELECT * FROMcityWHERE countrycode LIKE 'ch%';

sql说明: 从city表中找到国家是一ch开头的。

b1519f1cd34aa4c2e7d188388d31bdec.png

like的语法:

like ‘匹配模式字符串’

实现模式匹配查询或者模糊查询:测试一个列值是否匹配给出的模式

在‘匹配模式字符串’中,可以有两个具有特殊含义的通配字符:

%:表示0个或者任意多个字符

_:只表示一个任意字符

1.3 select中ORDER BY子句

1.3.1 order by 子句的作用

ORDER BY子句用来排序行

如果SELECT语句中没有ORDER BY子句,那么结果集中行的顺序是不可预料的

语法:

SELECTexprFROM table

[WHERE condition(s)]

[ORDER BY {column, expr, numeric_position} [Asc|DEsc]];

部分参数说明:

参数

参数说明

Asc

执行升序排序。默认值

DEsc

执行降序排序

使用方法

ORDER BY子句一般在SELECT语句的最后面

1.3.2 order by 示例

【示例一】Order by基本使用

SELECT * FROMcityORDER BY population;

sql说明:将城市表按照人口数量升序排列

e3fb628ecc748789e2926978b3dfea15.png

【示例二】多个排序条件

SELECT * FROMcityORDER BY population,countrycode;

sql说明: 按照人口和国家进行排序

8c4af0651f719e19e2660a208f68efb5.png

【示例三】以select字句列编号排序

SELECT * FROMcityORDER BY 5;

sql说明:按照第5列进行排序

10dd72785b22488c0368ea730ff9e62a.png

【示例四】desc实践

SELECT * FROMcityORDER BY 5 DESC;

sql说明: 按照第列进行逆序排列

0b46916736b8ed1e99b306273b96b1d3.png

说明:NULL值的排序

在MySQL中,把NULL值当做一列值中的最小值对待。

因此,升序排序时,它出现在最前面。

1.4 LIMIT子句

特点说明:

MySQL特有的子句。

它是SELECT语句中的最后一个子句(在order by后面)。

它用来表示从结果集中选取最前面或最后面的几行。

偏移量offset的最小值为0。

语法:

limit [OFFSET ]或者

limit[,]

查询示例

SELECT * FROMcityORDER BY 5 DEscLIMIT4;

sql说明: 获取排序后的前4行

1ff7d764fc8645d6c669813612603e2d.png

注:先按照人口数量进行降序排序,然后使用limit从中挑出最前面的4行。

如果没有order by子句,返回的4行就是不可预料的。

1.5 多表连接查询

1.5.1 传统的连接写法(使用where)

SELECTNAME,ci.countrycode ,cl.language ,ci.populationFROMcity ci , countrylanguage clWHERE ci.`CountryCode`=cl.countrycode;

sql说明: city定别名为ci ,国家定别名问为cl,进行连表查询,NAME是共同的键值,使用where条件进行连接。

bb952f5601766badc0060a2889b1a8c0.png

注意:一旦给表定义了别名,那么原始的表名就不能在出现在该语句的其它子句中了

1.5.2 NATURAL  JOIN子句

自动到两张表中查找所有同名同类型的列拿来做连接列,进行相等连接

SELECTNAME,countrycode ,LANGUAGE ,populationFROM city NATURAL JOINcountrylanguageWHERE population > 1000000

ORDER BY population;

sql说明:使用natural join 进行相等连接,两个表,条件为人口大于1000000的,进行升序排列。

99140101d101e69f6e23e5aecd45f09e.png

注意:在select子句只能出现一个连接列

1.5.3 使用using子句

SELECTNAME,countrycode ,LANGUAGE ,populationFROM city JOINcountrylanguage

USING(countrycode);

sql说明:使用join进行两表的来连接,using指定countrycode为关联列。

4be4fbd53eeabfa3309e487c42cd598c.png

1.5.4 集合操作

UNION [DISTINCT]

UNION ALL

语法:

SELECT...UNION [ALL | DISTINCT]

SELECT...[UNION [ALL | DISTINCT]

SELECT ...]

⛳ UNION用于把两个或者多个select查询的结果集合并成一个

⛳ 进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致

⛳ 默认会去掉两个查询结果集中的重复行

⛳ 默认结果集不排序

⛳ 最终结果集的列名来自于第一个查询的SELECT列表

1.5.5 分组操作及分组处理

“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。

Having与Where的区别

where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

1.5.6 【select高级应用】数据库备份脚本拼接

SELECT CONCAT("mysqldump ","-uroot ","-p123 ",table_schema," ",table_name,">/tmp/",table_schema,"_",table_name,".sql")FROMinformation_schema.tablesWHERE table_schema='world'

INTO OUTFILE '/tmp/world_bak.sh'

使用concat进行拼接数据备份脚本。

817fa1182ea1cbf083c5193e55a574a5.png

-- 显示信息,可直接进行运算

SELECT CONCAT("132");SELECT CONCAT("132+123");SELECT CONCAT("132+123");

-- 查看引擎是innodb的表

SELECT TABLE_NAME FROM TABLES WHERE ENGINE='innodb';SELECTCHARACTER_SET_NAME, COLLATION_NAMEFROMINFORMATION_SCHEMA.COLLATIONSWHERE IS_DEFAULT = 'Yes';

f5164689228d844aae5f160c7c6447ad.png

-- 显示每个库下有多少表

SELECT TABLE_SCHEMA ,COUNT(*)FROMinformation_schema.`TABLES`GROUP BY TABLE_SCHEMA;

4302637285ac5e53e1f9d3fb3b03b011.png

1.5.7 子查询

子查询定义

在一个表表达中可以调用另一个表表达式,这个被调用的表表达式叫做子查询(subquery),我么也称作子选择(subselect)或内嵌选择(inner select)。子查询的结果传递给调用它的表表达式继续处理。

子查询(inner  query)先执行,然后执行主查询(outer  query)

子查询按对返回结果集的调用方法,可分为:where型子查询,from型子查询及exists型子查询。

使用子查询原则

一个子查询必须放在圆括号中。

将子查询放在比较条件的右边以增加可读性。

子查询不包含 ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句,并且如果指定了它就必须放在主 SELECT 语句的最后。

在子查询中可以使用两种比较条件:单行运算符(>, =, >=, , <=) 和多行运算符(IN, ANY, ALL)。

不相关子查询

子查询中没有使用到外部查询的表中的任何列。先执行子查询,然后执行外部查询

相关子查询(correlated subquery)

子查询中使用到了外部查询的表中的任何列。先执行外部查询,然后执行子查询

以上两种类型之下又可以分为:

行子查询(row subquery):返回的结果集是 1行 N 列

列子查询(columnsubquery):返回的结果集是 N 行 1列

表子查询(tablesubquery):返回的结果集是 N 行 N 列

标量子查询(scalar subquery):返回1行1列一个值

子查询示例

创建数据表

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 CREATE TABLEPLAYERS2 (PLAYERNO INTEGER NOT NULL,3 NAME CHAR(15) NOT NULL,4 INITIALS CHAR(3) NOT NULL,5 BIRTH_DATE DATE ,6 SEX CHAR(1) NOT NULL,7 JOINED SMALLINT NOT NULL,8 STREET VARCHAR(30) NOT NULL,9 HOUSENO CHAR(4) ,10 POSTCODE CHAR(6) ,11 TOWN VARCHAR(30) NOT NULL,12 PHONENO CHAR(13) ,13 LEAGUENO CHAR(4) ,14 PRIMARY KEY(PLAYERNO));15

16 CREATE TABLEPENALTIES17 (PAYMENTNO INTEGER NOT NULL,18 PLAYERNO INTEGER NOT NULL,19 PAYMENT_DATE DATE NOT NULL,20 AMOUNT DECIMAL(7,2) NOT NULL,21 PRIMARY KEY(PAYMENTNO));22

23 INSERT INTO PLAYERS VALUES (2, 'Everett', 'R', '1948-09-01', 'M', 1975, 'Stoney Road','43', '3575NH', 'Stratford', '070-237893', '2411');24 INSERT INTO PLAYERS VALUES (6, 'Parmenter', 'R', '1964-06-25', 'M', 1977, 'Haseltine Lane','80', '1234KK', 'Stratford', '070-476537', '8467');25 INSERT INTO PLAYERS VALUES (7, 'Wise', 'GWS', '1963-05-11', 'M', 1981, 'Edgecombe Way','39', '9758VB', 'Stratford', '070-347689', NULL);26 INSERT INTO PLAYERS VALUES (8, 'Newcastle', 'B', '1962-07-08', 'F', 1980, 'Station Road','4', '6584WO', 'Inglewood', '070-458458', '2983');27 INSERT INTO PLAYERS VALUES (27, 'Collins', 'DD', '1964-12-28', 'F', 1983, 'Long Drive','804', '8457DK', 'Eltham', '079-234857', '2513');28 INSERT INTO PLAYERS VALUES (28, 'Collins', 'C', '1963-06-22', 'F', 1983, 'Old Main Road','10', '1294QK', 'Midhurst', '010-659599', NULL);29 INSERT INTO PLAYERS VALUES (39, 'Bishop', 'D', '1956-10-29', 'M', 1980, 'Eaton Square','78', '9629CD', 'Stratford', '070-393435', NULL);30 INSERT INTO PLAYERS VALUES (44, 'Baker', 'E', '1963-01-09', 'M', 1980, 'Lewis Street','23', '4444LJ', 'Inglewood', '070-368753', '1124');31 INSERT INTO PLAYERS VALUES (57, 'Brown', 'M', '1971-08-17', 'M', 1985, 'Edgecombe Way','16', '4377CB', 'Stratford', '070-473458', '6409');32 INSERT INTO PLAYERS VALUES (83, 'Hope', 'PK', '1956-11-11', 'M', 1982, 'Magdalene Road','16A', '1812UP', 'Stratford', '070-353548', '1608');33 INSERT INTO PLAYERS VALUES (95, 'Miller', 'P', '1963-05-14', 'M', 1972, 'High Street','33A', '5746OP', 'Douglas', '070-867564', NULL);34 INSERT INTO PLAYERS VALUES (100, 'Parmenter', 'P', '1963-02-28', 'M', 1979, 'Haseltine Lane','80', '6494SG', 'Stratford', '070-494593', '6524');35 INSERT INTO PLAYERS VALUES (104, 'Moorman', 'D', '1970-05-10', 'F', 1984, 'Stout Street','65', '9437AO', 'Eltham', '079-987571', '7060');36 INSERT INTO PLAYERS VALUES (112, 'Bailey', 'IP', '1963-10-01', 'F', 1984, 'Vixen Road','8', '6392LK', 'Plymouth', '010-548745', '1319');37

38 INSERT INTO PENALTIES VALUES (1, 6, '1980-12-08',100);39 INSERT INTO PENALTIES VALUES (2, 44, '1981-05-05', 75);40 INSERT INTO PENALTIES VALUES (3, 27, '1983-09-10',100);41 INSERT INTO PENALTIES VALUES (4,104, '1984-12-08', 50);42 INSERT INTO PENALTIES VALUES (5, 44, '1980-12-08', 25);43 INSERT INTO PENALTIES VALUES (6, 8, '1980-12-08', 25);44 INSERT INTO PENALTIES VALUES (7, 44, '1982-12-30', 30);45 INSERT INTO PENALTIES VALUES (8, 27, '1984-11-12', 75);

View Code 创建数据库语句

例一、获取和100号球员性别相同并且居住在同一城市的球员号码。

selectplayernofromplayerswhere (sex, town) =(selectsex, townfromplayerswhere playerno = 100);

例二、获取和27号球员出生在同一年的球员的号码

selectplayernofromplayerswhere year(birth_date) =(select year(birth_date)fromplayerswhere playerno = 27)and playerno <> 27;

例三、获取那些至少支付了一次罚款的球员的名字和首字母。

selectname, initialsfromplayerswhere exists(select * frompenaltieswhere playerno = players.playerno);

例四、获取那些从来没有罚款的球员的名字和首字母。

selectname, initialsfromplayerswhere not exists(select * frompenaltieswhere playerno = players.playerno);

1.6 Informatica_schema获取元数据

1.6.1 元数据访问方法

查询 INFORMATION_SCHEMA 数据库表。其中包含 MySQL 数据库服务器所管理的所有对象的相关数据

使用 SHOW 语句。用于获取数据库和表信息的 MySQL 专用语句

使用 DESCRIBE(或 DESC)语句。用于检查表结构和列属性的快捷方式

使用 mysqlshow 客户端程序。SHOW 语法的命令行程序

INFORMATION_SCHEMA数据库优点介绍

充当数据库元数据的中央系统信息库,模式和模式对象,服务器统计信息(状态变量、设置、连接) 。

采用表格式以实现灵活访问,使用任意 SELECT 语句。是“虚拟数据库”,表并非“真实”表(基表),而是“系统视图”,根据当前用户的特权动态填充表。

列出 INFORMATION_SCHEMA数据库中所有的表:

mysql> USEinformation_schema;Databasechanged

mysql>SHOW TABLES;+---------------------------------------+

| Tables_in_information_schema |

+---------------------------------------+

| CHARACTER_SETS |

| COLLATIONS |

| COLLATION_CHARACTER_SET_APPLICABILITY |

| COLUMNS |

| COLUMN_PRIVILEGES |

1.6.2 对 INFORMATION_SCHEMA 使用 SELECT

示例一:

查找引擎是innodb的表。

SELECTTABLE_NAME, ENGINEFROMINFORMATION_SCHEMA.TABLESWHERE ENGINE= 'innodb';

78e1d545c2f3e42568e7af0f9699230a.png

示例二:

SELECTTABLE_SCHEMA, TABLE_NAME, COLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERE DATA_TYPE = 'set';

sql说明:查找数据类型是set的表

8590febd9e2c6666b3774a9e6ce24115.png

示例三:

SELECTCHARACTER_SET_NAME, COLLATION_NAME,IS_DEFAULTFROMINFORMATION_SCHEMA.COLLATIONSWHERE IS_DEFAULT = 'Yes';

sql说明:查看找默认为yes的表

6926691af96682fb9f6352601f83999c.png

示例四:

SELECT TABLE_SCHEMA, COUNT(*)FROMINFORMATION_SCHEMA.TABLESGROUP BY TABLE_SCHEMA;

sql说明:查看每个数据库下表的个数

53ffd726c3b1a600b5b4f40146e4fcea.png

使用 INFORMATION_SCHEMA 表获取有关创建 shell 命令的信息。

SELECT CONCAT("mysqldump -uroot -p ",

TABLE_SCHEMA," ", TABLE_NAME, ">>",

TABLE_SCHEMA,".bak.sql")FROM TABLES WHERE TABLE_NAME LIKE 'Country%'

c6e39f181b11f50fdc3a015463e0e40f.png

1.6.3 使用 mysql 命令创建 SQL 语句。

mysql -uroot -p123 --silent --skip-column-names -e "SELECT CONCAT('CREATE TABLE ', TABLE_SCHEMA, '.',TABLE_NAME, '_backup LIKE ', TABLE_SCHEMA, '.',TABLE_NAME, ';')

FROMINFORMATION_SCHEMA.TABLESWHERE TABLE_SCHEMA = 'world_innodb';"

1.6.4 MySQL中的show语句

SOHW databases:列出所有数据库

SHOW TABLES:列出默认数据库中的表

SHOW TABLES FROM:列出指定数据库中的表

SHOW COLUMNS FROM:显示表的列结构

SHOW INDEX FROM:显示表中有关索引和索引列的信息

SHOW CHARACTER SET:显示可用的字符集及其默认整理

SHOW COLLATION:显示每个字符集的整理

SHOW STATUS:列出当前数据库状态

SHOW VARIABLES:列出数据库中的参数定义值

SHOW PROCESSLIST 查看当前的连接数量

1.6.5 DESCRIBE 语句

DESCRIBE 语句 等效于 SHOW COLUMNS

一般语法:

mysql> DESCRIBE ;

显示 INFORMATION_SCHEMA 表信息

mysql>DESCRIBE INFORMATION_SCHEMA.CHARACTER_SETS;+----------------------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------------------+-------------+------+-----+---------+-------+

| CHARACTER_SET_NAME | varchar(32) | NO | | | |

| DEFAULT_COLLATE_NAME | varchar(32) | NO | | | |

| DESCRIPTION | varchar(60) | NO | | | |

| MAXLEN | bigint(3) | NO | | 0 | |

+----------------------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

有关数据库和表的结构的信息与 SHOW 语句相似

一般语法:

shell> mysqlshow [options] [db_name [table_name[column_name]]]

显示所有数据库或特定数据库、表和/或列的相关信息:

[root@db02 ~]# mysqlshow -uroot -p123

Warning: Using a passwordonthe command line interface can be insecure.+--------------------+

| Databases |

+--------------------+

| information_schema |

| clsn |

| haha |

| mysql |

| oldboy |

| performance_schema |

| world |

+--------------------+

查看数据库下的表

[root@db02 ~]# mysqlshow -uroot -p123 world

Warning: Using a passwordonthe command line interface can be insecure.Database: world+-----------------+

| Tables |

+-----------------+

| PENALTIES |

| PLAYERS |

| city |

| country |

| countrylanguage |

+-----------------+

查看数据库下表记录

[root@db02 ~]# mysqlshow -uroot -p123 world city

Warning: Using a passwordonthe command line interface can be insecure.Database: world Table: city+-------------+----------+-------------------+------+-----+---------+----------------+---------------------------------+---------+

| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |

+-------------+----------+-------------------+------+-----+---------+----------------+---------------------------------+---------+

| ID | int(11) | | NO | PRI | | auto_increment | select,insert,update,references | |

| Name | char(35) | latin1_swedish_ci | NO | | | | select,insert,update,references | |

| CountryCode | char(3) | latin1_swedish_ci | NO | MUL | | | select,insert,update,references | |

| District | char(20) | latin1_swedish_ci | NO | | | | select,insert,update,references | |

| Population | int(11) | | NO | | 0 | | select,insert,update,references | |

+-------------+----------+-------------------+------+-----+---------+----------------+---------------------------------+---------+

查看记录信息

[root@db02 ~]# mysqlshow -uroot -p123 world city CountryCode

Warning: Using a passwordonthe command line interface can be insecure.Database: world Table: city Wildcard: CountryCode+-------------+---------+-------------------+------+-----+---------+-------+---------------------------------+---------+

| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |

+-------------+---------+-------------------+------+-----+---------+-------+---------------------------------+---------+

| CountryCode | char(3) | latin1_swedish_ci | NO | MUL | | | select,insert,update,references | |

+-------------+---------+-------------------+------+-----+---------+-------+---------------------------------+---------+

查看数据库类似like。

[root@db02 ~]# mysqlshow -uroot -p123 "w%"

Warning: Using a passwordonthe command line interface can be insecure.

Wildcard: w%

+-----------+

| Databases |

+-----------+

| world |

+-----------+

1.7 参考文献

https://dev.mysql.com/doc/refman/5.6/en/select.html SELECT语法官方说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值