MySQLハイレベルSQL文(データベースに余裕を持たせるために習得)


文書ディレクトリ
環境準備:
use gcc;
create table location (Region char(20),Store_Name char(20));
insert into location values('East','Boston');
insert into location values('East','New York');
insert into location values('West','Los Angeles');
insert into location values('West','Houston');

select * from location;
location     :
+--------+-------------+
| Region | Store_Name  |
+--------+-------------+
| East   | Boston      |
| East   | New York    |
| West   | Los Angeles |
| West   | Houston     |
+--------+-------------+
4 rows in set (0.00 sec)


create table Store_Info (Store_Name char(20),Sales int(10),Date char(10));
insert into Store_Info values('Los Angeles','1500','2020-12-05');
insert into Store_Info values('Houston','250','2020-12-07');
insert into Store_Info values('Los Angeles','300','2020-12-08');
insert into Store_Info values('Boston','700','2020-12-08');

 select * from Store_Info;
 +-------------+-------+------------+
| Store_Name  | Sales | Date       |
+-------------+-------+------------+
| Los Angeles |  1500 | 2020-12-05 |
| Houston     |   250 | 2020-12-07 |
| Los Angeles |   300 | 2020-12-08 |
| Boston      |   700 | 2020-12-08 |
+-------------+-------+------------+
4 rows in set (0.00 sec)
-----SELECT -------                 
  : SELECT "  " FROM "  ";
SELECT Store_Name FROM Store_Info;

---- DISTINCT ----        
  : SELECT DISTINCT "  " FROM "  ";
SELECT DISTINCT Store_Name FROM Store_Info;

-----WHERE-------     
  : SELECT "  " FROM "  " WHERE "  ";
SELECT Store_Name FROM Store_Info WHERE Sales > 1000;

-----AND OR -----   
  : SELECT "  " FROM "  " WHERE "  1" [AND|OR] "  2"+ ;
SELECT Store_Name FROM Store_Info WHERE Sales > 1000 OR (Sales < 500 AND Sales > 200);

----IN-----------         
  : SELECT "  " FROM "  " WHERE "  " IN (' 1',' 2',...);
SELECT * FROM Store_Info WHERE Store_Name IN ('Los Angeles','Houston');

----BETWEEN------           
  : SELECT "  " FROM "  " WHERE "  " BETWEEN ' 1' AND ' 2';
SELECT * FROM Store_Info WHERE Date BETWEEN '2020-12-06' AND '2020-12-10';

------   -------         LIKE      
% : 
_ :          
'A_Z':    'A'  ,         ,  'Z'       。  ,'ABZ'  'A2Z''AKKZ'     
'ABC%':    'ABC'  'ABCD'  'ABCABC' 
'%XYZ':    'XYZ'  'WXYZ'  'ZZXYZ' 
'%AN%':     'AN'        。  ,'LOS ANGELES' 'SAN FRANCISCO' 
'_AN%':         'A'        'N'     。  ,'SAN FRANCISCO' 'LOS ANGELES'

------LIKE----               
  : SELECT "  ” FROM "  " WHERE "  " LIKE {
       };
SELECT * FROM Store_Info WHERE Store_Name like '%os%';

---- ORDER BY -----      
  : SELECT "  " FROM "  " [WHERE "  "] ORDER BY "  " [ASC,DESC];
#ASC          ,        。
#DESC          。
SELECT Store_Name,Sales,Date FROM Store_Info ORDER BY Sales DESC;

---------------------------------------------------------------------------------1、数学関数:
関数#カンスウ#
さぎょう
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.253,2),ceil(5.2),floor(2.1),least(1.89,3,6.1,3.3);

2、集約関数:
関数#カンスウ#
さぎょう
avg()
指定した列の平均値を返します.
count()
指定したカラムのNULL以外の値の数を返します.
min()
指定した列の最小値を返します.
max()
指定した列の最大値を返します.
sum(x)
指定した列のすべての値の和を返します.
例:
SELECT avg(Sales) FROM Store_Info;

SELECT count(Store_Name) FROM Store_Info;
SELECT count(DISTINCT Store_Name) FROM Store_Info;   #DISTINCT        
#count(*)           ,        ,       NULL( )  ;
#count(  )            ,        ,      NULL( )  。

SELECT max(Sales) FROM Store_Info;
SELECT min(Sales) FROM Store_Info;
SELECT sum(Sales) FROM Store_Info;

3、文字列関数:
関数#カンスウ#
さぎょう
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)
文字列xの文字列yを文字列zで置き換える
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を反転
例:
SELECT concat(Region,Store_Name) FROM location WHERE Store_Name ='Boston';

+---------------------------+
| concat(Region,Store_Name) |
+---------------------------+
| EastBoston                |
+---------------------------+
1 row in set (0.00 sec)


# sql_mode      PIPES_AS_CONCAT(    /etc/my.cnf       )"||"                 ,         Concat   ,  Oracle         
SELECT Region || ' ' || Store_Name FROM location WHERE Store_Name = 'Boston';

+-----------------------------+
| Region || ' ' || Store_Name |
+-----------------------------+
| East Boston                 |
+-----------------------------+
1 row in set (0.00 sec)


