Advanced SQL statements for MySQL database (detailed graphic and text!)


Preparation: first create a database and table

mysql -uroot -p
show databases;

create database plane;
use plane;
create table destination (
region char(20),
place_name char(20));

insert into destination values('southwest','chengdu');
insert into destination values('north China','beijing');
insert into destination values('southwest','kunming');
insert into destination values('north China','tianjin');
select * from destination;

create table info (
place_name char(20),
sales int(10),
date char(10));

insert into info values('chengdu','350','2021-02-10');
insert into info values('beijing','294','2021-02-10');
insert into info values('kunming','330','2021-02-10');
insert into info values('beijing','392','2021-02-16');
select * from info;

Insert picture description here
Insert picture description here

One, MySQL advanced statement

1.SELECT

Display all data in one or several fields in the table

语法:SELECT "栏位" FROM "表名";
例:
select region from destination;
select date,sales from info;
select date,sales from info;

Insert picture description here

2.DISTINCT

Do not show duplicate data

语法:SELECT DISTINCT "栏位" FROM "表名";
例:
select place_name from info;
select distinct place_name from info;

Insert picture description here

3.WHERE

Conditional query

语法:SELECT "栏位" FROM "表名" WHERE "条件";
例:
select * from info;
select place_name from info where sales > 300;

Insert picture description here

4.AND|OR

And|or

语法:SELECT "栏位" FROM "表名" WHERE "条件1" {
    
    [AND|OR] "条件2"}+ ;
例:
select * from info;
select place_name from info where sales > 350 or sales < 300;
select place_name from info where sales > 300 and sales < 350;

Insert picture description here

5.IN

Display data of known values

语法:SELECT "栏位" FROM "表名" WHERE "栏位" IN ('值1', '值2', ...);
例:
select * from info where place_name in ('beijing');
select * from info where place_name in ('beijing','kunming');

Insert picture description here

6.BETWEEN

Display data within two value ranges

语法:SELECT "栏位" FROM "表名" WHERE "栏位" BETWEEN '值1' AND '值2';
例:
select * from info where sales between '300' and '350';

Insert picture description here

7. Wildcard

Usually wildcards are used with LIKE

% :百分号表示零个、一个或多个字符
_ :下划线表示单个字符
例:
'A_Z':所有以 'A' 起头,另一个任何值的字符,且以 'Z' 为结尾的字符串。例如,'ABZ''A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字符,而不是一个字符)'ABC%': 所有以 'ABC' 起头的字符串。例如,'ABCD''ABCABC' 都符合这个模式。
'%XYZ': 所有以 'XYZ' 结尾的字符串。例如,'WXYZ''ZZXYZ' 都符合这个模式。
'%AN%': 所有含有 'AN'这个模式的字符串。例如,'LOS ANGELES''SAN FRANCISCO' 都符合这个模式。
'_AN%':所有第二个字母为 'A' 和第三个字母为 'N' 的字符串。例如,'SAN FRANCISCO' 符合这个模式,而 'LOS ANGELES' 则不符合这个模式。

8.LIKE

Match a pattern to find the information we want

语法:SELECT "栏位" FROM "表名" WHERE "栏位" LIKE {
    
    模式};
例:
select * from info where place_name like '_ei%';

Insert picture description here

9.ORDER BY

Sort by keyword

语法:SELECT "栏位" FROM "表名" [WHERE "条件"] ORDER BY "栏位" [ASC, DESC];
#ASC 是按照升序进行排序的,是默认的排序方式。(Ascending)
#DESC 是按降序方式进行排序。(Descending)
例:
select place_name,sales,date from info order by sales;
select place_name,sales,date from info order by sales asc;
select place_name,sales,date from info order by sales desc;

Insert picture description here

10. Function

(1) Mathematical functions

