PythonとMySQLでSELECT DISTINCTを使う方法をわかりやすく解説
SQLのテーブルでは、カラムに重複した値が含まれていることがよくあります。重複した値が多いと、クエリが返す結果の分析が難しくなるため、テーブルのカラムから一意(重複なし)の値だけを取得したいケースがあります。
SELECT DISTINCTが必要になる場面
例えば、「Customers」という顧客情報(名前、年齢、国など)を管理するテーブルがあるとします。顧客がどの国に属しているのかを把握したい場合、インド出身の顧客が10人、アメリカ出身が15人といったように、同じ国の値が何度も現れます。
単純にcountryカラムを選択すると、大量の重複値を含む列全体が返されてしまい、結果の分析が困難になります。私たちが本当に知りたいのは「重複のない国の一覧」だけです。
このような場合に役立つのが、MySQLの「SELECT DISTINCT」ステートメントです。
構文
SELECT DISTINCT column_name FROM table_name
PythonでMySQLから一意の値を取得する主な手順
mysql.connector をインポートする
connect() メソッドを使ってデータベースとの接続を確立する
cursor() メソッドを使ってカーソルオブジェクトを作成する
適切なMySQLステートメントでクエリを作成する
execute() メソッドでSQLクエリを実行する
接続を閉じる
ここでは、次のような「Customers」テーブルがあると仮定します。
+----------+---------+ | name | country | +----------+---------+ | John | America | | Peter | England | | Karan | India | | Rohit | India | | Rohan | America | | Arsh | France | | Aryan | England | +----------+---------+
コード例
このテーブルから、重複のない国名を取得してみましょう。
import mysql.connector
db=mysql.connector.connect(host="your host", user="your username", password="your password",database="database_name")
cursor=db.cursor()
query="SELECT DISTINCT country FROM Customers "
cursor.execute(query)
for names in cursor:
print(names)
db.close()
上記のコードを実行すると、重複が取り除かれた国名の一覧が返されます。
実行結果
America England India France
補足:SELECT DISTINCTのポイント
SELECT DISTINCTは複数のカラムに対しても使用できます。その場合は、指定したすべてのカラムの組み合わせが一意である行のみが返されます。また、NULL値も1つの「一意の値」として扱われる点に注意してください。大量のデータからユニークな値を素早く抽出したいときに非常に便利な構文なので、ぜひ活用してみてください。
-
Pythonのimport文とは?モジュールを使うために必須な理由と基本の使い方
Pythonのコード内でパッケージやモジュールを利用するには、まずそのモジュールを利用可能な状態にしておく必要があります。これを行うのがimport文です。 Pythonでは「定義されていないもの」は使えない Pythonでは、まだ定義されていない名前を参照することはできません。ただし、一部の機能は最初から組み込まれており、int や float などの基本型はいつでも自由に使えます。 しかし、実際にやりたい処理の多くは、標準ライブラリや外部パッケージの力を借りる必要があります。たとえば、三角関数の余弦(コサイン)を計算したい場合、math モジュールをインポートせずに math.cos(0)
-
Pythonのassertステートメントとは?基本構文と使い方を解説
Pythonのassertステートメントとは Pythonのassertステートメントは、プログラム内で開発者が定義した条件(制約)が正しく満たされているかを確認するための仕組みです。主にデバッグ目的で使用され、スクリプトの冒頭などに記述して、前提条件が成り立っているかどうかを検証します。 基本構文 assertステートメントは、以下のような構文で記述します。 assert <some_test>, <message> この行は次のように読み解けます。「もし<some_test>がFalseと評価された場合、例外が発生し、<message>が出