SELECT substr(Store_Name,3) FROM location WHERE Store_Name = 'Los Angeles';
SELECT substr(Store_Name,2,4) FROM location WHERE Store_Name = 'New York';

SELECT TRIM ([  ] [       ] FROM    );
#[  ]:      LEADING (  ),TRAILING (  ),BOTH (     )
#[       ]:       、              。      。
SELECT TRIM(LEADING 'Ne' FROM 'New York');

SELECT Region,length(Store_Name) FROM location;
SELECT REPLACE (Region,'ast','astern') FROM location;
------GROUP BY------ GROUP BY                ,              
GROUP BY  SELECT        ,          ,     GROUPBY  。

  : SELECT "  1",SUM("  2") FROM "  " GROUP BY "  1";
SELECT Store_Name,SUM(Sales) FROM Store_Info GROUP BY Store_Name ORDER BY sales desc;

------- HAVING ----      GROUP BY  GROUP BY       
HAVING          WHERE  SELECT       ,     GROUP BY  。
  : SELECT "  1",SUM("  2") FROM "  " GROUP BY "  1" HAVING (    );
SELECT Store_Name,SUM(Sales) FROM Store_Info GROUP BY Store_Name HAVING SUM(Sales) > 1500;

---- ----  ---------          
  : SELECT "    "."  1" [AS] "    " FROM "   " [AS] "    ";
SELECT A.Store_Name Store,SUM(A.Sales) "Total Sales" FROM Store_Info A GROUP BY A.Store_Name;

---------   --------    , WHERE   HAVING         SQL  
  : SELECT "  1" FROM "  1" WHERE "  2 [     ]    #   
(SELECT "  1" FROM "  2" WHERE "  ");     #   

#=><>=<= ; LIKE、IN、BETWEEN
SELECT SUM(Sales) FROM Store_Info WHERE Store_Name IN
(SELECT Store_Name FROM location WHERE Region = 'West');

SELECT SUM(A.Sales) FROM Store_Info A WHERE A.Store_Name IN
(SELECT Store_Name FROM location B WHERE B.Store_Name = A.Store_Name);

SELECT Store_Name,SUM(Sales),COUNT(Sales) FROM Store_Info GROUP BY Store_Name ORDER BY Sales;
+-------------+------------+--------------+
| Store_Name  | SUM(Sales) | COUNT(Sales) |
+-------------+------------+--------------+
| Houston     |        250 |            1 |
| Boston      |        700 |            1 |
| Los Angeles |       1800 |            2 |
+-------------+------------+--------------+
3 rows in set (0.01 sec)

------- EXISTS ------                ,         
#     ,           SQL  。      ,   SQL           。
  : SELECT "  1" FROM "  1" WHERE EXISTS (SELECT * FROM "  2" WHERE "  ");
SELECT SUM(Sales) FROM Store_Info WHERE EXISTS (SELECT * FROM location WHERE Region = 'West');

SELECT SUM(Sales) FROM Store_Info WHERE Store_Name IN ('Los Angeles','Houston');
+------------+
| SUM(Sales) |
+------------+
|       2050 |
+------------+
1 row in set (0.00 sec)

--------------    ----------------
location     :
+--------+-------------+
| Region | Store_Name  |
+--------+-------------+
| East   | Boston      |
| East   | New York    |
| West   | Los Angeles |
| West   | Houston     |
+--------+-------------+
4 rows in set (0.00 sec)

UPDATE Store_Info SET store_name='Washington' WHERE sales=300;
Store_Info 
mysql> select * from Store_Info;
+-------------+-------+------------+
| Store_Name  | Sales | Date       |
+-------------+-------+------------+
| Los Angeles |  1500 | 2020-12-05 |
| Houston     |   250 | 2020-12-07 |
| Washington  |   300 | 2020-12-08 |
| Boston      |   700 | 2020-12-08 |
+-------------+-------+------------+
4 rows in set (0.00 sec)

inner join(    ):                
left join(   ):                          
right join(   ):                          

SELECT * FROM location A INNER JOIN Store_Info B on A.Store_Name = B.Store_Name;

SELECT * FROM location A RIGHT JOIN Store_Info B on A.Store_Name = B.Store_Name;

SELECT * FROM location A,Store_Info B WHERE A.Store_Name = B.Store_Name;

SELECT A.Region REGION,SUM(B.Sales) SALES FROM location A,Store_Info B WHERE A.Store_Name = B.Store_Name GROUP BY REGION;

-------------CREATE VIEW---------  ,              
         ,          ,                ,           。
                         ,       。
       ,       ,               。              ,             ,  SQL       ,           ,             ,          ,   。

  : CREATE VIEW "    " AS "SELECT   ";
CREATE VIEW V_REGION_SALES AS SELECT A.Region REGION,SUM(B.Sales) SALES FROM location A INNER JOIN Store_Info B ON A.Store_Name = B.Store_Name GROUP BY REGION;

SELECT * FROM V_REGION_SALES;
DROP VIEW V_REGION_SALES;      #    

