MySQLハイレベルSQL文(データベースに余裕を持たせるために習得)
文書ディレクトリ
環境準備:
---------------------------------------------------------------------------------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…)
コレクションの最小値を返します
例:
2、集約関数:
関数#カンスウ#
さぎょう
avg()
指定した列の平均値を返します.
count()
指定したカラムのNULL以外の値の数を返します.
min()
指定した列の最小値を返します.
max()
指定した列の最大値を返します.
sum(x)
指定した列のすべての値の和を返します.
例:
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を反転
例:
環境準備:
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;