#mysql #sql #database #database-design
Вопрос:
Ребята, позвольте мне выразиться яснее. Я изучаю MYSQL и практикуюсь в функции «count()». У меня есть таблица под названием «Город», где у меня есть идентификатор, имя, код страны, района и населения. Моей первой идеей было узнать, сколько у меня городов по стране
SELECT *, Count(name) as "total" FROM world.city GROUP BY countrycode;
Это сработало, была создана дополнительная колонка с количеством городов по каждой стране. Я хотел бы знать, сколько у меня стран, подсчитав количество отдельных строк (я знаю, что у a есть эта информация в нижней части рабочего стола, но я хотел бы знать, чтобы эта информация отображалась в моем запросе). Я попытался добавить счетчик(код страны), но это не сработало, как я ожидал, появилось число 4079, которое является общим количеством городов, которые у меня есть. Я понял, что мой «Count()» вычисляет количество строк внутри каждой страны, не считая количества кодов, которые у меня есть для каждой страны. Возможно ли получить эту информацию?
Комментарии:
1. Ваш запрос должен выдать ошибку, так как вы выбираете все столбцы, но группируете их только по одному
2.
SELECT COUNT(DISTINCT countrycode) FROM world.city
Ответ №1:
(Мини-урок для новичка.)
- Первое, что нужно усвоить, — это
COUNT(*)
обычный способ использованияCOUNT
. И вы получите количество строк. Напротив,COUNT(name)
подсчитывает количество строк с ненулевымиname
значениями. - Затем идет способ использования
DISTINCT
. Это не функция. ТакCOUNT(DISTINCT a,b)
подсчитывается количество различных комбинацийa
иb
. ИCOUNT(DISTINCT(a))
хотя это работает «хорошо» и «правильно», родители лишние. Так что используйтеCOUNT(DISTINCT a)
. - Не используйте
*
сGROUP BY
собой . То естьSELECT *, ... GROUP BY ...
это неправильно. Обычный способ сказать что-то вроде вашего вопроса-этоВЫБЕРИТЕ код страны, ПОСЧИТАЙТЕ(*) КАК «всего» ИЗ ГРУППЫ world.city ПО коду страны;
Для провинций Канады (у меня есть таблица):
SELECT province, COUNT(*) AS "total" FROM world.canada GROUP BY province;
--------------------------- -------
| province | total |
--------------------------- -------
| Alberta | 573 |
| British Columbia | 716 |
| Manitoba | 299 |
| New Brunswick | 210 |
| Newfoundland and Labrador | 474 |
| Northwest Territories | 94 |
| Nova Scotia | 331 |
| Nunavut | 107 |
| Ontario | 891 |
| Prince Edward Island | 57 |
| Quebec | 1045 |
| Saskatchewan | 573 |
| Yukon | 114 |
--------------------------- -------
Обратите внимание, что несколько городов появляются в нескольких провинциях:
SELECT COUNT(DISTINCT city), COUNT(*) FROM world.canada;
---------------------- ----------
| COUNT(DISTINCT city) | COUNT(*) |
---------------------- ----------
| 5248 | 5484 |
---------------------- ----------
- Жуйте это; вам предстоит усвоить еще несколько уроков:
SELECT city, COUNT(*) AS ct, GROUP_CONCAT(DISTINCT state) FROM world.us GROUP BY city ORDER BY COUNT(*) DESC LIMIT 11; ------------- ---- ---------------------------------- | city | ct | GROUP_CONCAT(DISTINCT state) | ------------- ---- ---------------------------------- | Springfield | 11 | FL,IL,MA,MO,NJ,OH,OR,PA,TN,VA,VT | | Clinton | 10 | CT,IA,MA,MD,MO,MS,OK,SC,TN,UT | | Madison | 8 | AL,CT,IN,ME,MS,NJ,SD,WI | | Lebanon | 8 | IN,ME,MO,NH,OH,OR,PA,TN | | Auburn | 7 | AL,CA,IN,ME,NH,NY,WA | | Burlington | 7 | IA,MA,NC,NJ,VT,WA,WI | | Washington | 7 | DC,IL,IN,MO,NC,PA,UT | | Farmington | 7 | ME,MI,MN,MO,NH,NM,UT | | Canton | 6 | GA,IL,MA,MI,MS,OH | | Monroe | 6 | GA,LA,MI,NC,WA,WI | | Lancaster | 6 | CA,NY,OH,PA,SC,TX | ------------- ---- ----------------------------------
- Что касается количества городов в стране, то это относится к таблице
Countries
, а не к таблицеCities
. Затем используйте aJOIN
, когда вы хотите собрать их вместе.
Комментарии:
1. PS-По моим данным, в 39 странах насчитывается 57 городов с названием «Мала». И 317 Сан-Антонио в 28 странах.