SQL для Вікіпроектів: відмінності між версіями
Вилучено вміст Додано вміст
Ilya (обговорення | внесок) Немає опису редагування |
Ilya (обговорення | внесок) Немає опису редагування |
||
Рядок 14: | Рядок 14: | ||
Він дозволяє писати запити мовою SQL до копій баз даних вікіпроектів. |
Він дозволяє писати запити мовою 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|внутрішнє посилання]]'' |
Версія за 09:07, 17 листопада 2016
SQL — абревіатура Structured Query Language — Структурована мова Запитів.
Є інструмент Quarry (англійською Quarry — Кар'єр, слово також подібне до Query, що англійською означає — Запит (до бази даних))
Він дозволяє писати запити мовою SQL до копій баз даних вікіпроектів.