Học SQL cơ bản cho Data Analyst trong 10p – Phần 0

Chia sẻ ngay tại đây!
  • 216
  •  
  •  
  •  
  •  
    216
    Shares

SQL cơ bản nhất cho một Data Analyst. Nếu bạn muốn trở thành một Data Analyst thì trước tiên các bạn phải thật sự chuyên về SQL. Đơn giản vì nó sẽ là một phần trong công việc hằng ngày của bạn. Bài viết này sẽ hướng dẫn cho các bạn những cơ bản nhất về SQL để các bạn có thể bắt đầu quá trình học của mình.

Mình xin nêu rõ mục tiêu bài viết.

  • Dành cho đối tượng chưa từng học về lập trình =>level 0
  • Giới thiệu cách thức hoạt động cơ bản của một lệnh SQL
  • Giải thích những lệnh SQL cơ bản
  • Hướng dẫn làm thế nào để bắt đầu viết một lệnh SQL
  • Kiến thức cơ bản về SQL để các bạn có thể tự nghiên cứu
  • Các nguồn để tự học và một số bài tập thực hành

Giới thiệu về hệ quản trị cơ sở dữ liệu (DBMS)

Phần này dành cho các bạn chưa biết gì database và không hiểu được tại sao phải cần nhiều loại DBMS. Bạn nào đã hiểu rồi thì đọc thêm cho vui nhé. 

Còn những bạn làm về kinh tế hay các lĩnh vực khác mà chưa biết tại sao ai cũng nói về Big Data thì đọc để hiểu sơ sơ nhé.

Hình thái ban đầu của DBMS

Để hiểu được các DBMS hiện tại thì mình quay lại quá khứ chút nhé. Vì mình làm về data nên mình luôn “sống và làm việc theo chủ nghĩa thời gian”. Các bạn đọc tiếp và tự cảm nhận.

Đầu tiên bạn tưởng tượng, vào chục năm trước, bạn đi học trên trường cấp 1 và 2 có một số tiền thừa nho nhỏ vì bạn đầu thai ngay trên mâm vàng.

Thế là bạn bắt đầu trở thành chủ nợ của mấy thằng bạn thân. Lúc này các bạn thường dùng vở hay sổ tay để ghi lại tên từng đứa để còn biết đòi nợ. => Đây là hình dạng sơ khởi nhất của DBMS.

Cho bạn mượn tiền

Lớn lên một chút, vào cấp 3 và đại học, bạn nhận ra rằng mình có trong tay một danh sách dài những người mượn tiền thường xuyên. Thế là bạn bắt đầu tính toán xem nếu mình tính lãi theo tháng thì sẽ ntn? Nhưng nếu cho nhiều người mượn vậy lại còn có lãi suất, sử dụng giấy vở đôi khi khó mà tính được chính xác số tiền cần thu. Bạn tìm đến phần mềm Excel.

Lúc này bạn đã bắt đầu sử dụng máy tính để quản lý dữ liệu của mình nhưng nó vẫn chưa được gọi là hệ quản trị cơ sở dữ liệu vì nó vẫn còn đơn chiếc.

Sự hình thành của DBMS

Hệ quản trị cơ sở dữ liệu DBMS

Sau khi ra trường, bạn thấy được tiềm năng của việc cho vay có lãi. Bạn bắt đầu thành lập một công ty chuyên cho vay lãi nhẹ  trên địa bàn bạn sinh sống. Bạn còn có website riêng để quảng bá thương hiệu và các ứng dụng về quản lý.

Lúc này lượng dữ liệu tăng lên rất nhiều và phức tạp. Những file dữ liệu đơn Excel không thể giải quyết được gì. Cuối cùng Google khuyên bạn nên cài đặt những phần mềm như MySQL hay SQL Server để quản lý kho dữ liệu của bạn. Cũng là để cho các ứng dụng khác hoạt động được.

Sau khi cài đặt bạn nhận thấy database và Excel spreadsheet lại có nét khá tương đồng. Database gồm nhiều bảng dữ liệu liên kết với nhau cũng tương tự như Excel có nhiều sheet dữ liệu. Chúng cũng có hàng, cột và mỗi cột có một tiêu đề (header). Nhưng bạn cũng nhận ra là Database có nhiều tính năng vượt trội giúp công ty dễ dàng quản lý và báo cáo hơn. (Google sẽ giúp các bạn hiểu rõ hơn vấn đề này)

Sự ra đời của Big Data

Vài năm sau khi bạn thành lập công ty, bây giờ nó đã trở thành một tập đoàn tài chính nổi tiếng khắp cả nước trong lĩnh vực cho vay lãi nhẹ. Các bạn còn có nhiều ứng dụng khác nhau để phục vụ khách hàng và còn mua thêm nhiều công ty khác.

4v big data
Nguồn: IBM

