当前位置:Gxlcms > 数据库问题 > MySQL-Select语句高级应用

MySQL-Select语句高级应用

时间:2021-07-01 10:21:17 帮助过:2人阅读

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。否则返回falsenull

or

逻辑或。只要有一个子条件为trueor就返回true。否则返回falsenull

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, 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

                  

	 	
                    
                    
                    
                    
                    
                

人气教程排行