MySQL-Select语句高级应用
Posted 惨绿少年@clsn.io
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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说明:从数据库中查找是中国的城市。
注意:
WHERE中出现的字符串和日期字面量必须使用引号括起来
这里,字符串字面量写成大写或小写结果都一样,即不区分大小写进行查询。
这和ORACLE不同,ORACLE中WHERE条件中的字面量是区分大小写的
【示例二】where字句中的逻辑操作符
SELECT * FROM world.`city` WHERE CountryCode=\'chn\' AND district = \'shanxi\';
sql说明: 从数据库中查找是中国的并且是山西的城市
逻辑操作符介绍:
逻辑操作符 |
说明 |
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 * FROM world.`city` WHERE population BETWEEN 100000 AND 200000 ;
sql说明: 从数据库中查找人口数量在 100000-200000 之间的城市
【示例四】:where字句中的IN
SELECT * FROM city WHERE countrycode IN (\'CHN\',\'JPN\');
sql说明: 查询中国和日本的所有城市
【示例五】:where字句中的like
USE world; SELECT * FROM city WHERE countrycode LIKE \'ch%\';
sql说明: 从city表中找到国家是一ch开头的。
like的语法:
like ‘匹配模式字符串’
实现模式匹配查询或者模糊查询:测试一个列值是否匹配给出的模式
在‘匹配模式字符串’中,可以有两个具有特殊含义的通配字符:
%:表示0个或者任意多个字符 _:只表示一个任意字符
1.3 select中ORDER BY子句
1.3.1 order by 子句的作用
ORDER BY子句用来排序行
如果SELECT语句中没有ORDER BY子句,那么结果集中行的顺序是不可预料的
语法:
SELECT expr FROM 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 * FROM city ORDER BY population;
sql说明:将城市表按照人口数量升序排列
【示例二】多个排序条件
SELECT * FROM city ORDER BY population,countrycode;
sql说明: 按照人口和国家进行排序
【示例三】以select字句列编号排序
SELECT * FROM city ORDER BY 5;
sql说明:按照第5列进行排序
【示例四】desc实践
SELECT * FROM city ORDER BY 5 DESC;
sql说明: 按照第列进行逆序排列
说明:NULL值的排序
在MySQL中,把NULL值当做一列值中的最小值对待。
因此,升序排序时,它出现在最前面。
1.4 LIMIT子句
特点说明:
MySQL特有的子句。
它是SELECT语句中的最后一个子句(在order by后面)。
它用来表示从结果集中选取最前面或最后面的几行。
偏移量offset的最小值为0。
语法:
limit <获取的行数> [OFFSET <跳过的行数>] 或者 limit [<跳过的行数>,] <获取的行数>
查询示例
SELECT * FROM city ORDER BY 5 DEsc LIMIT 4;
sql说明: 获取排序后的前4行
注:先按照人口数量进行降序排序,然后使用limit从中挑出最前面的4行。
如果没有order by子句,返回的4行就是不可预料的。
1.5 多表连接查询
1.5.1 传统的连接写法(使用where)
SELECT NAME,ci.countrycode ,cl.language ,ci.population FROM city ci , countrylanguage cl WHERE ci.`CountryCode`=cl.countrycode;
sql说明: city定别名为ci ,国家定别名问为cl,进行连表查询,NAME是共同的键值,使用where条件进行连接。
注意:一旦给表定义了别名,那么原始的表名就不能在出现在该语句的其它子句中了
1.5.2 NATURAL JOIN子句
自动到两张表中查找所有同名同类型的列拿来做连接列,进行相等连接
SELECT NAME,countrycode ,LANGUAGE ,population FROM city NATURAL JOIN countrylanguage WHERE population > 1000000 ORDER BY population;
sql说明:使用natural join 进行相等连接,两个表,条件为人口大于1000000的,进行升序排列。
注意:在select子句只能出现一个连接列
1.5.3 使用using子句
SELECT NAME,countrycode ,LANGUAGE ,population FROM city JOIN countrylanguage USING(countrycode);
sql说明:使用join进行两表的来连接,using指定countrycode为关联列。
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") FROM information_schema.tables WHERE table_schema=\'world\' INTO OUTFILE \'/tmp/world_bak.sh\'
使用concat进行拼接数据备份脚本。
-- 显示信息,可直接进行运算
SELECT CONCAT("132"); SELECT CONCAT("132+123"); SELECT CONCAT("132+123");
-- 查看引擎是innodb的表
SELECT TABLE_NAME FROM TABLES WHERE ENGINE=\'innodb\'; SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATIONS WHERE IS_DEFAULT = \'Yes\';
-- 显示每个库下有多少表
SELECT TABLE_SCHEMA ,COUNT(*) FROM information_schema.`TABLES` GROUP BY TABLE_SCHEMA;
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 列 列子查询(column subquery):返回的结果集是 N 行 1列 表子查询(table subquery):返回的结果集是 N 行 N 列 标量子查询(scalar subquery):返回1行1列一个值
子查询示例
创建数据表
1 CREATE TABLE PLAYERS 2 (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 TABLE PENALTIES 17 (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, 以上是关于MySQL-Select语句高级应用的主要内容,如果未能解决你的问题,请参考以下文章实习MySQL-select count(*)和select count
Vue3官网-高级指南(十七)响应式计算`computed`和侦听`watchEffect`(onTrackonTriggeronInvalidate副作用的刷新时机`watch` pre)(代码片段