序文
ヘッドのみが強くなることができます。
テキストは、私のGitHubリポジトリ、歓迎スターに含まれていますgithub.com/ZhongFuChen ...
同社は最近、いくつかの発言を行って、私はまだほとんど戻って、(休暇の広州で当時ヶ月以上、インターンシップ中に書かれたSQLをかじるませんでした)忘れにSQL文を実行する時間の始まりを覚えています会社のための最初の需要が報告を行うことです。
だから私が言って私を取るために高齢者で恥知らずた:「SQLは、私がで忘れられているように見える、グループのグループ化クエリは、私がオーバー行かなければならない、ほぼすべて忘れてしまったようです。」
記事は、私が持っているものを記録するために忘れることなど、より多くのいくつかのクエリを、グループクエリに参加/実用的な一般的な SQLのを
- 本論文では、メインstraightaway(初心者を見てのために)、任意の最適化をカバーしていません
まず、審査グループお問い合わせ
group
クエリは、クエリ、なぜクエリをグループ化するグループ化されていますか?我々は、統計的次元を押したいから。地図を見てみましょう:
例えば、私が知りたい:每天Java3y这个公众号的点击量是多少。
私たちの労働によると、アイデアは非常に簡単です:同じ日数は、公共Java3yデータの名前と番号を見つけるために、次にクリックあたりの金額を加算し、我々は結果に来ます。
私たちは、SQLを書くかもしれません過ごします:
select name,time,sum(pv) as pv
from xxx_table
where name = 'Java3y' group by name,time
复制代码
存在する可能性が1.1グループクエリの誤解
私は友人のグループは、グループに質問をし、一日を覚えて:
実際に、彼の需要は単純です:データパケットの後に過去最高の時間を取得します。しかし、彼はとても乾燥していました。
- 初めてによると、
order by
- 以下のための
order by
グループ分けを記録
図の例:
1.2は、考えられる原因のこの誤解を引き起こし
いくつかのツールは、この文言をサポートすることができます。
select * from xxx_table group by name
复制代码
文言は禁止されていない、との結果が得られた結果であるような、描くことができます。
Java4y 20 7月15号
Java3y 30 7月15号
复制代码
使用します。実際には、このようなアプローチは無理がある、されたかを知りたいgroup by
、次のグループの統計情報を、我々は唯一のフィールド、または集約関数によって選ばれたグループの後ろに従うことができます。
、我々はデータのクエリ、グループ化されているので、データの分布を、私たちは気にしないでください。
注意:統計後の最初のグループを、(最初のデータ分類した後、同じ統計データ)
1.3グループ最も一般的に使用されるSQLクエリ
重複排除機能は、様々な理由(ビジネス上またはそのダーティデータであるかどうかを)のために、いわば、私たちはしばしば遭遇する問題であり、そして今私はIDを除いて(2つの重複データを持って、残りのフィールドは同じですA):
私は、クエリの結果が良好であるとして、我々は次のSQLを書くことができ、ここで、レコード滞在したいです:
select * from user where id in(
select min(id) from user where name = 'Java3y' and pv = 20 and time='7-25' group by name,pv,time;
)
复制代码
それは非常に、非常に便利です、このSQLの上に、重いのほかに、私たちは約「考える」ことができ、実際には、言いました:
- 上記と言われている、使用
group by
、次のグループの統計情報を、我々は唯一のフィールド、または集約関数によって選ばれたグループの後ろに従うことができます。 - 何度も我々
group by
将来的には、も含まれている結果照会したいgroup by
(通常の状況下では、我々はフィールドでグループのすべてをカバーすることはできません)外のフィールドを、私たちがやった、サブクエリとしてクエリの結果は、上記のことができ、外部クエリのWHERE句ので、外側のクエリの後に他のフィールドを選択することができます。
(SQL書かれた比較的少数の友人は、ああ、何も感じないかもしれないが、私たちは、未来を覚えることができる上記の文言が直面するであろうことを願っています似たような状況を)
第二に、レビューは、クエリに参加します
私は非常につまずいたかのように、私たちはただ、とにかく、理解する方法を学習しているとき、分からないクエリに参加。:私は参加したクエリは、単にこのように解釈することができると思う私は、テーブルの重量を量るしていない、結果をしたいし、私は別のテーブルに参加します
例えば、今、私は2つのテーブルを持っています:
今、私が知りたいとき7月25日:公共あたりのクリック、パブリック名番号、プライマリネームの数、作成日、公共の数の数
- もちろん、我々は見つける表を量るしていない、ああ、いくつかのデータを別のテーブルにデータに依存して表示し、「完了」
実際には、その1回の操作で2つのテーブルを結合することです。
一緒に2つのテーブルをマージした後、我々は、この「大きなテーブルには」友人の2つの表にすべてのフィールドが含まれていることがわかります、私はそれをすべて持っていたいです!
それは注目に値する:時間に参加し、デカルト積を生成します(私はとにかく、ここで言うことができない直積であるものにと、私たちは覚えているということであるデカルト製品を除去するときに書くために関連する特定の条件がテーブルを結合します)
加えて、left join
そしてright join
また、私たちはしばしば、我々は単純に書く場合は、使用しjoin
たキーワードを、それは次のように扱われますinner join
。私は簡単に説明しましょう:
- その上で、ときに我々は書くことで参加している必要があり、関連する条件を、そしてもし
inner join
そう、データのみに関連する条件は、最高のテーブルに存在しています - これがあれば
left join
ケース会合が条件を満たしていない場合でも、データがテーブルのままになり、大きなテーブルがあります - これがあれば
right join
場合は、協会が条件を満たしていない場合でも、右側のデータテーブルは、大規模なテーブルの存在になります
下図を参照してください。
この時点では、条件に関連付けられた2つのテーブルを持っている「公共の数」である。もしそうであればinner join
、その後、私たちのファイナルテーブルには2つだけのレコードを持っています。yesの場合left join
、最終的に我々は、3つのデータテーブルを持っています。もしそうであればright join
、その後、私たちの最後の2つのデータテーブルのみ
第三に、審査ケースとき
SQLは、その後、他のエンドの使用量は、プログラミング言語で私たちと実際にされた場合は、if-else
SQLにも多く使用されて書くときに非常によく似ています。
私は、構文は次のとおりである以上使用しました:
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
复制代码
バックにしたときに、複数の式では、例えば:
CASE WHEN sex = '1' and name ='Java3y' THEN '男'
WHEN sex = '2' and name ='Java4y' THEN '女'
ELSE '其他' END
复制代码
あなたがしたい場合はcase when
、エイリアスの式を取るにはend
背後のようにキーワードを追加し、直接
より多くの使用方法の詳細について参照:
第四に、一般的に使用される機能の一部
JSONをパース4.1ハイブとプレスト
私はここでこのような状況になります:JSONデータは、MySQLに保存します。私は、オンライン検索に行き、同僚に尋ねたとき、なぜ、その応答が類似しているフィールドにMySQLを維持するためJSON必要があります。
- JSONデータは、その拡張ああを促進するためには、MySQLに保存されています。これらのフィールドは、より頻繁に変更、インデックスを使用する必要がない場合は、参加保つことができるテーブル構造を変更する必要はありません。
- PS:MySQLの5.7バージョンの後にJSON形式をサポート
参考文献:
私はハイブの一般的な記述をしたり、プレストに係合するようにここにいるので、JSONを解析することはそこまででもあります。
ハイブのJSON分析関数:
get_json_object(param1,'$.param2')
-- 如果是数组
get_json_object(xjson,'$.[0].param2')
复制代码
JSONハンドラにさきがけ:
-- 数组 (去除第index个json)
json_array_get(xjson,index)
-- 单个jsoin对象
json_extract(xjson,'$.param2')
复制代码
参考文献:
4.2時刻関数
この問い合わせで昨日/過去7日間/月の指標はまた、非常に一般的です。
昨天
SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1
7天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)
近30天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)
本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )
上一月
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1
复制代码
あなたが明示的にキーワードを記述する必要がある、プレストの時間形式を使用してくださいtimestamp
:のような、
select supplier,count(id)
from xxx_table
where sendtime >= timestamp '2019-06-01'
复制代码
参考文献:
4.3他の一般的に使用される機能
ここでは、私だけで整頓I最近使用した機能:
length --计算字符串长度
concat --连接两个字符串
substring -- 截取字符串
count -- 统计数量
max -- 最大
min -- 最小
sum -- 合计
floor/ceil --...数学函数
复制代码
次のように再び最近の経験の要件、今いくつかのデータを共有します:
【Java3y简单】快乐学习
【Java3y简单】快乐学习渣渣
【Java3y通俗易懂】简单学
【Java3y通俗易懂】简单学芭芭拉
【Java3y平易近人】无聊学
【Java3y初学者】枯燥学
【Java3y初学者】枯燥学呱呱
【Java3y大数据】欣慰学
【Java3y学习】巴拉巴拉学
【Java3y学习】巴拉巴拉学哈哈
【Java3y好】雨女无瓜学
复制代码
:今、私は統計には、例えば、括弧[]周波数内に表示されていますJava3y通俗易懂
どのような周波数の登場。同僚はすぐに書き、その時はほとんど「SQL正規表現のクイックスタート」を検索するために、良いアイデアを考えたことがなかった、と同僚についての相談:
select substring_index(left(title , INSTR(title , '】') -1 ) , '【',-1)
FROM `xxx_table`
复制代码
哇〜、すごいです
遂に
喜んで出力乾貨物の Javaテクノロジ公共数の:Java3y。パブリック数200件の以上のオリジナルの記事技術記事、大量のビデオ資源、美しいマインドマップは、注意が得ることができます!
私はポイント、記事がよく書かれていると思う賞賛を!