Lúc này dữ liệu của bạn không chỉ trở nên khổng lồ (Volume), mà nó còn liên tục tăng mỗi giây trôi qua (Velocity), với nhiều loại định dạng khác nhau như video, hình ảnh, vv (Variety) và nhiều lúc bạn không biết được dữ liệu mình lưu trữ là gì (Veracity).

Với 4 chữ V như trên, thuật ngữ Big Data được hình thành. Và để quản lý được Big Data người ta cần có những phần mềm còn mạnh hơn cả những DBMS bình thường. Thế là Google lại giới thiệu bạn đi cài đặt Hadoop hay MongoDB.

Muốn tìm hiểu kỹ hơn thì bác Google sẽ đồng hành cùng bạn.

Tại sao lại cần SQL cho Data Analyst

Bây giờ bạn muốn biết phải tăng lãi suất đến mức nào để khách hàng vẫn tin tưởng là mình đang vay với lãi nhẹ. Thế là bạn đi thuê người giúp bạn làm việc này và từ đó Data Analyst ra đời.

Data Analyst sử dụng SQL cơ bản

Một phần công việc của những Data Analyst là truy xuất dữ liệu từ những DBMS này ra và phân tích kết quả. Để làm được điều này họ sử dụng một ngôn ngữ lập trình tên là SQL (Structured Query Language). Không cần phải dịch ra tiếng Việt làm gì, cứ nói chuyện với nhau thì phát âm là “Ếch kiu eo” hoặc “si cồ” là được.

Phần tiếp theo của bài này sẽ hướng dẫn cho các bạn cách hoạt động của một lệnh SQL và cách viết một SQL ntn cho hiệu quả.

Viết đến đoạn này thì mình nhớ lại một comment của một bạn trên facebook là tự thấy … Các bạn đọc nội dung trên hình sẽ hiểu

SQL căn bản - Sai chính tả

Thế đấy mấy bạn ạ. Đã viết sai chính tả mà cứ đòi viết cho nhiều. Nhưng thôi kệ, lỡ viết rồi nên mình giữ lại vậy. Các bạn đọc mà thấy sai chính tả thì thông cảm nhé, mình đã cố hết sức rồi chứ không phải viết bừa đâu.

Giờ thì chuẩn bị vào phần trọng tâm nhé!

Lưu ý: mình mặc định các bạn đã đọc và cài đặt các phần mềm ở bài viết này. Hướng dẫn cài đặt MySQL và database mẫu.

Còn bạn nào chưa đọc những kỹ năng cần thiết cho Data Analyst thì đọc đi nhé.

Cách hoạt động của một lệnh SQL ĐƠN cơ bản

Bây giờ các bạn đọc đoạn mã sau:

Cấu trúc lệnh SQL căn bản

WTF SQL query mẫu

Đọc xong chắc tụt hết cảm xúc nhỉ. Thực ra nó đơn giản hơn bạn nghĩ.

Bây giờ bắt đầu lại từ đầu. Các bạn quên hết đoạn mã trên nhé!

Đầu tiên các bạn có một bảng dữ liệu, lúc này chỉ có một bảng nên bạn cứ nghĩ nó như 1 file Excel vậy, không hơn không kém.

Và bạn muốn biết được một số thông tin từ bảng dữ liệu đó (cái này các bạn phải biết trước trước khi bắt đầu viết SQL). Trong ví dụ này mình muốn biết thông tin sau: cho biết top 10 loại Pokemon mà có nhiều pokemon nhất và những pokemon này đều phải có lực tấn công lớn hơn 50 attack > 50.

VD: mình có bảng dữ liệu sau

Pokemon Type Attack Defense
A Grass 30 60
B Bug 60 30
C Bug 80 60
D Grass 70 50
E Grass 40 70

Như ví dụ trên, bạn sẽ thấy Pokemon loại Grass có tổng cộng 3 pokemon nhưng chỉ có 1 Pokemon là lớn hơn 50. Còn Loại Bug, tuy chỉ có 2 pokemon nhưng cả 2 đều có attack lớn hơn 50.

Vì vậy nếu chọn ra Top 1 thì Bug sẽ được chọn thay vì Grass. Tương tự cho câu hỏi trên.

Các lệnh cơ bản của một SQL query

Để trả lời câu hỏi trên bạn trước tiên phải biết được dữ liệu đó nằm ở đâu. Thế là bạn tìm đến bảng pokemon_table. Để làm việc này bạn sử dụng lệnh From pokemon_table. Lệnh From sẽ giúp chương trình hiểu là bạn đang muốn làm việc với bảng nào.

Và mình khuyến khích là luôn nên bắt đầu từ lệnh From trong mọi trường hợp (đây là kinh nghiệm cá nhân)

