MySQLのいくつかの模様の技
12314 ワード
彼は、ここはたくさん游んでいるようですが、データベースの文が面白いものはありませんか?しかし、手書きで何本か書いたので、本を読んで実践するのはいいと思います.
じょうけんけっていしき
空併処理であるか否かを判断し、空値を判断する処理は、空値を許容する列があれば自動的にインデックスが削除されるので、使用は推奨されません.知っていればいいのに.
IF条件判断、EXP式が成立していればVALUE 1、そうでなければVALUE 2
これは何も言わないで、よく使うのでよく知っています.グループ+合計+カウント+ソート
説明
ここでは
簡単な説明:外層クエリーの結果は内層クエリーを取得し、成立するかどうか.
操作すると、まずデータテーブルのデータを印刷して、観察しやすいです.単純連結テーブルクエリー
単純な2つのテーブル接続クエリでは、
特徴:左の表を基準にして、右の表に行ってデータを探して、もし一致するデータがないならばnullで空席を補って、結果の数>=左の表の元の祖先の数を出力します
特徴:右の表を基準にして、左の表に行ってデータを探して、もし一致するデータがないならばnullで空席を補って、結果の数を出力します>=右の表の元の元祖数
特徴:左右の接続の交差.実は
効率的なクエリー
これを游ぶには必ず大量のデータが必要です.よし~sheelスクリプトを作って大量のデータを挿入します.
ここのデータはまだ少なくて、最后に多くなって、このshを実行する时、私の目はいつもシステムの温度などの情报を见て、手はすでに
続きは...
CASE WHEN
じょうけんけっていしき
# ,
mysql> SELECT `name`,`age`,`sex` FROM `admin`;
+----------+-----+-----+
| name | age | sex |
+----------+-----+-----+
| AlicFeng | 21 | 1 |
| Alice | 20 | 0 |
+----------+-----+-----+
# CASE WHEN
mysql> SELECT `name`,`age`,CASE `sex` WHEN 1 THEN ' ' WHEN 0 THEN ' ' ELSE ' ' END AS `sex` FROM `admin`;
+----------+-----+-----+
| name | age | sex |
+----------+-----+-----+
| AlicFeng | 21 | |
| Alice | 20 | |
+----------+-----+-----+
IFNULL
空併処理であるか否かを判断し、空値を判断する処理は、空値を許容する列があれば自動的にインデックスが削除されるので、使用は推奨されません.知っていればいいのに.
# ,
mysql> SELECT `name`,`message` FROM `admin`;
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| AlicFeng | , 。 |
| Alice | NULL |
+----------+--------------------------------------------+
# ,
mysql> SELECT `name`,IFNULL(`message`," , 。") AS `message` FROM `admin`;
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| AlicFeng | , 。 |
| Alice | , 。 |
+----------+--------------------------------------------+
IF(EXP1,VALUE1,VALUE2)
IF条件判断、EXP式が成立していればVALUE 1、そうでなければVALUE 2
# default SELECT
mysql> SELECT `name`,`age` FROM `admin`;
+----------+-----+
| name | age |
+----------+-----+
| AlicFeng | 21 |
| Alice | 20 |
+----------+-----+
#
mysql> SELECT `name`,IF(`age`>20," "," ") AS `who` FROM `admin`;
+----------+-----------------+
| name | who |
+----------+-----------------+
| AlicFeng | |
| Alice | |
+----------+-----------------+
UNION
およびUNION ALL
合併です.これは何も面白くありません.ただし、クエリーのフィールド名は同じでなければなりません.どのテーブルから来ても、ALLでは同じローは削除されません.使用はなるべく括弧で囲んでください.そうしないとLIMIT、ORDER BYでエラーが表示されます.# UNION
mysql> (SELECT `name` FROM `admin`) UNION (SELECT `name` FROM `user`);
+----------+
| name |
+----------+
| AlicFeng |
| Alice |
| |
+----------+
# UNION ALL
mysql> (SELECT `name` FROM `admin`) UNION (ALL SELECT `name` FROM `user`);
+----------+
| name |
+----------+
| AlicFeng |
| Alice |
| |
| AlicFeng |
+----------+
GROUP BY
+ SUM
+ COUNT
+ ORDER BY
これは何も言わないで、よく使うのでよく知っています.グループ+合計+カウント+ソート
mysql> SELECT `age`,COUNT(*) AS `number` FROM `admin` GROUP BY `age` ORDER BY `number` DESC;
+-----+--------+
| age | number |
+-----+--------+
| 21 | 2 |
| 20 | 1 |
+-----+--------+
WHERE
とHAVING
を併用説明
having
ならORDER BY
があるはずなので、グループ分けしてからカッコつけますmysql> SELECT `age`,COUNT(*) FROM `admin` WHERE `age`>18 GROUP BY `age` HAVING COUNT(*) >=1;
+-----+----------+
| age | COUNT(*) |
+-----+----------+
| 20 | 1 |
| 21 | 2 |
+-----+----------+
FROM
ここでは
FROM
サブクエリについて説明します.例を挙げてみましょう.今、小学校の子供が2科以上不合格になった学生の平均点数と名前を調べます.一歩一歩!#
mysql> SELECT `name`,COUNT(*) AS `number_class` FROM `user` WHERE `score`<60 GROUP BY `name` HAVING `number_class`>=2;
+----------+--------------+
| name | number_class |
+----------+--------------+
| AlicFeng | 2 |
| | 2 |
+----------+--------------+
# ,
mysql> SELECT `name` FROM (SELECT `name`,COUNT(*) AS `number_class` FROM `user` WHERE `score`<60 GROUP BY `name` HAVING `number_class`>=2) AS `user_t`;
+----------+
| name |
+----------+
| AlicFeng |
| |
+----------+
# ,
mysql> SELECT `name`,AVG(`score`) FROM `user` WHERE `name` IN (SELECT `name` FROM (SELECT `name`,COUNT(*) AS `number_class` FROM `user` WHERE `score`<60 GROUP BY `name` HAVING `number_class`>=2) AS `user_t`) GROUP BY `name`;
+----------+--------------+
| name | AVG(`score`) |
+----------+--------------+
| AlicFeng | 59.6667 |
| | 61.6667 |
+----------+--------------+
# PS: , , ( 、 )。
mysql> desc user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| sub | varchar(10) | NO | | NULL | |
| score | int(11) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
WHERE
WHERE
サブクエリ、一言で言えば、内層クエリの結果は外層で使用されます.あまり話さないで、例を挙げてください.# user
mysql> SELECT `name`,`message` FROM `admin` WHERE `name`=(SELECT `name` FROM (SELECT `name`,max(`score`) FROM `user`) AS `temp_t`);
+--------+---------+
| name | message |
+--------+---------+
| | |
+--------+---------+
# PS: , 。THIS IS DEMO
EXISTS
簡単な説明:外層クエリーの結果は内層クエリーを取得し、成立するかどうか.
mysql> SELECT `name`,`message` FROM `admin` WHERE EXISTS(SELECT `name` FROM `user` WHERE `user`.`name`=`admin`.`name`);
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| AlicFeng | , 。 |
| | |
+----------+--------------------------------------------+
操作すると、まずデータテーブルのデータを印刷して、観察しやすいです.
mysql> SELECT * FROM `admin`;
+----+----------+-----+-----+--------------------------------------------+
| id | name | age | sex | message |
+----+----------+-----+-----+--------------------------------------------+
| 1 | AlicFeng | 21 | 1 | , 。 |
| 2 | Alice | 20 | 0 | NULL |
| 3 | | 21 | 1 | |
+----+----------+-----+-----+--------------------------------------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM `user`;
+--------+----------+---------+-------+
| id | name | sub | score |
+--------+----------+---------+-------+
| 1 | | chinese | 48 |
| 2 | AlicFeng | math | 28 |
| 3 | | math | 38 |
| 4 | AlicFeng | english | 98 |
| 5 | AlicFeng | math | 53 |
| 6 | | english | 99 |
| 7 | | math | 88 |
+--------+----------+---------+-------+
単純な2つのテーブル接続クエリでは、
WHERE
とJOIN ON
を使用してクエリの結果は等価です.# JOIN ON
mysql> SELECT `admin`.`name`,`admin`.`message`,`user`.`score` FROM `admin` JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+-------+
| name | message | score |
+----------+--------------------------------------------+-------+
| | | 48 |
| AlicFeng | , 。 | 28 |
| | | 38 |
| AlicFeng | , 。 | 98 |
| AlicFeng | , 。 | 53 |
| | | 99 |
+----------+--------------------------------------------+-------+
# WHERE
mysql> SELECT `admin`.`name`,`admin`.`message`,`user`.`score` FROM `admin`, `user` WHERE `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+-------+
| name | message | score |
+----------+--------------------------------------------+-------+
| | | 48 |
| AlicFeng | , 。 | 28 |
| | | 38 |
| AlicFeng | , 。 | 98 |
| AlicFeng | , 。 | 53 |
| | | 99 |
+----------+--------------------------------------------+-------+
、推奨特徴:左の表を基準にして、右の表に行ってデータを探して、もし一致するデータがないならばnullで空席を補って、結果の数>=左の表の元の祖先の数を出力します
mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` LEFT JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| AlicFeng | , 。 |
| AlicFeng | , 。 |
| AlicFeng | , 。 |
| Alice | NULL |
| | |
| | |
| | |
+----------+--------------------------------------------+
特徴:右の表を基準にして、左の表に行ってデータを探して、もし一致するデータがないならばnullで空席を補って、結果の数を出力します>=右の表の元の元祖数
mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` RIGHT JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| | |
| AlicFeng | , 。 |
| | |
| AlicFeng | , 。 |
| AlicFeng | , 。 |
| | |
| NULL | NULL |
+----------+--------------------------------------------+
特徴:左右の接続の交差.実は
WHERE
、JOIN ON
のクエリ結果と同じです.mysql> SELECT `admin`.`name`,`admin`.`message` FROM `admin` INNER JOIN `user` ON `admin`.`name`=`user`.`name`;
+----------+--------------------------------------------+
| name | message |
+----------+--------------------------------------------+
| | |
| AlicFeng | , 。 |
| | |
| AlicFeng | , 。 |
| AlicFeng | , 。 |
| | |
+----------+--------------------------------------------+
これを游ぶには必ず大量のデータが必要です.よし~sheelスクリプトを作って大量のデータを挿入します.
# MySQL
mysql> set global max_connections=100000;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'max_connections';
+-----------------+--------+
| Variable_name | Value |
+-----------------+--------+
| max_connections | 100000 |
+-----------------+--------+
1 row in set (0.00 sec)
shell
#!/bin/bash
date
for i in `seq 1 100000`
do
{
mysql -usamego -p!@#$%^&123 demo -e "insert into user(name,score,sub) values('ALicFeng',78,'math');"
sleep 0.01
} &
done
wait
date
exit 0
ここのデータはまだ少なくて、最后に多くなって、このshを実行する时、私の目はいつもシステムの温度などの情报を见て、手はすでに
CTRL+C
の上に置いて、O(∩∩)Oははははは~続きは...