------------UNION-------  ,   SQL         ,  SQL                  
UNION: 
  : [SELECT   1] UNION [SELECT   2];

UNION ALL: 
  : [SELECT   1] UNION ALL [SELECT   2];

SELECT Store_Name FROM location UNION SELECT Store_Name FROM Store_Info;
SELECT Store_Name FROM location UNION ALL SELECT Store_Name FROM Store_Info;

-------------   -------    SQL       
SELECT A.Store_Name FROM location A INNER JOIN Store_Info B ON A.Store_Name = B.Store_Name;

SELECT A.Store_Name FROM location A INNER JOIN Store_Info B USING(Store_Name);

SELECT A.Store_Name FROM
(SELECT Store_Name FROM location UNION ALL SELECT Store_Name FROM Store_Info) A
GROUP BY A.Store_Name HAVING COUNT(*) > 1;

#   SQL       ,     
SELECT A.Store_Name FROM (SELECT A.Store_Name FROM location A INNER JOIN Store_Info B ON A.Store_Name = B.Store_Name) A
GROUP BY A.Store_Name HAVING COUNT(*) >= 1;

SELECT DISTINCT A.Store_Name FROM location A INNER JOIN Store_Info B USING(Store_Name); _Name);

--------------    -------     SQL     ,     SQL         ,     
SELECT DISTINCT Store_Name FROM location WHERE (Store_Name) NOT IN (SELECT Store_Name FROM Store_Info);

SELECT DISTINCT A.Store_Name FROM location A
LEFT JOIN Store_Info B USING(Store_Name) WHERE B.Store_Name IS NULL;

----------- CASE -------- SQL     IF-THEN-ELSE         
  :
SELECT CASE ("   ")
  WHEN "  1" THEN "  1"
  WHEN "  2" THEN "  2"
  ......
  [ELSE "  N"]
  END
FROM "  ";

#"  "           。ELSE 

SELECT Store_Name,CASE Store_Name
  WHEN 'Los Angeles' THEN Sales * 2
  WHEN 'Boston' THEN Sales * 1.5
  ELSE Sales
  END
"New Sales", Date
FROM Store_Info;
#"New sales"     CASE         

#
CREATE TABLE Total_Sales (Name char(10),Sales int(5));
INSERT INTO Total_Sales VALUES ('zhangsan',10);
INSERT INTO Total_Sales VALUES ('lisi',15);
INSERT INTO Total_Sales VALUES ('wangwu',20);
INSERT INTO Total_Sales VALUES ('zhaoliu',40);
INSERT INTO Total_Sales VALUES ('sunqi',50);
INSERT INTO Total_Sales VALUES ('zhouba',20);
INSERT INTO Total_Sales VALUES ('wujiu',30);

Total_Sales     :
mysql> select * from Total_Sales;
+----------+-------+
| Name     | Sales |
+----------+-------+
| zhangsan |    10 |
| lisi     |    15 |
| wangwu   |    20 |
| zhaoliu  |    40 |
| sunqi    |    50 |
| zhouba   |    20 |
| wujiu    |    30 |
+----------+-------+
7 rows in set (0.00 sec)

-------    ------       (self Join),         ,       (       )     
SELECT A1.Name,A1.Sales,COUNT(A2.Sales) Rank FROM Total_Sales A1,Total_Sales A2
WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales AND A1.Name = A2.Name)
GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;
#  sales                sales   Name        ,  zhangsan 5+1=6

----------     ------------
SELECT Sales Middle FROM (SELECT A1.Name,A1.Sales,COUNT(A2.Sales) Rank FROM Total_Sales A1,Total_Sales A2
WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales AND A1.Name <= A2.Name)
GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC) A3
WHERE A3.Rank = (SELECT (COUNT(*)+1) DIV 2 FROM Total_Sales);
# A3     
#DIV   MySQL       

--------      -------      (Self Join) (       )   
SELECT A1.Name,A1.Sales,SUM(A2.Sales) Sum_Total FROM Total_Sales A1,Total_Sales A2
WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales AND A1.Name = A2.Name)
GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;

---------      --------------
SELECT A1.Name,A1.Sales,A1.Sales/(SELECT SUM(Sales) FROM Total_Sales) Per_Total
FROM Total_Sales A1,Total_Sales A2
WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales AND A1.Name = A2.Name)
GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;
#SELECT SUM(Sales) FROM Total_sales              
#

--------        --------------
SELECT A1.Name,A1.Sales,SUM(A2.Sales)/(SELECT SUM(Sales) FROM Total_Sales) Per_Total
FROM Total_Sales A1,Total_Sales A2
WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales and A1.Name = A2.Name)
GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;

#     SUM(a2.sales)                   .

SELECT A1.Name,A1.sales,TRUNCATE(ROUND(SUM(A2.Sales)/(SELECT SUM(Sales) FROM Total_Sales),4)*100,2) || '%' Per_Total
FROM Total_Sales A1,Total_Sales A2
WHERE A1.Sales < A2.Sales OR (A1.Sales=A2.Sales and A1.Name = A2.Name)
GROUP BY A1.Name,A1.Sales ORDER BY A1.Sales DESC;