Tiếp theo bạn cần phải chọn ra tất cả Pokemon theo điều kiện đã cho. Và ở đây là Attack > 50.

Bạn sử dụng lệnh Where attack > 50. Lệnh Where sẽ giúp chương trình hiểu đây là những điều kiện mà bạn muốn lọc (filter) trước khi thực hiện những việc khác.

Nếu có nhiều điều kiện khác nhau bạn chỉ cần thêm AND hoặc OR và viết tiếp điều kiện

VD: WHERE attack > 50 AND defense > 50

Hoặc WHERE attack > 50 OR defence > 50

Bạn sẽ thấy có 2 từ khác nhau là ANDOR. 2 từ này hiểu như sau:

AND: hệ thống sẽ chỉ trả lại dữ liệu nào đúng với cả tất cả điều kiện được nêu ra. Với ví dụ trên thì chỉ trả về Pokemon có cả attack > 50 đồng thời có Defense > 50 chỉ có Pokemon C

OR: khác với AND, lúc này hệ thống sẽ trả lại tất cả dữ liệu nào thỏa mãn ít nhất một điều kiện đưa ra. Với ví dụ trên thì sẽ trả về hoặc là Pokemon có attack > 50 hoặc Pokemon có defense > 50 tất cả các pokemon đều thỏa mãn điều kiện

Các phép so sánh khác các bạn xem thêm tại đây. Mình chỉ giúp các bạn hiểu cách hoạt động thôi. Cơ bản nó như các phép tính toán học bình thường trên lớp vậy

Bây giờ mình đã có được địa chỉ bảng From và điều kiện filter Where rồi.

Tiếp đến các bạn sẽ thực hiện nhóm các Pokemon có cùng loại lại với nhau. Để đếm số lượng pokemon của từng loại các bạn bắt buộc phải nhóm chúng lại trước thì mới đếm được. 

GROUP BY

Lúc này bạn cần dùng lệnh Group By type. Vì yêu cầu là tìm số lượng Pokemon của từng loại Pokemon nên khi nhóm các bạn cần sử dụng type để nhóm.

Bảng dữ liệu lúc này các bạn có thể hình dung như sau

Type Pokemon Attack Defense
Grass D 70 50
Bug B 60 30
C 80 60

Vì lúc này mình đã loại tất cả ra và chỉ giữ lại pokemon có Attack > 50 sau đó nhóm chúng lại với nhau theo group của nó.

Bây giờ bảng giữ liệu của mình cũng tạm ổn rồi. Nhưng yêu cầu của chúng ta là đếm số lượng pokemon của mỗi nhóm. Để thực hiện việc này chúng ta dùng lệnh <b>count(pokemon)</b>.

Lúc này câu lệnh của mình sẽ trở thành như thế này

SQL căn bản 0

Phần lệnh As num_pokemon mục đích là đặt tên lại cho lệnh count(pokemon) để tiện cho việc sử dụng lại và hiểu ý nghĩa của lệnh đó. Đọc tiếp bạn sẽ hiểu thấy mình dùng thế nào.

Chú ý: tất cả những thông tin chúng ta muốn có được sau cùng đều phải được đặt trong câu lệnh SELECT.  Và lệnh SELECT này phải luôn nằm trên cùng.

Để biết được cụ thể số lượng pokemon của từng loại pokemon. Chúng ta cần thêm pokemon type vào lệnh select. Mỗi loại thông tin cách nhau bởi dấu , (dấu phẩy)

Bây giờ chúng ta sẽ có lệnh sau

Lệnh SQL căn bản 2

Nếu các bạn chạy lệnh trên bạn sẽ được một bảng tương tự như dưới:

Pokemon_type num_pokemon
Grass 1
Bug 2

Vậy là gần xong rồi. Tiếp tục nhé!

Các lệnh cơ bản của một SQL query (tiếp tục)

Và yêu cầu còn lại của đề bài là chọn ra top 10 có số lượng pokemon nhiều nhất. Để làm được điều này thì đầu tiên chúng ta phải sắp xếp chúng theo thứ tự từ cao xuống thấp và chọn 10 nhóm đầu tiên. Logic đơn giản phải không nào.

Câu lệnh khá đơn giản. Chúng ta dùng Order by num_pokemon desc sau đó là limit 10.

Lệnh đầu tiên sẽ sắp xếp lại dữ liệu theo trình tự giảm dần desc dựa trên num_pokemon. Trong trường hợp khác nếu bạn muốn tăng dần thì bạn sử dụng asc.

Lưu ý: Bạn bắt buộc phải có một trong 2 thành phần này nếu muốn sử dụng order by

Lệnh tiếp theo sẽ chỉ lấy 10 kết quả đầu tiên. Đơn giản vậy thôi. Vi chúng ta đang sử dụng MySQL nên lệnh này là Limit. Các bạn sử dụng các DBMS khác thì có thể sẽ cần Top 10.

