mysqlの権限参照

– どのユーザーがいるか知りたい
SELECT user, host, password FROM mysql.user
mysql> select user,host from mysql.user;
+——+———————–+
| user | host |
+——+———————–+
| user | % |
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| saru | localhost |
| | localhost.localdomain |
| root | localhost.localdomain |
+——+———————–+
8 rows in set (0.21 sec)

-ユーザー権限
SHOW GRANTS FOR root@`localhost`

mysql> show grants for root@localhost;
+———————————————————————+
| Grants for root@localhost |
+———————————————————————+
| GRANT ALL PRIVILEGES ON *.* TO ‘root’@’localhost’ WITH GRANT OPTION |
| GRANT PROXY ON ”@” TO ‘root’@’localhost’ WITH GRANT OPTION |
+———————————————————————+
2 rows in set (0.06 sec)

– 管理用ユーザー
GRANT ALL ON *.* TO adminuser@`%` IDENTIFIED BY ‘password’ WITH GRANT OPTION;

– IP制限
GRANT ALL ON *.* TO adminuser@’172.16.0.0/255.255.255.0′ IDENTIFIED BY ‘password’ WITH GRANT OPTION;

– 全てのデータベースにアクセス
GRANT ALL ON *.* TO testuser@’%’ IDENTIFIED By ‘password’;

– 特定のデータベースにアクセス
GRANT ALL ON testdatabase.* TO testuser@’%’ IDENTIFIED BY ‘password’;

ref: create user with GRANT Privileges in Terminal

nesting query

You can combine multiple queries to control the output of other queries with th output generated by one query. To put it a bit plainly, nesting queries so that the inner query generates a value that the outer query’s predicate evaluates to determine if it is true.

SELET 受注番号 FROM 受注表
 WHERE 商品コード = 
    (SELECT 商品コード FROM 商品表
    WHERE 商品名 = 'JUIICE');

入れ子になっていますね。

mysql: group by

mysql> select * from staff;
+——+——–+——–+
| id | name | deptid |
+——+——–+——–+
| 1 | yamada | 1 |
| 2 | honda | 4 |
| 3 | kudou | 6 |
| 4 | nishi | 1 |
| 5 | tagawa | 3 |
+——+——–+——–+
5 rows in set (0.00 sec)

mysql> select deptid, sum(id) from staff grop by deptid;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘by deptid’ at line 1
mysql> select deptid, sum(id) from staff group by deptid;
+——–+———+
| deptid | sum(id) |
+——–+———+
| 1 | 5 |
| 3 | 5 |
| 4 | 2 |
| 6 | 3 |
+——–+———+
4 rows in set (0.02 sec)

なるほど、あるカラムの値に重複がある場合に、group byでまとめて計算できるのね。

なんとなくわかってきた。

mysql select count: レコード数のカウント

mysql> select count(*) from kawasaki;
+———-+
| count(*) |
+———-+
| 69 |
+———-+
1 row in set (0.00 sec)

mysql> select * from staff;
+——+——–+——–+
| id | name | deptid |
+——+——–+——–+
| 1 | yamada | 1 |
| 2 | honda | 4 |
| 3 | kudou | 6 |
| 4 | nishi | 1 |
| 5 | tagawa | 3 |
+——+——–+——–+
5 rows in set (0.00 sec)

mysql> select count(deptid) from staff;
+—————+
| count(deptid) |
+—————+
| 5 |
+—————+
1 row in set (0.00 sec)

データ量なので、重複したデータも+1とカウントされるんですね。

mysql show index;

show indexは、indexが貼られているか確認

mysql> show index;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 1

あれ、、

mysql> show index from staff;
Empty set (0.00 sec)

あら、fromが必要でしたね。

select distinct -> 重複データを取り除く

SELECT文を使ってデータを取得した時に、重複したデータを取り除いてデータを取得する

SELECT DISTINCT column name, ... from table name;

では、早速見てみましょう。
mysql> select * from staff
-> ;
+——+——–+——–+
| id | name | deptid |
+——+——–+——–+
| 1 | yamada | 1 |
| 2 | honda | 4 |
| 3 | kudou | 6 |
| 4 | nishi | 1 |
| 5 | tagawa | 3 |
+——+——–+——–+
5 rows in set (0.06 sec)

mysql> select distinct deptid from staff;
+——–+
| deptid |
+——–+
| 1 |
| 4 |
| 6 |
| 3 |
+——–+
4 rows in set (0.06 sec)

なるほど、deptidの重複が削除されますねー

MySQL: LPAD(特定)の文字を左側に追加

LPAD関数を使用することで、第二引数で指定した文字数に達するまで文字列1の左側に文字列2を追加する

mysql> SELECT LPAD(‘1′,3,’0’);
+—————–+
| LPAD(‘1′,3,’0’) |
+—————–+
| 001 |
+—————–+
1 row in set (9.23 sec)

なるほど、文字列作るとき便利だなーこれ。

MySQL: 文字列を結合するCONCAT

mysql> SELECT CONCAT(‘My’,’SQL’,’関数’,’リファレンス’);
+————————————————–+
| CONCAT(‘My’,’SQL’,’関数’,’リファレンス’) |
+————————————————–+
| MySQL関数リファレンス |
+————————————————–+
1 row in set (0.83 sec)

nullが入っているとnullで返されるらしいんだが。。
mysql> SELECT CONCAT(‘My’,’SQL’,’NULL’,’リファレンス’);
+————————————————+
| CONCAT(‘My’,’SQL’,’NULL’,’リファレンス’) |
+————————————————+
| MySQLNULLリファレンス |
+————————————————+
1 row in set (1.82 sec)

あ、こうかな。
mysql> SELECT CONCAT(‘My’,’SQL’,NULL,’リファレンス’);
+———————————————-+
| CONCAT(‘My’,’SQL’,NULL,’リファレンス’) |
+———————————————-+
| NULL |
+———————————————-+
1 row in set (1.91 sec)

なるほどー

mysql select時のas句

asはカラムに別名をつける

select sales as tokyosales from uriage where branch='tokyo';
select (kokugo + eigo) / as average from test;

なるほど。

select name as namae, price as kakaku, design as design, quality as hinshitsu, price+design+quality as gokei from product;

なるほど、int型ならこんなこともできるのね。
selectした後に実行するのと、selectの中で実行するの、どちらがいいのかはよくわらかりませんな。

mysql inner join

mysql> select * from staff inner join dept on staff.deptid = dept.id;
+——+——–+——–+——+———–+
| id | name | deptid | id | name |
+——+——–+——–+——+———–+
| 1 | yamada | 1 | 1 | Develop |
| 3 | kudou | 6 | 6 | Marketing |
| 4 | nishi | 1 | 1 | Develop |
| 5 | tagawa | 3 | 3 | Legal |
+——+——–+——–+——+———–+
4 rows in set (0.00 sec)

mysql> select * from dept inner join staff on dept.id = staff.deptid;
+——+———–+——+——–+——–+
| id | name | id | name | deptid |
+——+———–+——+——–+——–+
| 1 | Develop | 1 | yamada | 1 |
| 6 | Marketing | 3 | kudou | 6 |
| 1 | Develop | 4 | nishi | 1 |
| 3 | Legal | 5 | tagawa | 3 |
+——+———–+——+——–+——–+
4 rows in set (0.00 sec)

nullは返ってこないのかな。