abs(x)	          返回 x 的绝对值
rand()	          返回 0 到 1 的随机数
mod(x,y)	      返回 x 除以 y 以后的余数
power(x,y)        返回 x 的 y 次方
round(x)	      返回离 x 最近的整数
round(x,y)        保留 x 的 y 位小数四舍五入后的值
sqrt(x)	          返回 x 的平方根
truncate(x,y)	  返回数字 x 截断为 y 位小数的值
ceil(x)	          返回大于或等于 x 的最小整数
floor(x)	      返回小于或等于 x 的最大整数
greatest(x1,x2…)  返回集合中最大的值
least(x1,x2…)	  返回集合中最小的值

SELECT abs(-1), rand(), mod(5,3), power(2,3), round(1.89);
SELECT round(1.8937,3), truncate(1.235,2), ceil(5.2), floor(2.1), least(1.89,3,6.1,2.1);

Insert picture description here

(2) Aggregate function

avg()	返回指定列的平均值
count()	返回指定列中非 NULL 值的个数
min()	返回指定列的最小值
max()	返回指定列的最大值
sum(x)	返回指定列的所有值之和

#count(*)包括了所有的列的行数,在统计结果的时候,不会忽略值为NULL
#count(列名)只包括列名那一列的行数,在统计结果的时候,会忽略列值为NULL的行

例:
select avg(sales) from info;

select count(place_name) from info;
select count(distinct place_name) from info;

select max(sales) from info;
select min(sales) from info;

select sum(sales) from info;

Insert picture description here
Insert picture description here

(3) String function

trim()	返回去除指定格式的值
concat(x,y)	将提供的参数 x 和 y 拼接成一个字符串
substr(x,y)	获取从字符串 x 中的第 y 个位置开始的字符串,跟substring()函数作用相同
substr(x,y,z)	获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
length(x)	返回字符串 x 的长度
replace(x,y,z)	将字符串 z 替代字符串 x 中的字符串 y
upper(x)	将字符串 x 的所有字母变成大写字母
lower(x)	将字符串 x 的所有字母变成小写字母
left(x,y)	返回字符串 x 的前 y 个字符
right(x,y)	返回字符串 x 的后 y 个字符
repeat(x,y)	将字符串 x 重复 y 次
space(x)	返回 x 个空格
strcmp(x,y)	比较 x 和 y,返回的值可以为-1,0,1
reverse(x)	将字符串 x 反转

Note: If sql_mode is turned on and PIPES_AS_CONCAT is turned on, "||" is regarded as a string concatenation operator instead of an or operator, which is similar to the string concatenation function Concat, which is the same as the Oracle database using
Insert picture description here
trim() return removal Specify the value of the format

select TRIM ([ [位置] [要移除的字符串] from ] 字符串);
#[位置]:的值可以为 LEADING (起头), TRAILING (结尾), BOTH (起头及结尾)。 
#[要移除的字符串]:从字串的起头、结尾,或起头及结尾移除的字符串。缺省时为空格。
例:
select trim(leading '123' from '1234567');

Insert picture description here
concat(x,y) concatenate the provided parameters x and y into a string

select concat(region, place_name) from destination;

select region || ' ' || place_name from destination;
select region || ' ' || place_name from destination where place_name = 'beijing';

Insert picture description here
Insert picture description here
substr(x,y) Get the string starting from the yth position in the string
x, which has the same effect as the substring() function substr(x,y,z) Get the length starting from the yth position in the string x A string of z

select * from destination;
select substr(place_name,3) from destination where place_name = 'beijing';
select substr(place_name,2,4) from destination where place_name = 'beijing';

Insert picture description here
length(x) returns the length of string x

select place_name from destination;
select length(place_name) from destination;
select region,length(place_name) from destination;

Insert picture description here
replace(x,y,z) replaces the string z with the string y in the string x
Insert picture description here
upper(x) changes all the letters of the string x to uppercase letters
lower(x) changes all the letters of the string x to lowercase letter

select * from destination;
select upper(region) from destination;
select lower(region) from destination;

Insert picture description here
left(x,y) returns the first y characters of the string x
right(x,y) returns the last y characters of the string x

Insert picture description here
repeat(x,y) Repeats the string x y times

select repeat(region,2) from destination;
select repeat(123,2);

Insert picture description here
space(x) returns x spaces

select space(20);
select space(10);