Cuối cùng lệnh SQL của chúng ta sẽ trở thành

Và kết quả sẽ có dạng như sau:

Type num_pokemon
Bug 2
Grass 1

Nếu chúng ta có tầm 15 loại Pokemon thì kết quả sẽ chỉ chọn ra tối đa 10 loại. Trong VD  trên của mình là có 2 loại nên nó sẽ lấy toàn bộ.

Tổng kết cách viết lệnh SQL hiệu quả 

Bây giờ các bạn đã biết được một lệnh SQL cơ bản bao gồm những thành phần nào rồi. Các bạn xem lại hình bên dưới để xem về thứ tự hoạt động của SQL nhé.

Thứ tự hoạt động cơ bản của SQL query

(*) Chú ý: tuần tự hoạt động của lệnh SQL rất phức tạp và không hề cố định. Mình đưa ra quy trình trên cơ bản chỉ giúp bạn hình dung được cách phân tích câu hỏi và viết lệnh SQL cơ bản. Càng về sau thứ tự sẽ phức tạp hơn nhiều.

Đây chính là bước đầu tiên của việc phân tích dữ liệu. Các bạn phải biết cách phân tích câu hỏi để kết nối với dữ liệu. Sẽ không có một quy trình cụ thể nào cả, tùy theo yêu cầu mà các bạn đặt những câu hỏi khác nhau.

Vậy một câu lệnh SQL hoàn chỉnh là như thế nào?

Cấu trúc hoàn chỉnh của lệnh SQL

Không chỉ với SQL, tất cả các ngôn ngữ lập trình khác không hề giới hạn số lượng câu lệnh mà bạn muốn viết. Nhưng nó có giới hạn về số lượng ít nhất. Và với SQL thì số lượng đó là 2 bao gồm các lệnh sau:


SELECT pokemon_type
FROM pokemon_table

Đây là 2 câu lệnh bắt buộc phải có trong mọi câu truy vấn SQL. Hiểu đơn giản là bạn muốn biết thông tin gì thì bạn phải cần nơi lưu trữ dữ liệu FROM và nội dung cần lấy SELECT.

Tất cả những lệnh còn lại đều là tùy chọn. Nhưng có một ngoại lệ đối với Select là nếu bạn chỉ muốn biết những dữ liệu cố định.

VD: SELECT 4+5 hay SELECT "Hello World"

Một chú  ý khác với GROUP BYĐó là nếu bạn sử dụng bất cứ một hàm nào trong phần SELECT, như ví dụ trên là Count(Pokemon), và bạn muốn lấy thêm thông tin khác, bạn bắt buộc phải sử dụng GROUP BY để nhóm tất cả các thành phần khác lại. 

Các hàm còn lại xem tại đâyđây nhé!

Ví dụ: Nếu mình có danh sách học sinh trên toàn thành phố và mình muốn biết được  số lượng học sinh của mỗi lớp tại mỗi trường. Lúc này lệnh SQL của mình sẽ là:


SELECT ten_truong, ten_lop, COUNT(ten_hoc_sinh)
FROM danh_sach_hoc_sinh
GROUP BY ten_truong, ten_lop

Nhưng nếu bạn chỉ muốn biết tổng số học sinh bạn chỉ cần:


SELECT COUNT(ten_hoc_sinh)
FROM danh_sach_hoc_sinh

Nếu các bạn chỉ chọn một ten_truong hoặc ten_lop thì hệ thống sẽ báo lỗi. Hiểu đơn giản là đầu tiên nó sẽ nhóm tất cả học sinh cùng lớp lại với nhau và đếm số học sinh.

Nhưng để biết lớp đó thuộc trường nào thì nó bắt đầu nhóm thêm một lần nữa là nhóm các lớp có chung trường lại. Chính vì vậy các bạn cần phải có cả 2 ở phần Group By.

Tương tự nếu các bạn cần thêm bao nhiêu thông tin thì gắn ở Group By bấy nhiêu.

Tips: các bạn có thể sử dụng các phép tính như +,-,*,/ trong phần SELECT như vd mình nêu trên nhé.

Đọc nhiêu đó chắc đủ khùng rồi nhĩ. Để các bạn có thể nhớ lâu thì chỉ có thực hành thôi.

Bài tập thực hành SQL cơ bản

Bài viết đầu tiên cho cơ bản nên mình sẽ dừng lại ở đây. Các bạn đọc chưa hiểu thì đọc lại thêm 1 lần nữa nhé. Nếu đọc lại mà vẫn chưa hiểu thì comment bên dưới để mình biết mà thay đổi cách viết trong lần tới.

Chuẩn bị cho thực hành viết SQL cơ bản

