SQL для Вікіпроектів: відмінності між версіями

Вилучено вміст Додано вміст
Ilya (обговорення | внесок)
Немає опису редагування
Ilya (обговорення | внесок)
Немає опису редагування
Рядок 14:
Він дозволяє писати запити мовою SQL до копій баз даних вікіпроектів.
 
== Зміст ===
== Список сторінок ==
*[[SQL для Вікіпроектів/Список сторінок|SQL для Вікіпроектів/Список сторінок]]
Виведемо всі колонки із таблиці сторінок page ([https://quarry.wmflabs.org/query/14106 Запит у Quarry])
*[[SQL для Вікіпроектів/Кількість сторінок|SQL для Вікіпроектів/Кількість сторінок]]
 
<tt>
SELECT *
FROM
ukwikibooks_p.page
</tt>
 
Запит повертає всі рядки та всі колонки із таблиці сторінок page.
Декілька перших рядків виглядають так:
{| class="wikitable"
!page_id!!page_namespace!!page_title!!page_restrictions!!page_counter!!page_is_redirect!!page_is_new!!page_random!!page_touched!!page_links_updated!!page_latest!!page_len!!page_no_title_convert!!page_content_model
|-
|1||0||Main_Page||||0||1||0||0.425922502496||20130412175651||None||7988||45||0||wikitext
|-
|2||0||Головна_сторінка||||0||0||0||0.429793028827||20161101043156||20161101043221||19411||1441||0||wikitext
|-
|931||10||Wikibrothers||||0||0||0||0.085830608583||20140817194306||None||16493||1304||0||wikitext
|-
|938||3||195.39.196.2||||0||0||0||0.207369529163||20050703143510||None||2057||571||0||wikitext
|-
|942||2||Ashapochka||||0||0||1||0.301798192112||20130407223156||None||2061||128||0||wikitext
|-
|972||3||Cl||||0||0||0||0.208406955811||20080426213654||None||5216||3014||0||wikitext
|-
|991||2||Ilya||||0||0||0||0.059346930577||20161112184738||None||3756||40||0||wikitext
|-
|1467||14||Головна||||0||0||0||0.841395774183||20161103103038||20161103103755||22576||189||0||wikitext
|-
|1495||2||Albedo||||0||0||0||0.659403327642||20161011202019||None||14295||914||0||wikitext
|-
|1549||4||Портал_спільноти||||0||0||0||0.140178074975||20161113235301||20161113235301||25528||393727||0||wikitext
|-
|1557||2||Zigger||||0||0||1||0.460886007336||20130407223200||None||2921||25||0||wikitext
|-
|1558||3||Zigger||||0||0||1||0.15922569047||20051203022443||None||2922||30||0||wikitext
|-
|1578||3||Gangleri||||0||0||0||0.646923746659||20151216234438||20151020233343||24471||12378||0||wikitext
|-
|1579||2||Gangleri||||0||0||0||0.817194667656||20151020232220||None||4599||5249||0||wikitext
|-
|1659||14||Українська_мова||||0||0||0||0.281435888335||20160709072326||20160709072329||22587||586||0||wikitext
|}
 
==== Простори назв ====
Для цього виведемо із таблиці page лише колонки, які нас цікавлять: page_namespace і page_title ([https://quarry.wmflabs.org/query/14110 Запит у Quarry])
 
<tt>
SELECT
page_namespace, page_title
FROM
ukwikibooks_p.page
</tt>
 
===== Сортування =====
Несподівано ми отримали зовсім інші перші рядки:
{| class="wikitable"
!page_namespace!!page_title
|-
|0||AutoIt
|-
|0||Be_able_to
|-
|0||Bison
|-
|0||Blender
|-
|0||Blender._Стартовий_посібник
|-
|0||Blender/Вступ
|-
|0||Blender/Стартовий_посібник
|-
|0||Blender/Стартовий_посібник_(український_інтерфейс)
|-
|0||C++
|-
|0||C++/Віртуальний_конструктор_С++
|-
|0||C++/Ключові_слова
|-
|0||C++/Ключові_слова/const_cast
|-
|0||C++/Ключові_слова/dynamic_cast
|-
|0||C++/Ключові_слова/reinterpret_cast
|-
|0||C++/Ключові_слова/static_cast
|-
|0||CSS
|}
 
Чому так? Якщо не вказати явно порядок сортування, база даних чи інструмент для виконання запитів використовує певний порядок сортування за умовчанням.
 
В нашому випадку сортування відбулося за тими колонками, які мі запитували — page_namespace і page_title.
 
Ми можемо вказати це явно, додавши до запиту <code lang="sql">ORDER BY page_namespace, page_title</code>, і отримати такий самий результат ([https://quarry.wmflabs.org/query/14111 Запит у Quarry])
 
<tt>
SELECT
page_namespace, page_title
FROM
ukwikibooks_p.page
ORDER BY
page_namespace, page_title
</tt>
 
Тепер отримаємо такий же порядок сортування, як був у нас спочатку, коли ми отримували всі колонки. Для цього додамо сортування за колонкою page_id: <code>ORDER BY page_id</code>
([https://quarry.wmflabs.org/query/14110 Запит у Quarry])
 
<tt>
SELECT
page_id, page_namespace, page_title
FROM
ukwikibooks_p.page
ORDER BY
page_id
</tt>
 
Тепер результат відсортовано за page_id і перші рядки виглядають так:
{| class="wikitable"
!page_id!!page_namespace!!page_title
|-
|1||0||Main_Page
|-
|2||0||Головна_сторінка
|-
|931||10||Wikibrothers
|-
|938||3||195.39.196.2
|-
|942||2||Ashapochka
|-
|972||3||Cl
|-
|991||2||Ilya
|-
|1467||14||Головна
|-
|1495||2||Albedo
|-
|1549||4||Портал_спільноти
|-
|1557||2||Zigger
|-
|1558||3||Zigger
|-
|1578||3||Gangleri
|-
|1579||2||Gangleri
|-
|1659||14||Українська_мова
|}
 
===== Які є простори назв? =====
 
Отже, що означають цифри 0, 2, 3, 4, 10, 14 у колонці page_namespace?
Це коди, які відповідають різним просторам імен.
У довідці з просторів імен є [[:mw:Manual:Namespace#Built-in_namespaces|табличка із номерами стандартних просторів імен]]:
 
{| class="wikitable"
|-
!
Індекс
!
Назва
! colspan="2" | Обговорення
|-
! 0
| (Основний)
| {{ns:1}}
! 1
|-
! 2
| {{ns:2}}
| {{ns:3}}
! 3
|-
! 4
| {{ns:4}}
| {{ns:5}}
! 5
|-
! 6
| {{ns:6}}
| {{ns:7}}
! 7
|-
! 8
| {{ns:8}}
| {{ns:9}}
! 9
|-
! 10
| {{ns:10}}
| {{ns:11}}
! 11
|-
! 12
| {{ns:12}}
| {{ns:13}}
! 13
|-
! 14
| {{ns:14}}
| {{ns:15}}
! 15
|-
! colspan="5" |
|-
! -1
| {{ns:-1}}
| colspan="2" rowspan="2" style="background:#ddd; text-align:center; vertical-align:middle;" | N/A
|-
! {{ns:-2}}
| Media
|}
 
У Вікірозмітці можна вивести префікс простору назв із [[:mw:Help:Magic_words/uk#Простори імен 2|допомогою магічного слова]] <tt><nowiki>{{ns}}</nowiki></tt>:
 
{| class="wikitable"
|-
! colspan="2" width="50%" | Простори імен для статей
! rowspan="11" |
! colspan="2" width=%50%" | Простори імен для сторінок обговорення
|-
! Використання
! Результат
! Використання
! Результат
|-
| <code><nowiki>{{ns:-2}}</nowiki></code> / <code><nowiki>{{ns:Media}}</nowiki></code>
| {{ns:-2}}
| <code><nowiki>{{ns:-1}}</nowiki></code> / <code><nowiki>{{ns:Special}}</nowiki></code>
| {{ns:-1}}<br/>''(no '''talk''' page)''
|-
| <code><nowiki>{{ns:0}}</nowiki></code> / <code><nowiki>{{ns:}}</nowiki></code>
| {{ns:0}}
| <code><nowiki>{{ns:1}}</nowiki></code> / <code><nowiki>{{ns:Talk}}</nowiki></code>
| {{ns:1}}
|-
| <code><nowiki>{{ns:2}}</nowiki></code> / <code><nowiki>{{ns:User}}</nowiki></code>
| {{ns:2}}
| <code><nowiki>{{ns:3}}</nowiki></code> / <code><nowiki>{{ns:User talk}}</nowiki></code>
| {{ns:3}}
|-
| <code><nowiki>{{ns:4}}</nowiki></code> / <code><nowiki>{{ns:Project}}</nowiki></code>
| {{ns:4}} <br/>''Varies between wikis''
| <code><nowiki>{{ns:5}}</nowiki></code> / <code><nowiki>{{ns:Project talk}}</nowiki></code>
| {{ns:5}}
|-
| <code><nowiki>{{ns:6}}</nowiki></code> / <code><nowiki>{{ns:File}}</nowiki></code> or <code><nowiki>{{ns:Image}}</nowiki></code>
| {{ns:6}}
| <code><nowiki>{{ns:7}}</nowiki></code> / <code><nowiki>{{ns:File talk}}</nowiki></code> or <code><nowiki>{{ns:Image talk}}</nowiki></code>
| {{ns:7}}
|-
| <code><nowiki>{{ns:8}}</nowiki></code> / <code><nowiki>{{ns:MediaWiki}}</nowiki></code>
| {{ns:8}}
| <code><nowiki>{{ns:9}}</nowiki></code> / <code><nowiki>{{ns:MediaWiki talk}}</nowiki></code>
| {{ns:9}}
|-
| <code><nowiki>{{ns:10}}</nowiki></code> / <code><nowiki>{{ns:Template}}</nowiki></code>
| {{ns:10}}
| <code><nowiki>{{ns:11}}</nowiki></code> / <code><nowiki>{{ns:Template talk}}</nowiki></code>
| {{ns:11}}
|-
| <code><nowiki>{{ns:12}}</nowiki></code> / <code><nowiki>{{ns:Help}}</nowiki></code>
| {{ns:12}}
| <code><nowiki>{{ns:13}}</nowiki></code> / <code><nowiki>{{ns:Help talk}}</nowiki></code>
| {{ns:13}}
|-
| <code><nowiki>{{ns:14}}</nowiki></code> / <code><nowiki>{{ns:Category}}</nowiki></code>
| {{ns:14}}
| <code><nowiki>{{ns:15}}</nowiki></code> / <code><nowiki>{{ns:Category talk}}</nowiki></code>
| {{ns:15}}
|}
 
===== Список сторінок із посиланням, що включає префікс простору назв=====
SQL Функція CONCAT об’єднує в один рядок значення своїх параметрів
 
Наприклад <tt><pre> CONCAT('[[', page_title, ']]') </pre></tt> поверне рядок який складається із двох квадратних дужок, які відкриваються, значення колонки <tt>page_title</tt> та дві квадратні дужки, які закриваються, що разом дасть вікірозмітку для посилання на сторінку з назвою <tt>page_title</tt>
 
Додамо умову, що вибираємо лише сторінки із основного простору (простору статей)
<tt><pre> WHERE page_namespace = 0 </pre></tt> і виведемо вікірозмітку посилання на статті ([https://quarry.wmflabs.org/query/14113 код у Quarry])
<tt><pre>
SELECT
CONCAT('[[', page_title, ']]') AS page_link
FROM
ukwikibooks_p.page
WHERE
page_namespace = 0
</pre></tt>
 
Тепер ми можемо вивести список сторінок, що містить повне посилання на сторінку, яке включає і префікс простору назв ([https://quarry.wmflabs.org/query/14112 код у Quarry])
 
<tt><pre>
SELECT
page_id,
page_namespace,
page_title,
CONCAT(
'[[:{{ns:', page_namespace, '}}:', page_title, ']]'
) AS page_link
FROM
ukwikibooks_p.page
ORDER BY
page_id
</pre></tt>
 
Результат:
{| class="wikitable"
!page_id!!page_namespace!!page_title!!page_link
|-
|1||0||Main_Page||[[:{{ns:0}}:Main_Page]]
|-
|2||0||Головна_сторінка||[[:{{ns:0}}:Головна_сторінка]]
|-
|931||10||Wikibrothers||[[:{{ns:10}}:Wikibrothers]]
|-
|938||3||195.39.196.2||[[:{{ns:3}}:195.39.196.2]]
|-
|942||2||Ashapochka||[[:{{ns:2}}:Ashapochka]]
|-
|972||3||Cl||[[:{{ns:3}}:Cl]]
|-
|991||2||Ilya||[[:{{ns:2}}:Ilya]]
|-
|1467||14||Головна||[[:{{ns:14}}:Головна]]
|-
|1495||2||Albedo||[[:{{ns:2}}:Albedo]]
|-
|1549||4||Портал_спільноти||[[:{{ns:4}}:Портал_спільноти]]
|-
|1557||2||Zigger||[[:{{ns:2}}:Zigger]]
|-
|1558||3||Zigger||[[:{{ns:3}}:Zigger]]
|-
|1578||3||Gangleri||[[:{{ns:3}}:Gangleri]]
|-
|1579||2||Gangleri||[[:{{ns:2}}:Gangleri]]
|-
|1659||14||Українська_мова||[[:{{ns:14}}:Українська_мова]]
|}
 
 
=== Кількість сторінок ===
[https://quarry.wmflabs.org/query/14107 Запит у Quarry]
<tt>
SELECT
count(*)
FROM
ukwikibooks_p.page
</tt>
 
У Вікіпідручнику запит видає цифру 2773, тоді як статистика самого сайту 3596. Кількість сторінок — доволі технічна, а не змістовна статистика і схоже рахується дещо по різному. Оскільки сторінок взагалі у Вікіпдіручнику небагато, то відмінність вийшла досить значна
 
 
Виведемо кількість сторінок у Вікіпедії: ([https://quarry.wmflabs.org/query/14108 Запит у Quarry])
<tt>
SELECT
count(*)
FROM
ukwiki_p.page
</tt>
 
За нашим запитом — 1 986 487, за статистикою сайту — 1 986 749.
Тут уже відмінність всього на <code>1 986 749 - 1 986 487 = 262</code> сторінки, або лише 0.01%. Тобто за великої кількості сторінок різниця між різними способами практично непомітна.
 
=== Кількість статей ===
 
Тепер виведемо кількість статей.
 
Спочатку зрозуміємо, що таке стаття, і чим вона відрізняється від сторінки.
У [[:mw:Help:Magic_words/uk#Статистика|довідці зі статистичних службових слів]] пише ''"Кількість сторінок [[:mw:Manual:Using_custom_namespaces#Content_namespaces|в основному просторі назв]]."''
 
Проте за посиланням ''[[:mw:Manual:Using_custom_namespaces#Content_namespaces|в основному просторі назв]]'' дається точніше визначення:
#Be in the main namespace, or a defined content namespace ''// Бути в основному [[:mw:Help:Namespaces/uk|просторі назв]], або у визначеному просторі імен для вмісту''
#Not be a redirect page ''// не бути [[:w:Довідка:Перенаправлення|сторінкою перенаправлення]]''
#Contain at least one internal link ''// Містити принаймні одне [[:mw:Help:Links/uk|внутрішнє посилання]]''