Insert picture description here
strcmp(x,y) compares x and y, the returned value can be -1,0,1

select strcmp(5,6);
select strcmp(5,5);
select strcmp(6,5);

Insert picture description here
reverse(x) reverse the string x
Insert picture description here

11.GROUP BY

To summarize and group the query results of the column after GROUP BY.
Note:
1) It is usually used in combination with aggregate functions.
2) There is a principle of GROUP BY, that is, in all the columns after SELECT, columns that do not use aggregate functions must appear After GROUP BY.

语法:SELECT "栏位1", SUM("栏位2") FROM "表名" GROUP BY "栏位1";
例:
select place_name,sum(sales) from info group by place_name order by sum(sales);

Insert picture description here

12.HAVING

Used to filter the record table returned by the GROUP BY statement.
Note:
1) It is usually used in conjunction with the GROUP BY statement.
2) The existence of the HAVING statement makes up for the deficiency that the WHERE keyword cannot be used in conjunction with aggregate functions. If only the function column is selected, the GROUP BY clause is not required.

语法:SELECT "栏位1", SUM("栏位2") FROM "表格名" GROUP BY "栏位1" HAVING (函数条件);
例:
select place_name,sum(sales) from info group by place_name having sum(sales) > 400;

Insert picture description here

13. Alias

Field alias

语法:SELECT "表格別名"."栏位1" [AS] "栏位別名" FROM "表格名" [AS] "表格別名";
例:
select A.place_name "name",sum(A.sales) "sum_sales" from info A group by name;

Insert picture description here

14. Subquery: join table

Insert another SQL statement in the sub WHERE clause or HAVING clause

语法:
#外查询
SELECT "栏位1" FROM "表格1" WHERE "栏位2" [比较运算符]
#内查询
(SELECT "栏位1" FROM "表格2" WHERE "条件");
#可以是符号的运算符,例如:=、>、<、>=、<= ;也可以是文字的运算符,例如 LIKE、IN、BETWEEN

Example 1:

select sum(sales) from info where place_name in (select place_name from destination where region = 'southwest');
#下面这个句子就是上面的简化版
select sum(sales) from info where place_name in('chengdu','kunming');

Example 2:

select sum(a.sales) from info a where a.place_name in(select place_name from destination b where b.place_name = a.place_name);
select sum(a.sales) from info a where a.place_name in(select place_name from destination b where b.place_name = a.place_name);

Insert picture description here
Insert picture description here
Insert picture description here

15.EXISTS

Used to test whether the inner query produces any results

  • Whether similar boolean values ​​are true
  • If so, the system will execute the SQL statement in the outer query. If not, then the entire SQL statement will not produce any results.
语法:SELECT "栏位1" FROM "表格1" WHERE EXISTS (SELECT * FROM "表格2" WHERE "条件");
例:
select sum(sales) from info where exists (select * from destination where region = 'southwest');

Insert picture description here

Two, connection query

Insert picture description here

1.inner join (equal value connected)

Only return rows with equal join fields in two tables

SELECT * FROM 表1 表1的别名 INNER JOIN 表2 表2的别名 on 表1别名.栏位 = 表2别名.栏位;  #这里的栏位名称相同
例:
select * from destination a inner join info b on a.place_name = b.place_name;

Insert picture description here

2.left join (left join)

Return including all records in the left table and the records in the right table where the join field is equal

SELECT * FROM 表1 表1的别名 LEFT JOIN 表2 表2的别名 on 表1别名.栏位 = 表2别名.栏位;  #这里的栏位名称相同
例:
select * from destination a left join info b on a.place_name = b.place_name;

Insert picture description here

3.right join (right join)

Return including all records in the right table and the records in the left table where the join field is equal

SELECT * FROM 表1 表1的别名 RIGHT JOIN 表2 表2的别名 on 表1别名.栏位 = 表2别名.栏位;  #这里的栏位名称相同
例:
select * from destination a right join info b on a.place_name = b.place_name;

Insert picture description here

Guess you like

Origin blog.csdn.net/qq_35456705/article/details/114083233