Nếu bạn chưa cài đặt các phần mềm cần thiết cho việc lập trình SQL thì đọc ngay bài này nhé. Mình hướng dẫn cách cài đặt phần mềm và database mẫu cho phần thực hành.

Nếu bạn đã có sẵn mọi thứ thì tải file Pokemon này về và cùng thực hành những câu hỏi sau nhé.

Trước tiên mình muốn nói vài lời.

cách Học SQL cơ bản hiệu quả

Thứ nhất: Mình khuyến khích tất cả các bạn mới comment phần code của mình sau khi hoàn thành các câu hỏi để mọi người cùng học hỏi lẫn nhau. Chỉ tốn của các bạn tầm 10s để copy và paste lên đây thôi

Thứ hai: trước khi tự mình hoàn thành thì không được đọc code của người khác. Điều này sẽ dẫn đến việc các bạn không chịu suy nghĩ và sẽ rất khó để nâng cao tay nghề

Thứ ba: nếu các bạn có câu hỏi hay lỗi các bạn gặp phải lúc thực hành, trước tiên hãy đọc thông báo lỗi và lên hỏi Google trước nhé. Vì khi bạn đi làm sẽ chả có ai ngồi bên để giúp bạn giải quyết đâu. Lúc này Google chính là bạn thân của bạn.

Thứ tư: nếu đã đọc và hiểu bài viết của mình và hoàn thành tất cả các câu hỏi mình đưa ra thì bay vào Google đọc kỹ hơn nhé. Một nguồn tốt là xem ở w3choool.com

Mình sẽ không đi sâu giải thích tất cả các thuật ngữ vì ngoài kia người ta đã làm rất nhiều rồi. Mình sẽ thiên về phần techniquetipsthực hành thực tế để các bạn làm quen. Học lý thuyết chay thì khó mà xin việc được.

Cuối cùng: Nếu thấy hay thì đừng quên chia sẻ nhé!

Bonus: mình cố ý thiết kế các câu hỏi khó hơn bài viết để các bạn tự học thêm. Các bạn thật sự muốn trở thành Data Analyst thì tìm cách trả lời hết nhé. Nên nhớ phải phân tích câu hỏi trước khi bắt đầu viết code.

Câu hỏi thực hành SQL cơ bản

Bây giờ bắt đầu bộ câu hỏi về thực hành truy vấn SQL sử dụng database Pokemon nhé:

Thực hành lập trình SQL cơ bản

  1. Có bao nhiêu loại Pokemon và mỗi loại có tổng cộng bao nhiêu pokemon. Chỉ sử dụng Type1
  2. Cho biết top 10 pokemon có tổng 3 chỉ số (Attack, Defense và Speed) thấp nhất
  3. Cho biết điểm trung bình AttackDefense của mỗi loại Pokemon. Sử dụng Type1. Tips: https://www.w3schools.com
  4. Cho biết tất cả legendary pokemon thuộc 2 loại khác nhau và có Type1 = 'Fire' VD: Volcanion là Legendary Pokemon thuộc 2 loại khác nhau và có Type1 = 'Fire'
  5. Số điểm base_total cao nhất, thấp nhất, trung bình của mỗi loại pokemon (type1) là bao nhiêu?
  6. Không tính Legendary pokemon, cho biết top 10 pokemon có chỉ số base_total cao nhất.

Nhiêu đây chắc đủ để các bạn thực hành trong vài hôm. Các bạn có thể tự đặt câu hỏi rồi sử dụng SQL để trả lời nhé. Các bạn chưa biết gì về lập trình nên đọc ít nhất 2 lần nhé.

Đọc tiếp phần tiếp theo về cách sử dụng SQL Join tại đây nhé


Chia sẻ ngay tại đây!
  • 216
  •  
  •  
  •  
  •  
    216
    Shares
  • 216
    Shares

