- Gunakan SQLite dan Python secara lokal untuk menciptakan lingkungan praktik SQL yang realistis tanpa memerlukan gudang data lengkap atau klaster Spark.
- Kuasai terlebih dahulu keterampilan dasar SQL: memfilter dengan WHERE, menggabungkan beberapa tabel, dan mengagregasi data dengan GROUP BY dan HAVING.
- Normalisasikan skema ke dalam beberapa tabel dengan kunci utama dan kunci asing, lalu gunakan JOIN untuk merekonstruksi hubungan dalam analisis Anda.
- Gabungkan praktik lokal dengan platform SQL interaktif untuk melatih pertanyaan bergaya wawancara dan mendapatkan kembali kepercayaan diri dengan perangkat data modern.
Jika Anda mencoba kembali mempelajari SQL dan Python setelah beberapa tahun vakum, wajar jika Anda merasa bingung. —terutama jika peran terakhir Anda menggunakan alat-alat eksklusif dan notebook Databricks yang nyaman yang sudah tidak Anda miliki lagi. Lowongan pekerjaan modern yang menuntut Python, SQL, dan bahkan PySpark bisa terlihat menakutkan ketika setiap panduan dimulai dengan sesuatu seperti "muat dataset klaim Anda ke dalam gudang data Anda" dan Anda berpikir: "Itulah yang tidak saya miliki."
Kabar baiknya adalah Anda dapat menciptakan kembali sebagian besar pengalaman belajar tersebut di laptop Anda sendiri. Dengan menggunakan alat gratis, kumpulan data sampel kecil, dan serangkaian soal latihan yang terstruktur. Dalam panduan ini, kita akan membahas, dengan bahasa yang mudah dipahami, cara membangun lingkungan lokal yang realistis, cara kerja SQL (dari kueri dasar hingga JOIN dan agregasi), dan cara membungkus kueri SQL tersebut dalam Python sehingga Anda dapat berlatih persis jenis tugas yang akan Anda hadapi dalam pekerjaan data modern.
Membangun lingkungan latihan lokal sederhana dengan SQLite dan Python.
Anda tidak memerlukan gudang data lengkap atau klaster Spark untuk berlatih SQL dan Python.Untuk pembelajaran dan persiapan wawancara, basis data terintegrasi yang ringan seperti SQLite sudah lebih dari cukup. SQLite menyimpan semua datanya dalam satu file di disk, yang membuatnya sempurna untuk proyek-proyek sederhana, prototipe, dan latihan pendidikan.
Secara konseptual, basis data SQLite sangat mirip dengan spreadsheet dengan banyak lembar.: setiap lembar adalah sebuah tabel, setiap baris adalah sebuah catatan, dan setiap kolom adalah sebuah bidangDalam istilah basis data relasional, tabel terkadang disebut "relasi", baris disebut "tuple", dan kolom disebut "atribut", tetapi untuk pekerjaan praktis, Anda dapat tetap menggunakan istilah sehari-hari seperti tabel, baris, dan kolom.
Python dilengkapi dengan driver SQLite bawaan yang disebut sqlite3., yang berarti Anda tidak perlu menginstal server basis data terpisah. Skrip Python Anda akan membuka koneksi ke .sqlite berkas (membuatnya jika belum ada), memperoleh kursor objek (sangat mirip dengan handle file), dan kemudian mengirimkan perintah SQL melalui kursor tersebut menggunakan execute(). Lihat kami SQLite SELECT dan WHERE Panduan untuk contoh praktis membaca dan menyaring data.
Meskipun artikel ini berfokus pada pengoperasian SQLite dari Python, ada juga alat GUI praktis yang disebut "Database Browser for SQLite". (kadang-kadang didistribusikan sebagai DB Browser for SQLite). Dengan perangkat lunak ini, Anda dapat memeriksa tabel secara visual, menyisipkan atau mengedit beberapa baris secara manual, dan menjalankan pernyataan SQL sederhana. Ini seperti editor teks untuk file basis data: penyesuaian manual cepat lebih mudah dilakukan di GUI, tetapi hal-hal yang berulang atau kompleks lebih baik dibuat dalam skrip Python.
Basis data relasional lebih kaku daripada daftar atau kamus Python: mereka menuntut skema yang telah ditentukan.Saat membuat tabel, Anda harus mendeklarasikan nama kolom dan tipe data yang Anda harapkan (teks, bilangan bulat, tanggal/waktu, dll.). SQLite kemudian akan menyimpan dan mengindeks data dengan cara yang menjaga efisiensi pencarian, bahkan saat kumpulan data Anda bertambah melebihi kapasitas memori. Untuk jalur pembelajaran praktis dan contoh langsung, lihat análisis de datos con SQL.
Membuat tabel dan memasukkan data dengan SQL dan Python
Untuk mulai berlatih, Anda pertama-tama membutuhkan sebuah tabel – anggap saja ini sebagai mendesain bentuk data Anda.Misalkan Anda menginginkan tabel perpustakaan musik mini. Dengan menggunakan Python, sqlite3 Dengan modul ini, Anda dapat terhubung ke file basis data, menghapus versi lama tabel jika ada, dan kemudian membuat tabel baru dengan kolom yang bertipe jelas.
Berikut gambaran konseptual alur tersebut dalam Python.Anda menelepon sqlite3.connect('music.sqlite') untuk membuka atau membuat file basis data, lalu panggil conn.cursor() untuk mendapatkan kursor. Melalui kursor tersebut, Anda dapat menjalankan perintah SQL seperti DROP TABLE IF EXISTS Songs untuk menghapus skema sebelumnya, diikuti oleh CREATE TABLE Songs (title TEXT, plays INTEGER) untuk mendefinisikan tabel baru dengan dua kolom.
Setelah tabel ada, Anda beralih dari DDL (Data Definition Language) ke DML (Data Manipulation Language) dengan INSERT LaporanDi Python, Anda harus selalu menggunakan kueri berparameter: tulis INSERT INTO Songs (title, plays) VALUES (?, ?) dan meneruskan tuple seperti ('Thunderstruck', 20) sebagai argumen kedua untuk execute()Tanda tanya tersebut adalah placeholder yang akan diganti dengan aman oleh Python, membantu Anda menghindari masalah injeksi SQL dan bug pengutipan.
Setelah melakukan penyisipan atau pembaruan, Anda harus memanggil conn.commit() untuk menyimpan perubahan Anda ke diskSampai Anda melakukan commit, operasi hanya tersimpan dalam buffer transaksi. Ini berbeda dari penulisan file sederhana, dan ini adalah salah satu kebiasaan penting yang perlu dibangun sejak awal: query, modifikasi, lalu commit.
Untuk membaca kembali data Anda, Anda menggunakan sebuah SELECT pernyataan dan ulangi pada kursor. Sebagai contoh, SELECT title, plays FROM Songs akan mengalirkan setiap baris sebagai tuple Python, seperti ('Thunderstruck', 20)Kursor tidak memuat semua hasil sekaligus; sebaliknya, kursor mengambil baris secara bertahap, yang berguna ketika Anda akhirnya berurusan dengan kumpulan data yang lebih besar.
Elemen inti kueri SQL dan pemfilteran dengan WHERE
Setiap kueri SQL dibangun berdasarkan sejumlah kecil klausa yang muncul dalam urutan standar.: SELECT, FROM, WHERE, GROUP BY, HAVING, dan ORDER BYSetidaknya Anda harus menentukan kolom apa saja yang Anda inginkan (SELECT) dan dari tabel mana (FROMKlausul opsional kemudian menyempurnakan, menggabungkan, menyaring hasil gabungan, dan mengurutkan output.
The WHERE Klausul ini menyaring baris sebelum pengelompokan atau agregasi dilakukan.Untuk kolom numerik, Anda dapat menggunakan operator perbandingan seperti =, != (Atau <>), >, <, >=, <=Kolom teks mendukung hal ini ditambah pencocokan pola melalui LIKE dan pengecekan keanggotaan melalui INNilai tanggal/waktu mendukung perbandingan relasional yang sama, dan Anda sering melihat rentang yang dinyatakan dengan BETWEEN.
Penanganan nilai null dalam SQL cukup unik sehingga perlu mendapat perhatian khusus.Perbandingan biasa seperti = ke != jangan berperilaku seperti yang mungkin Anda harapkan dengan NULL, jadi SQL menyediakan IS NULL ke IS NOT NULL untuk memeriksa nilai yang hilang. Kolom Boolean biasanya bekerja dengan = ke !=, tetapi Anda tetap membutuhkan IS NULL ketika nilai boolean itu sendiri bisa hilang.
Saat Anda menggabungkan beberapa kondisi, ingatlah bahwa AND ke OR ikuti aturan prioritasJika Anda menulis age < 5 OR age > 10 AND breed = 'Ragdoll'SQL akan mengevaluasi AND Pertama, untuk menyatakan “Kucing Ragdoll berusia kurang dari 5 tahun atau lebih dari 10 tahun”, Anda harus menggunakan tanda kurung: (age < 5 OR age > 10) AND breed = 'Ragdoll'Memahami kombinasi logis ini sangat penting untuk pekerjaan analitik di dunia nyata.
Pencocokan pola dengan LIKE memungkinkan Anda mencari string yang dimulai, diakhiri, atau berisi fragmen tertentuTanda persen % adalah karakter pengganti untuk urutan karakter apa pun, jadi breed LIKE 'R%' menemukan ras yang dimulai dengan huruf “R”, fav_toy LIKE 'ball%' menemukan mainan yang namanya dimulai dengan "bola", dan coloration LIKE '%m' menemukan pola warna yang berakhiran dengan huruf “m”. Dipasangkan dengan AND/OR, ini menjadi perangkat penyaring teks yang ampuh.
Mempraktikkan kueri tabel tunggal dengan kumpulan data contoh.
Salah satu cara yang bermanfaat untuk membangun memori otot adalah dengan mengingat skema kecil dan menyelesaikan banyak kueri terhadapnya.. Bayangkan a cat tabel dengan kolom seperti id, name, breed, coloration, age, sex, dan fav_toyIni memberi Anda cukup variasi – teks, angka, kategori sederhana – untuk mempraktikkan sebagian besar pola kueri dasar.
Untuk pengecekan bergaya boolean, Anda sering kali memfilter pada satu kolom lalu menambahkan kondisi tambahan.Untuk membuat daftar kucing jantan "membosankan" yang tidak memiliki mainan favorit yang tercatat, Anda dapat memilih name dimana sex = 'M' ke fav_toy IS NULLIni menggambarkan bagaimana pengecekan null dipadukan dengan perbandingan langsung untuk mengisolasi subset baris tertentu.
Untuk menargetkan ras tertentu atau mengecualikannya, Anda menggabungkan kesamaan dengan negasi logis.Memilih hanya kucing Ragdoll dengan usia tertentu menggunakan breed = 'Ragdoll'; tidak termasuk Persia dan Siam, mungkin terlihat seperti breed NOT LIKE 'Persian' AND breed NOT LIKE 'Siamese'Meskipun beberapa basis data mendukung NOT IN ('Persian', 'Siamese')Mempraktikkan pola eksplisit membantu memperkuat pemahaman Anda tentang NOT ke LIKE.
Latihan seperti “kucing betina yang menyukai mainan penggodaan dan bukan kucing Persia atau Siam” memaksa Anda untuk menggabungkan filter teks, kesamaan, dan operator logika.Anda akan memilih id, name, breed, coloration dan batasi baris menggunakan sex = 'F', fav_toy = 'teaser', dan kondisi gabungan yang mengecualikan ras yang tidak diinginkan. Memperhatikan tanda kurung memastikan bahwa semua subkondisi diterapkan dalam kombinasi yang dimaksud.
Setelah Anda merasa nyaman dengan contoh-contoh sederhana ini dalam SQL mentah, implementasikan kembali melalui Python menggunakan kueri berparameter.Tulis skrip pendek yang menanyakan ras, usia minimum, atau jenis mainan dari input(), colokkan ke WHERE klausa, dan mencetak hasilnya. Inilah jembatan antara penulisan kueri dan kode aplikasi nyata yang diharapkan oleh banyak peran data junior.
Memahami dan mempraktikkan SQL JOIN.
Begitu Anda melangkah lebih jauh dari soal-soal sederhana, Anda akan terus bergabung dengan banyak kelompok diskusi.JOIN adalah cara Anda menghubungkan kumpulan data yang terkait: pelanggan dengan pesanan, seniman dengan karya seni, game dengan perusahaan, dan sebagainya. Dalam SQL, Anda menjelaskan kolom mana yang harus cocok antar tabel, dan mesin basis data menggabungkan baris-baris tersebut menjadi kumpulan hasil gabungan.
Ada empat tipe bergabung utama yang akan Anda temui dalam wawancara dan proyek nyata.: INNER JOIN (sering ditulis hanya JOIN), LEFT JOIN, RIGHT JOIN, dan FULL OUTER JOINInner join hanya mengembalikan baris di mana kedua tabel memiliki kunci yang cocok; left join mempertahankan semua baris dari tabel kiri, mengisi bagian yang kosong. NULLs ketika tabel kanan tidak memiliki kecocokan; right join melakukan hal yang simetris; dan full outer join mengembalikan setiap baris dari kedua sisi, mencocokkan jika memungkinkan dan menggunakan NULL di mana tidak.
Pikirkan LEFT JOIN ke RIGHT JOIN sebagai operasi “lebih percaya pada sisi ini”Dengan left join, tabel sebelah kiri adalah sumber kebenaran utama: setiap baris dari tabel tersebut muncul setidaknya sekali dalam output, bahkan ketika tabel sebelah kanan tidak memberikan kontribusi apa pun. Dengan full join, tidak ada sisi yang diistimewakan – Anda hanya menggabungkan semua kunci dari kedua tabel dan menyelaraskannya di tempat yang tumpang tindih.
Untuk menjaga agar kueri multi-tabel tetap mudah dibaca, selalu berikan alias pada tabel Anda.Alih-alih menulis SELECT artist.name berulang kali, menulis FROM artist AS a lalu merujuk kolom sebagai a.name. Demikian pula, piece_of_art bisa menjadi poa, dan museum dapat mKetika kueri Anda berkembang hingga tiga atau lebih join, alias yang baik adalah perbedaan antara kejelasan dan kekacauan.
Susunan peralatan pelatihan klasik menggunakan tiga buah meja: artist, museum, dan piece_of_art. itu artist meja mungkin menampung id, name, birth_year, death_year dan bidang utama seperti cat air atau patung. Itu museum toko meja id, name ke country. itu piece_of_art meja menampung id, name, artist_id ke museum_idDua kolom terakhir tersebut adalah kunci asing yang menghubungkan setiap karya seni dengan penciptanya dan lokasinya.
Dengan skema tersebut, Anda dapat berlatih melakukan inner join, left join, dan conditional filter.Sebagai contoh, untuk mencantumkan seniman yang lahir setelah tahun 1800 dan hidup lebih dari 50 tahun, beserta nama-nama karya mereka, Anda akan menggabungkannya. artist ke piece_of_art on artist.id = piece_of_art.artist_id lalu saring dengan death_year - birth_year > 50 ke birth_year > 1800. Beri alias pada kolom yang dipilih sebagai artist_name ke piece_name untuk kejelasan.
Untuk melihat semua karya seni beserta nama museum dan negaranya – termasuk karya-karya yang “hilang” tanpa museum. – Anda akan menggunakan LEFT JOIN dari piece_of_art untuk museum on museum_idDengan begitu, karya seni tanpa museum terkait tetap muncul dalam hasil pencarian, dengan NULL di kolom museum. Memfilter baris di mana artist_id IS NULL Memungkinkan Anda mendeteksi karya-karya seniman yang tidak dikenal sekaligus terhubung dengan museum yang menyimpan karya-karya tersebut.
Latihan yang lebih lanjut mengharuskan Anda menggabungkan tiga tabel secara bersamaan.Untuk mencantumkan setiap karya seni beserta nama seniman dan museumnya, Anda perlu menggabungkannya. museum untuk piece_of_art on museum.id = piece_of_art.museum_idlalu bergabung artist on artist.id = piece_of_art.artist_idMenggunakan polos JOIN (inner join) sengaja menghilangkan karya seni yang tidak memiliki informasi artis atau museum, sehingga Anda dapat memahami bagaimana tipe join memengaruhi jumlah baris.
Penggunaan Agregasi, GROUP BY, dan HAVING dalam Praktik
Setelah Anda dapat mengambil dan menggabungkan data, keterampilan besar berikutnya adalah meringkasnya.Fungsi agregasi seperti SUM(), AVG(), COUNT(), MAX(), dan MIN() menghitung metrik atas kumpulan baris. GROUP BY Membagi dataset Anda menjadi beberapa grup dan menerapkan fungsi-fungsi tersebut di dalam setiap grup – misalnya, satu grup per tahun, per perusahaan, atau per artis. Jika Anda lebih menyukai kursus terstruktur untuk mempraktikkan konsep-konsep ini, lihat Kursus SQL komprehensif.
Bayangkan sesuatu yang sederhana sales_table dengan kolom year, month, dan salesSebuah dataran SELECT SUM(sales) AS total_sales FROM sales_table memberikan total keseluruhan di semua baris. Menambahkan GROUP BY year Pertanyaannya berubah: sekarang Anda menanyakan total penjualan per tahun, bukan satu angka keseluruhan.
Aturan kuncinya adalah setiap kolom yang tidak diagregasi dalam SELECT harus muncul di GROUP BY. Jika Anda memilih year ke SUM(sales)Anda mengelompokkan berdasarkan year. Jika Anda memilih year ke month bersama dengan agregat, lalu Anda mengelompokkan berdasarkan keduanya. year ke monthSecara konseptual, kombinasi berbeda dari kolom-kolom yang dikelompokkan mendefinisikan kelompok-kelompok tersebut.
WHERE ke HAVING Keduanya adalah filter, tetapi mereka bekerja pada tahap yang berbeda.. WHERE Memfilter baris mentah sebelum pengelompokan atau agregasi dilakukan. HAVING Memfilter hasil yang dikelompokkan menggunakan ekspresi agregat. Misalnya, Anda mungkin WHERE production_year BETWEEN 2000 AND 2009 lalu HAVING SUM(revenue) > 4000000 hanya mempertahankan perusahaan yang "game bagusnya" menghasilkan pendapatan lebih dari empat juta.
Skema praktik yang lebih realistis adalah... games tabel dengan kolom seperti id, title, company, type, production_year, system, production_cost, revenue, dan ratingDengan satu tabel ini, Anda dapat menghitung rata-rata, menghitung jumlah, menjumlahkan, mengelompokkan, dan memberi peringkat – inti dari SQL analitik.
Sebagai contoh, untuk menghitung biaya produksi rata-rata game yang dirilis dari tahun 2010 hingga 2015 dengan rating lebih dari 7.Anda akan memilih AVG(production_cost) dan batasi baris dengan WHERE production_year BETWEEN 2010 AND 2015 AND rating > 7Itu adalah pertanyaan klasik ala wawancara, dan Anda dapat dengan mudah menyematkannya ke dalam Python dan mencetak angka tunggal yang dihasilkan.
Anda juga dapat menghasilkan statistik tingkat tahunan secara langsung dari sumber yang sama. games tabelKelompokkan berdasarkan production_yearlalu hitung COUNT(*) AS count, AVG(production_cost) AS avg_cost, dan AVG(revenue) AS avg_revenueJenis kueri ini memberikan tampilan deret waktu yang ringkas, yang sangat umum digunakan dalam dasbor BI dan alat pelaporan.
Untuk memberi peringkat perusahaan berdasarkan laba kotor selama semua tahun, Anda dapat melakukan agregasi pada companyPola yang praktis adalah... SELECT company, SUM(revenue - production_cost) AS gross_profit_sum FROM games GROUP BY 1 ORDER BY 2 DESC. di sini GROUP BY 1 ke ORDER BY 2 gunakan posisi kolom di SELECT Daftar ini dapat membuat segalanya ringkas tetapi harus digunakan dengan hati-hati agar Anda tidak merusak kueri dengan mengubah urutan kolom di kemudian hari.
Perintah yang lebih kompleks menggabungkan filter, pengelompokan, dan filter pasca-agregasi.Misalkan Anda mendefinisikan "game bagus" sebagai game yang diproduksi antara tahun 2000 dan 2009, dengan peringkat di atas 6 dan pendapatan lebih besar dari biaya produksi. Untuk setiap perusahaan, Anda menginginkan jumlah game tersebut ditambah total pendapatan mereka, tetapi hanya untuk perusahaan yang pendapatannya dari game bagus melebihi 4,000,000. Anda akan memfilter baris dengan WHERE on production_year, rating, dan profitabilitas, dikelompokkan berdasarkan company, hitung COUNT(company) ke SUM(revenue), lalu terapkan HAVING SUM(revenue) > 4000000Satu kueri ini mencakup sebagian besar langkah mental di dunia nyata yang akan Anda hadapi dalam tugas-tugas analitik.
Memodelkan data dengan banyak tabel dan kunci.
Desain tabel tunggal memang cukup efektif, tetapi basis data relasional akan lebih unggul ketika Anda menormalisasi data di berbagai tabel.Normalisasi adalah proses menghilangkan penyimpanan yang berlebihan dan merepresentasikan hubungan melalui kunci. Hal ini membuat basis data Anda lebih kecil, lebih cepat, dan lebih kecil kemungkinannya terjadi kesalahan.
Contoh sederhana namun informatif dapat diperoleh dari penelusuran grafik sosial mirip Twitter.Misalnya, Anda ingin melacak akun pengguna dan hubungan "mengikuti" di antara mereka. Pendekatan yang sederhana adalah menggunakan satu tabel di mana setiap baris menduplikasi nama pengikut dan yang diikuti sebagai teks. Hal itu dengan cepat menyebabkan pengulangan yang berlebihan dan ejaan yang tidak konsisten.
Sebaliknya, Anda membagi hal-hal menjadi People meja dan sebuah Follows tabel. People mungkin memiliki bilangan bulat id sebagai kunci utama, sebuah nilai unik. name (nama pengguna atau pegangan), dan sebuah retrieved Bendera yang menandakan apakah Anda sudah menelusuri daftar teman akun tersebut. Follows menyimpan pasangan bilangan bulat from_id ke to_id, yang mewakili koneksi langsung dari satu pengguna ke pengguna lainnya.
Tiga konsep kunci membentuk model ini: kunci logis, kunci utama, dan kunci asing.Kunci logis adalah apa yang digunakan dunia luar untuk merujuk pada suatu catatan – di sini, nama pengguna Twitter. nameKunci utama biasanya berupa bilangan bulat yang dihasilkan oleh basis data (id) yang secara unik mengidentifikasi setiap baris dan murah untuk diindeks dan dibandingkan. Kunci asing adalah bilangan bulat yang menunjuk ke kunci utama di tabel lain – from_id ke to_id dalam Follows tabel tersebut merupakan kunci asing yang merujuk People.id.
Untuk memastikan kualitas data, Anda mendeklarasikan batasan dalam definisi tabel Anda.. Sebagai contoh, name TEXT UNIQUE in People memastikan Anda tidak dapat secara tidak sengaja memasukkan dua baris dengan pegangan yang sama. A UNIQUE(from_id, to_id) batasan dalam Follows Mencegah Anda menyimpan edge follow yang sama lebih dari sekali. Batasan ini juga berfungsi sebagai jaring pengaman saat Anda mulai menulis logika upsert di Python.
Dalam Python sqlite3 modul, pola umum yang digunakan adalah INSERT OR IGNORE untuk menghormati batasan-batasan tersebut dengan anggun.Jika Anda mencoba memasukkan name Jika sudah ada, SQLite akan secara diam-diam melewati operasi tersebut daripada menampilkan kesalahan. Anda kemudian dapat memeriksanya. cursor.rowcount untuk melihat apakah suatu baris benar-benar ditambahkan, dan mengandalkan cursor.lastrowid untuk menemukan yang ditugaskan id untuk pengguna yang baru ditambahkan.
Saat kode Anda menerima nama layar baru, kode tersebut pertama-tama harus mencoba mencari nama layar yang sesuai. id. Jika sebuah SELECT id FROM People WHERE name = ? Mengembalikan sebuah baris, Anda menggunakan kembali bilangan bulat tersebut. Jika tidak, Anda memasukkan nama dengan retrieved = 0, lakukan, lalu baca lastrowidPola "cari atau masukkan" tersebut merupakan inti dari banyak skrip pemasukan data.
Setelah ID pengikut dan yang diikuti diketahui, catat hubungan tersebut di Follows hanyalah yang lain INSERT OR IGNORE. Anda UNIQUE(from_id, to_id) Batasan tersebut menangani duplikat, dan Anda dapat berkonsentrasi pada logika tingkat tinggi tentang profil mana yang akan di-crawl selanjutnya, daripada mengelola secara detail penghapusan duplikasi baris.
Menggunakan JOIN untuk merekonstruksi hubungan dari tabel yang dinormalisasi.
Skema yang dinormalisasi mengorbankan redundansi demi pengalihan: Anda menyimpan bilangan bulat alih-alih string yang berulang, tetapi sekarang Anda harus menggabungkan tabel untuk merekonstruksi gambaran lengkapnya.Inilah tepatnya yang dilakukan SQL. JOIN Dirancang untuk itu, dan setelah Anda terbiasa, kueri yang banyak menggunakan JOIN akan terasa sangat alami.
Dalam contoh grafik sosial, jika Anda ingin melihat pengguna mana yang memiliki id = 2 mengikutiAnda akan bergabung Follows untuk People di sisi target. Secara konseptual, Anda berlari SELECT * FROM Follows JOIN People ON Follows.to_id = People.id WHERE Follows.from_id = 2Ini menghasilkan baris gabungan yang berisi baik nomor urut maupun nama yang mudah dibaca manusia untuk setiap pihak yang diikuti.
Setiap baris dalam hasil tersebut adalah "meta-baris" yang menggabungkan kolom dari kedua tabel.Dua kolom pertama mungkin adalah... (from_id, to_id) dari Follows, sedangkan kolom-kolom selanjutnya termasuk dalam People - Suka (id, name, retrieved). Karena JOIN kondisi memberlakukan Follows.to_id = People.idAnda dapat melihat hubungan tersebut secara eksplisit: kolom kedua dan kolom ketiga dari setiap baris cocok.
Pola yang sama secara alami meluas ke lebih banyak tabel.Anda sudah melihatnya dengan artist, piece_of_art, dan museum, dan perayap Twitter mengilustrasikannya dengan People ke FollowsDalam alur analitik yang lebih kompleks, Anda mungkin menggabungkan tabel fakta (peristiwa, pesanan) dengan beberapa tabel dimensi (pengguna, produk, kampanye) untuk menjawab pertanyaan yang memiliki banyak aspek.
Saat melakukan debugging kode Anda atau mempelajari bagaimana skema saling terkait, alur kerja "jalankan Python, lalu periksa dengan DB Browser untuk SQLite" sangat efektif.Jalankan skrip Anda untuk mengisi basis data, tutup instance GUI apa pun yang mengunci file, lalu buka kembali. .sqlite Buka file di browser. Dari sana Anda dapat memeriksa isi setiap tabel dan menjalankan perintah ad-hoc. SELECT pertanyaan untuk memverifikasi asumsi Anda.
Satu hal yang perlu diperhatikan: SQLite memberlakukan penguncian file, jadi jika DB Browser membuka basis data dalam mode edit, skrip Python Anda mungkin gagal terhubung atau melakukan commit.Solusinya adalah menutup basis data di GUI (atau keluar dari browser sepenuhnya) sebelum menjalankan kode Python Anda lagi. Membiasakan diri menutup alat yang mengunci file basis data Anda akan menyelamatkan Anda dari kesalahan "basis data terkunci" yang misterius.
Dengan menggabungkan teknik-teknik ini – desain skema, batasan, kueri berparameter di Python, JOIN, GROUP BY, dan HAVING – Anda mendapatkan laboratorium lokal yang ampuh. untuk berlatih persis jenis pekerjaan SQL dan Python yang akan Anda lakukan di tempat kerja. Hanya dengan SQLite dan beberapa tabel contoh yang terstruktur dengan baik, Anda dapat berlatih menjawab pertanyaan ala wawancara, membuat prototipe logika analitik, dan mendapatkan kembali kepercayaan diri Anda dengan perangkat data modern.
Di sinilah platform seperti DataLemur dan kursus interaktif berperan.
Selain praktik lokal Anda, platform interaktif dapat memberikan pengalaman yang lebih terarah dengan umpan balik instan.Alat-alat yang lahir dari pengalaman industri dunia nyata – misalnya, platform yang dibuat oleh mantan insinyur data Facebook dan Google yang menghabiskan hari-hari mereka menulis SQL dan Python serta menjalankan uji A/B – sering kali memusatkan kontennya pada pertanyaan wawancara dan skenario analitik yang sebenarnya.
Buku-buku yang membahas statistik, pembelajaran mesin, dan intuisi bisnis untuk wawancara data sangat bagus untuk teori.Namun, alat-alat tersebut tidak selalu menyediakan lingkungan praktik SQL yang diinginkan banyak pelajar. Kesenjangan itulah yang ingin diisi oleh beberapa alat modern: mereka mengemas ulang ratusan contoh soal bergaya wawancara ke dalam lingkungan SQL dan analitik berbasis browser sehingga Anda dapat menjalankan, mengubah, dan menjalankan kembali kueri Anda tanpa perlu khawatir tentang pengaturan lokal. Anda juga dapat mencoba contoh-contoh terapan seperti... evaluasi risiko kehilangan pelanggan untuk menggabungkan SQL dengan alur kerja pembelajaran mesin dasar.
Anda juga akan menemukan kursus SQL interaktif yang mencerminkan topik-topik yang telah kita bahas di sini.: kueri tabel tunggal dengan SELECT ke WHERETermasuk penggabungan dua atau tiga tabel, agregasi dan pengelompokan, subkueri, dan banyak lagi. Banyak dari kursus ini mengandalkan kumpulan data realistis – misalnya permainan, museum, atau penjualan transaksional – sehingga pertanyaan-pertanyaan tersebut terasa seperti masalah bisnis yang sebenarnya, bukan teka-teki yang dibuat-buat.
Jika Anda merasa kewalahan dengan dokumentasi untuk alat-alat seperti PySpark, DuckDB, atau dbt, sangat wajar untuk menundanya sampai dasar-dasar SQL Anda terasa kuat.Dengan berfokus terlebih dahulu pada SQLite dan Python, Anda dapat memahami pola kueri inti tanpa harus berurusan dengan konfigurasi klaster atau izin cloud. Setelah dasar-dasarnya menjadi hal yang mudah, mempelajari PySpark lebih berfokus pada eksekusi terdistribusi daripada konsep kueri baru.
Pada akhirnya, kombinasi dari pengaturan lokal yang sederhana, soal latihan yang terstruktur, dan penggunaan platform interaktif sesekali adalah kunci keberhasilan. Memberikan Anda yang terbaik dari semua dunia: kendali penuh atas lingkungan Anda, landasan konseptual yang kuat, dan paparan terhadap gaya pertanyaan yang disukai oleh perusahaan-perusahaan terkemuka. Dengan latihan yang konsisten, perpaduan SQL, Python, dan alat rekayasa data yang dulunya menakutkan akan menjadi perangkat yang familiar, bahkan menyenangkan, yang dapat Anda gunakan dengan percaya diri dalam peran baru.
Jika dirangkum semuanya, langkah Anda ke depan sudah jelas: buat basis data SQLite dengan Python, rancang beberapa tabel realistis, pelajari pola SQL dasar dan menengah (filter, join, agregasi, pengelompokan, HAVING), bungkus kueri tersebut dalam skrip Python, dan secara opsional lengkapi pembelajaran Anda dengan platform SQL interaktif yang dibangun oleh praktisi yang pernah berada di posisi Anda sekarang.Dengan melakukan hal tersebut, Anda akan membangun kembali insting teknis Anda, mengurangi kecemasan seputar tumpukan data modern, dan siap untuk menangani tuntutan SQL dan Python dari peran data saat ini.