30 thoughts on “Học SQL cơ bản cho Data Analyst trong 10p – Phần 0”

  1. Phạm Văn Trình

    1 )
    select type1 as Loai ,count(*) as SoLuong
    from pokemon
    group by type1
    2 )
    select *
    from pokemon
    order by attack asc,defense asc,speed asc
    limit 10
    3)
    select type1 as Loai ,avg(attack) as attack , avg(defense) as defense
    from pokemon
    group by type1
    4)
    select * from pokemon
    where is_legendary = 1 and type1 type2
    5)
    select type1 as Loai ,max(base_total) as CaoNhat , avg(base_total) as Trungbinh , min(base_total) as ThapNhat
    from pokemon
    group by type1
    6)
    select * from pokemon
    where is_legendary = 0
    order by base_total desc
    limit 10

    Thanks bạn nhé , bài viết hay lắm , cố gắng viết nhiều nhé !

    1. Well done!
      Chắc mình nêu câu hỏi chưa được rõ ràng lắm. Mình có chỉnh lại chút ít.
      Bạn kiểm tra lại thử lại câu 2 và số 4 nhé.

  2. Phạm Văn Trình

    2)
    select *,(attack + defense + speed ) as ChiSo from pokemon
    order by (attack + defense + speed ) asc
    limit 10
    4)
    select * from pokemon
    where is_legendary = 1 and type1 type2 and type1 = ‘Fire’
    Ok , Thanks bạn nhé

    1. 4) SELECT *
      FROM dbo.pokemontype
      WHERE is_legendary = 1 AND type1 = ‘fire’ AND type2 IS NOT NULL
      câu 4 chỗ and type1 type2 là sai rồi ban đó là điều kiện nó phải so sánh với cái gi đó

      1. Phạm Văn Trình

        Hi Thông , mình so sánh type1 # type2 , nhưng khi paste lên đây bị mất kí tự khác trong my sql nhé.

  3. 1)
    select type1, count(type1)
    from pokemon.pokemon
    group by type1
    2)
    select name, attack, defense, speed
    from pokemon.pokemon
    order by attack+defense+speed asc
    3)
    select type1, avg(attack+defense)
    from pokemon.pokemon
    group by type1
    4)
    select name, is_legendary, type1, type2
    from pokemon.pokemon
    where is_legendary = 1 and type1 = ‘Fire’ and type1 type2
    5)
    select type1, max(base_total), min(base_total), avg(base_total)
    from pokemon.pokemon
    group by type1
    6)
    select name, base_total
    from pokemon.pokemon
    where is_legendary = 0
    order by base_total desc
    limit 10

    *** Cảm ơn anh vì bài viết hữu ích ***

    1. Câu 4
      select name, is_legendary, type1, type2
      from pokemon.pokemon
      where is_legendary = 1 and type1 = ‘Fire’ and type1 type2

      type1 type2 em ghi là type1 type2 nhưng khi comment bị mất ạ

  4. Xin lỗi các bạn vì lỗi hiển thị nhé. Mình ko biết là có lỗi đó. Mình sẽ tìm cách sửa.

    Những bạn khác cứ tiếp tục viết và comment lên đây nhé. Chủ yếu là để thực hành và học hỏi cách viết code của nhau.

  5. 2.SELECT type1, (attack + defense + speed) as Tong
    FROM `pokemon`
    GROUP by type1
    ORDER by Tong ASC
    limit 10

    1. Theo kinh nghiệm mình nếu bạn có thể sử dụng thành thạo Pivot table, CTO (With), Join nhiều tables (mà ko bị dư hay thiếu dữ liệu) là đủ xài. Bạn cần thêm khả năng tự audit logic sql của mình. Những functions phổ biến thì bắt buộc phải biết rồi.

  6. 1)
    SELECT type1, COUNT(type1)
    FROM pokemon GROUP by `type1`

    2) SELECT name, attack, defense, speed, (attack + defense + speed) as total
    FROM pokemon
    ORDER BY `total` ASC
    LIMIT 10

    3)
    SELECT `type1`, AVG(attack), AVG(defense)
    FROM pokemon
    GROUP BY type1

    4)
    SELECT name
    FROM pokemon
    WHERE `is_legendary`= 1 AND `type1`= ‘fire’ AND type2 IS NOT NULL

    5)
    SELECT type1, min(base_total), MAX(base_total), avg(base_total)
    FROM pokemon GROUP by `type1`

    6)
    SELECT name
    FROM pokemon
    WHERE is_legendary = 0
    ORDER BY base_total DESC
    LIMIT 10

    ở câu 2 ấy ạ, trong code em xài tạm attack + defense + speed. Vậy có thể dùng hàm sum vào chỗ đó được không ạ và nếu dùng thì cú pháp ra sao ạ? Em đã thử khá nhiều cách nhưng vẫn bị error.

    Bài tập của anh thật sự rất hay, không quá dễ nhưng vẫn đủ để newbie thật sự động não và vận dụng linh hoạt SQL. Ủng hộ anh tiếp tục ra thật nhiều bài vì mỗi bài đều cực kì chất lượng ạ.

    1. Ở câu 2, sử dụng (attack + defense + speed) là đúng rồi bạn. KHÔNG THỂ sử dụng SUM trong trường hợp này được vì:

      – Mỗi pokemon đều có một giá trị attack, defense, speed duy nhất và chúng được lưu trên cùng 1 dòng nên để tính tổng thì dùng phép toán “+”
      – SUM chỉ dùng khi nào muốn tính tổng dữ liệu ở nhiều dòng dữ liệu khác nhau của một đối tượng (VD: TỔNG attack của type1 = ‘Fire’) và cần phải đi chung với Group By. Vì hệ thống cần biết mình muốn cộng theo nhóm nào. Như ở câu 3 thì mình Group By Type1 vậy đó.
      – SUM chỉ nhận một giá trị đầu vào nên bạn ko thể truyền một lúc 3 biến được, nhưng bạn có thể truyền một phép tính vào đó.
      VD: Sum(attack + defense + speed) hay Sum(attack*defense) là chính xác.

  7. Thuy Anh Nguyen

    Em xin phép gửi anh câu trả lời của em ạ:

    1) select type1, count(type1) as n0_type
    from pokemon
    group by type1
    order by n0_type
    Ở câu 1 em có thắc mắc về câu lệnh xuất số type pokemon, em có sử dụng lệnh count(distinct(type_1) tuy nhiên không thể lồng vào đoạn trên, tức em chỉ có thể hiển thị câu trả lời của 2 ý nhỏ 1 cách riêng biệt với nhau. Em không biết có cách nào để hiển thị 2 thông tin trên cùng lúc không ạ?
    2)select name, (attack+speed+defense) as score
    from pokemon
    group by name
    order by score asc
    limit 10

    3) select type1, avg(attack), avg (defense)
    from pokemon
    group by type1

    4)select name, type1, type2, is_legendary
    from pokemon
    where type1 = ‘Fire’ and type2 is not null and is_legendary = 1

    5) select type1,max(base_total), min(base_total), avg(base_total)
    from pokemon
    group by type1

    6)select name, base_total
    from pokemon
    where is_legendary = 0
    order by base_total desc
    limit 10
    Cảm ơn anh vì bài giảng hữu ích ạ. Em rất mong những phần tiếp theo ạ.

  8. a ơi cho e hỏi câu 2: tại sao dùm hàm ASC ạ,e là ng mới bắt đầu nên hơi rối.Hàm bên đây xài giống bên excel k ạ ?

    1. Logic đơn giản là mình cần sắp xếp dữ liệu từ thấp lên cao rồi lấy10 kết quả đầu tiên. Để sắp xếp trong SQL thì mình dùng lệnh Order by và lệnh này sẽ đi kèm với 2 loại:
      – ASC: sắp xếp tăng dần từ thấp lên cao. Loại này sẽ là mặc định nếu mình để trống
      – DESC: sắp xếp giảm dần từ cao xuống thấp
      Lưu ý:
      – Nếu chỉ để Order By type1 => mặc định sẽ là tăng dần
      – Nếu muốn sắp xếp theo nhiều điều kiện thì cần phải có loại sắp xếp cho mỗi điều kiện, nếu không toàn bộ sẽ mặc định là ASC và sẽ sắp xếp ưu tiên từ TRÁI SANG PHẢI
      VD: Order by type1 DESC, attack => ưu tiên sắp xếp giảm dần theo Type1 trước, sau đó sắp xếp tăng dần theo attack

  9. mình cũng gửi phần bài tập của mình. cảm ơn tác giả bài viết nhiều nhiều!!

    –cau 1
    select type1, count(name) as num_pokemon
    from pokemon
    group by type1
    order by num_pokemon asc

    –cau 2
    select name, attack+defense+speed as power
    from pokemon
    group by name
    order by power asc
    limit 10

    –cau 3
    select type1, avg(attack), avg(defense)
    from pokemon
    group by type1

    –cau 4
    select NAME, type1, TYPE2, is_legendary
    from pokemon
    where is_legendary = 1 AND type1=’fire’ and TYPE1 TYPE2

    –cau 5
    select type1, max(base_total), min(base_total), avg(base_total)
    from pokemon
    group by type1
    order by avg(base_total) desc

    –cau 6
    select name, base_total, is_legendary
    from pokemon
    where is_legendary = 0
    order by base_total desc
    limit 10

  10. Lê Đức Trọng

    Em gửi phần của mình. Cảm ơn anh nhiều ạ.
    1.
    select type1, count(name) as num_pokemon
    from pokemon p
    group by type1
    order by num_pokemon desc
    2.
    select name, (attack+defense+speed) as chiso
    from pokemon p
    group by chiso
    order by chiso asc
    limit 10
    3. Cho biết điểm trung bình Attack và Defense của mỗi loại Pokemon. Sử dụng Type1.
    select type1, avg (attack+defense) as trungbinh
    from pokemon p
    group by type1
    order by trungbinh asc
    4.
    select name, type1, type2, is_legendary
    from pokemon p
    where is_legendary=1 and type1=’Fire’ and type1 and type2
    5.
    select type1, max(base_total) as lonnhat, avg(base_total) as trungbinh, min(base_total) as nhonhat
    from pokemon p
    group by type1
    6.
    select name, (base_total) as chiso
    from pokemon p
    where not is_legendary
    group by name
    order by base_total desc
    limit 10

  11. Trung Do Thanh

    1/ SELECT type1, COUNT(type1) as Qty FROM pokemon
    GROUP by type1
    ORDER by Qty DESC

    2/SELECT name,attack,defense,speed, SUM(attack+defense+speed) as Tong_chiso
    FROM pokemon
    GROUP BY name
    ORDER BY Tong_chiso ASC
    LIMIT 10

    3/SELECT type1,attack,defense, AVG(attack+defense) as Trungbinh_Chiso FROM pokemon
    GROUP BY type1
    ORDER BY Trungbinh_chiso DESC

    4/SELECT name,type1, type2, is_legendary FROM pokemon
    WHERE type1 = ‘fire’ AND is_legendary = 1 AND type1 type2
    GROUP BY name

    5/SELECT type1, MAX(base_total) as max_total, MIN(base_total) AS min_total, AVG(base_total) AS avg_total
    FROM pokemon
    GROUP BY type1
    ORDER BY max_total DESC

    6/SELECT name, base_total FROM pokemon
    WHERE is_legendary = 0
    GROUP BY name
    ORDER by base_total DESC
    LIMIT 10

    1. bro cho mình hỏi, ở bài 2 tại sao lại phải group by name nhỉ? mình có thử ko group by name, thì bị lặp kết quả.
      ngoài ra, hình như phần SUM(attack+defense+speed) là chưa đúng, nếu dùng SUM mình thấy phần Tong_chiso bị cao lên khá nhiều, ko biết là do đâu nữa

      1. +) Ở bài 2 dù dùng group by name hay ko dùng thì đều ra kết quả giống nhau mà nhỉ
        +) Hàm SUM(cột A) sẽ cộng tất cả các giá trị của cột A lại (tức là nó sẽ cộng theo chiều dọc). Nên SUM(attack+defense+speed) sẽ cộng tất cả các giá trị từ 3 cột attack, cột defense, cột speed lại với nhau (cộng cả chiều ngang với chiều dọc) nên Tong_chiso sẽ bị cao lên khá nhiều

  12. 1, select type1 as name, count(type1) as soluong
    from pokemon p2
    group by type1
    2, select type1 as name, attack, defense, speed
    from pokemon
    group by type1
    order by (attack + defense + speed) asc
    limit 10
    3, select type1 as name, attack, defense, (attack+defense)/2 as trungbinh
    from pokemon
    group by type1
    the results from newbie

  13. 4, select *
    from pokemon p
    where is_legendary = 1 and type1 = “fire” and type2 is not null
    5, select type1 as name, max(base_total) as caonhat, min(base_total) as thapnhat, avg(base_total ) as trungbinh
    from pokemon p
    group by type1
    6, select name, base_total
    from pokemon
    where is_legendary = 0
    group by name
    order by base_total desc
    limit 10
    Ps: This is aff of SQL having a result from me, in case it wrong i want to get any comment and opinion from friends.

  14. 1.
    select type1, count(type1)
    from pokemon p
    group by type1
    2.
    select name, attack , defense, speed
    from pokemon p
    order by (attack+defense+speed) asc
    limit 10

  15. Anh cho em hỏi trong quá trình làm, nếu đang làm dở dang và muốn lưu lại để lúc rảnh tiếp tục làm mà không bị mất các câu lệnh đã nhập thì làm cách nào ạ

  16. 1. select type1 as pokemon_type ,count(*) as quantity
    from pokemon
    group by type1

    2. select name as pokemon_name ,attack+defense+speed as properties_sum
    from pokemon
    order by properties_sum asc
    limit 10

    3. select type1 as pokemon_type ,AVG(attack) as avg_A ,AVG(defense) as avg_D
    from pokemon
    group by pokemon_type

    4.select *
    from pokemon
    where is_legendary = 1 and type1 type2 and type1=’fire’

    5. select type1 as pokemon_type ,max(base_total) as highest_base_total ,min(base_total) as lowest_base_total ,avg(base_total) as avg_base_total
    from pokemon
    group by type1

    6. select *
    from pokemon
    where is_legendary=0
    order by base_total desc
    limit 10

    Cám ơn anh rất nhiều <3

  17. 1.select type1, count(type1) as num_pokemon
    from pokemon p
    group by type1

    2.select type1
    from pokemon p
    where attack<50 and defense<50 and speed<50
    group by type1
    limit 10

    3.select type1, avg(attack) ,avg(defense)
    from pokemon p
    group by type1

    4.select name
    from pokemon p
    where is_legendary = 1 and type1 = 'fire' and type2 is not null

    5.select type1, min(base_total), avg(base_total) ,max(base_total)
    from pokemon p
    group by type1

    6.select type1, max(base_total) as highest_base_total
    from pokemon p
    where not is_legendary
    group by type1
    order by highest_base_total desc
    limit 10

    Em xin phép nộp bài ạ, cảm ơn anh

Leave a Comment

Your email address will not be published. Required fields are marked *