Увод
Предуслови
Први корак - Инсталирајте МиСКЛ сервер
Други корак - Инсталирајте узорак базе података
Трећи корак – Креирање, коришћење и уклањање приказа
Увод
МиСКЛ има одличну функцију познату као "прегледи". Прегледи су сачувани упити. Замислите их као псеудоним за иначе дуг упит. У овом водичу ћу вам показати како да користите приказе за ефикасније организовање података.
Предуслови
- Вултр ССД сервер у облаку са Дебианом 7.
- Корисник са администраторским (роот) привилегијама.
- Основно познавање Линук-а, командне линије и ССХ-а.
Први корак - Инсталирајте МиСКЛ сервер
Инсталирање МиСКЛ-а на Дебиан 7.к је врло једноставно. Прво, морамо осигурати да се наши извори ажурирају извршавањем:
sudo apt-get update
Затим можемо да инсталирамо МиСКЛ сервер:
sudo apt-get install -y mysql-server
Приказаће се оквир за дијалог у којем ће се тражити да креирате лозинку за "роот" корисника. Будите сигурни да запамтите ову лозинку.
Хајде да појачамо сигурност наше инсталације тако што ћемо извршити:
sudo mysql_secure_installation
Након извршења, биће вам представљен низ упита. Сваки од одговора које треба да изаберете приказан је испод.
...
Enter current password for root (enter for none):
OK, successfully used password, moving on...
...
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
...
Remove anonymous users? [Y/n] y
... Success!
...
Disallow root login remotely? [Y/n] y
... Success!
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
...
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
Други корак - Инсталирајте узорак базе података
У овом тренутку немамо података на серверу са којима бисмо могли да експериментишемо. За овај водич користићемо базу података запослених јер је са њом лако радити и која је слободно доступна на МиСКЛ веб локацији.
sudo wget https://launchpad.net/test-db/employees-db-1/1.0.6/+download/employees_db-full-1.0.6.tar.bz2
Морамо да инсталирамо bzip2да бисмо могли да издвојимо датотеку.
sudo apt-get install bzip2
Извуците базу података. Датотека је прилично велика, тако да може потрајати неколико тренутака.
sudo bzip2 -dfv employees_db-full-1.0.6.tar.bz2
sudo tar -xf employees_db-full-1.0.6.tar
Када се датотека екстрахује, имаћете фасциклу под називом employees_db. Морамо да одемо у овај директоријум да бисмо инсталирали базу података.
cd employees_db
ls -l
Излаз ће изгледати овако:
-rw-r--r--. 1 501 games 752 Mar 30 2009 Changelog
-rw-r--r--. 1 501 games 6460 Oct 9 2008 employees_partitioned2.sql
-rw-r--r--. 1 501 games 7624 Feb 6 2009 employees_partitioned3.sql
-rw-r--r--. 1 501 games 5660 Feb 6 2009 employees_partitioned.sql
-rw-r--r--. 1 501 games 3861 Nov 28 2008 employees.sql
-rw-r--r--. 1 501 games 241 Jul 30 2008 load_departments.dump
-rw-r--r--. 1 501 games 13828291 Mar 30 2009 load_dept_emp.dump
-rw-r--r--. 1 501 games 1043 Jul 30 2008 load_dept_manager.dump
-rw-r--r--. 1 501 games 17422825 Jul 30 2008 load_employees.dump
-rw-r--r--. 1 501 games 115848997 Jul 30 2008 load_salaries.dump
-rw-r--r--. 1 501 games 21265449 Jul 30 2008 load_titles.dump
-rw-r--r--. 1 501 games 3889 Mar 30 2009 objects.sql
-rw-r--r--. 1 501 games 2211 Jul 30 2008 README
-rw-r--r--. 1 501 games 4455 Mar 30 2009 test_employees_md5.sql
-rw-r--r--. 1 501 games 4450 Mar 30 2009 test_employees_sha.sql
Извршите следећу команду да бисте се повезали са МиСКЛ сервером, креирали базу података и увезли податке:
sudo mysql -h localhost -u root -p -t < employees.sql
Појавит ће се упит који тражи вашу роот лозинку. Ово је лозинка коју сте поставили у првом кораку.
С обзиром на то да је база података прилично велика, вероватно ће бити потребно од 1-3 минута да се у потпуности увезу подаци. Ако је све урађено исправно, видећете следећи излаз.
+-----------------------------+
| INFO |
+-----------------------------+
| CREATING DATABASE STRUCTURE |
+-----------------------------+
+------------------------+
| INFO |
+------------------------+
| storage engine: InnoDB |
+------------------------+
+---------------------+
| INFO |
+---------------------+
| LOADING departments |
+---------------------+
+-------------------+
| INFO |
+-------------------+
| LOADING employees |
+-------------------+
+------------------+
| INFO |
+------------------+
| LOADING dept_emp |
+------------------+
+----------------------+
| INFO |
+----------------------+
| LOADING dept_manager |
+----------------------+
+----------------+
| INFO |
+----------------+
| LOADING titles |
+----------------+
+------------------+
| INFO |
+------------------+
| LOADING salaries |
+------------------+
Сада се можемо пријавити на МиСКЛ и прегледати увезене податке.
sudo mysql -h localhost -u root -p
Унесите роот лозинку коју сте поставили у претходном одељку.
Проверите листу база података за нашу новокреирану базу података запослених .
show databases;
Излаз ће изгледати овако:
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.01 sec)
Хајде да користимо базу података запослених .
use employees;
Проверите табеле у њему.
show tables;
Ово ће произвести:
+---------------------+
| Tables_in_employees |
+---------------------+
| departments |
| dept_emp |
| dept_manager |
| employees |
| salaries |
| titles |
+---------------------+
6 rows in set (0.01 sec)
Трећи корак – Креирање, коришћење и уклањање приказа
In this step, you will learn to create and use views. I have broken up this step into smaller sections for matching data, and combining data for organization. It's time to start interacting with our test data.
Merging/matching data
Below, I have a query which displays all employees who have a yearly salary equal to, or greater than $50,000.
select * from salaries where salary >= 50000;
Output (truncated):
+--------+--------+------------+------------+
| emp_no | salary | from_date | to_date |
+--------+--------+------------+------------+
| 10001 | 60117 | 1986-06-26 | 1987-06-26 |
| 10001 | 62102 | 1987-06-26 | 1988-06-25 |
| 10001 | 66074 | 1988-06-25 | 1989-06-25 |
| 10001 | 66596 | 1989-06-25 | 1990-06-25 |
| 10001 | 66961 | 1990-06-25 | 1991-06-25 |
(...)
As you can see, this only displays employee numbers. It could be a nuisance when trying to identify an employee quickly. Luckily, we can create a view that will store a fairly lengthy query that can match employee numbers to employee names by pulling and matching data from multiple tables. The query is shown below.
select employees.first_name,employees.last_name,employees.emp_no,salaries.salary,salaries.to_date,salaries.from_date from employees, salaries where employees.emp_no = salaries.emp_no;
Notice how I have omitted >= 50000 from the query. We will be using this value after our view has been created.
Да бисмо креирали приказ, једноставно га додамо create view view_name asупиту. У овом случају, креираћу приказ под називом намед_салариес .
create view named_salaries as select employees.first_name,employees.last_name,employees.emp_no,salaries.salary,salaries.to_date,salaries.from_date from employees, salaries where employees.emp_no = salaries.emp_no;
Приказујемо податке из погледа на исти начин на који приказујемо податке из табеле.
select * from named_salaries
Ако је приказ правилно креиран, видећете следећи излаз (подаци су скраћени):
+------------+-----------+--------+--------+------------+------------+
| first_name | last_name | emp_no | salary | to_date | from_date |
+------------+-----------+--------+--------+------------+------------+
| Georgi | Facello | 10001 | 60117 | 1987-06-26 | 1986-06-26 |
| Georgi | Facello | 10001 | 62102 | 1988-06-25 | 1987-06-26 |
| Georgi | Facello | 10001 | 66074 | 1989-06-25 | 1988-06-25 |
| Georgi | Facello | 10001 | 66596 | 1990-06-25 | 1989-06-25 |
| Georgi | Facello | 10001 | 66961 | 1991-06-25 | 1990-06-25 |
| Georgi | Facello | 10001 | 71046 | 8 1992-06-24 | 1991-06-25 |
(...)
Пошто можемо да комуницирамо са погледима на исти начин на који можемо да комуницирамо са табелом, могуће је узети >= 50000из оригиналног упита и применити га на приказ.
select * from named_salaries where salary >= 50000;
Излаз (скраћено):
+------------+-----------+--------+--------+------------+------------+
| first_name | last_name | emp_no | salary | to_date | from_date |
+------------+-----------+--------+--------+------------+------------+
| Georgi | Facello | 10001 | 60117 | 1987-06-26 | 1986-06-26 |
(...)
| Bezalel | Simmel | 10002 | 65828 | 1997-08-03 | 1996-08-03 |
(...)
| Chirstian | Koblick | 10004 | 50594 | 1992-11-29 | 1991-11-30 |
(...)
| Kyoichi | Maliniak | 10005 | 78228 | 1990-09-12 | 1989-09-12 |
(...)
| Anneke | Preusig | 10006 | 53747 | 1998-08-03 | 1997-08-03 |
(...)
+------------+-----------+--------+--------+------------+------------+
Као што видите, упит је третирао поглед баш као традиционалну табелу.
Хајде да користимо поглед у другом примеру. У наставку имам прилично дугачак упит који наводи руководиоце одељења, њихова имена/презимена, бројеве запослених, називе њихових одељења и бројеве одељења. Упит прикупља податке из неколико различитих табела.
select employees.first_name,employees.last_name,employees.emp_no,dept_manager.to_date,dept_manager.from_date,departments.dept_name,departments.dept_no from employees, dept_manager, departments where employees.emp_no = dept_manager.emp_no AND departments.dept_no = dept_manager.dept_no;
Излаз (скраћено):
+-------------+--------------+--------+------------+------------+--------------------+---------+
| first_name | last_name | emp_no | to_date | from_date | dept_name | dept_no |
+-------------+--------------+--------+------------+------------+--------------------+---------+
| Tonny | Butterworth | 111692 | 1988-10-17 | 1985-01-01 | Customer Service | d009 |
| Marjo | Giarratana | 111784 | 1992-09-08 | 1988-10-17 | Customer Service | d009 |
| Xiaobin | Spinelli | 111877 | 1996-01-03 | 1992-09-08 | Customer Service | d009 |
| Yuchang | Weedman | 111939 | 9999-01-01 | 1996-01-03 | Customer Service | d009 |
| DeForest | Hagimont | 110511 | 1992-04-25 | 1985-01-01 | Development | d005 |
| Leon | DasSarma | 110567 | 9999-01-01 | 1992-04-25 | Development | d005 |
(...)
Као што видите, било би помало незгодно уписивати тај упит сваки пут када треба да преузмете листу менаџера одељења. Хајде да направимо поглед да бисмо вам олакшали. Поглед ћу назвати "менаџмент".
create view management as select employees.first_name,employees.last_name,employees.emp_no,dept_manager.to_date,dept_manager.from_date,departments.dept_name,departments.dept_no from employees, dept_manager, departments where employees.emp_no = dept_manager.emp_no AND departments.dept_no = dept_manager.dept_no;
Сада можемо једноставно select * from management;да укуцамо да бисмо преузели исте податке. Наравно, на то можемо применити и додатне параметре - баш као и традиционалну табелу. На пример, рецимо да желимо да прикажемо само менаџере одељења за „Услугу за кориснике“.
select * from management where dept_name = 'Customer Service';
Излаз:
+------------+-------------+--------+------------+------------+------------------+---------+
| first_name | last_name | emp_no | to_date | from_date | dept_name | dept_no |
+------------+-------------+--------+------------+------------+------------------+---------+
| Tonny | Butterworth | 111692 | 1988-10-17 | 1985-01-01 | Customer Service | d009 |
| Marjo | Giarratana | 111784 | 1992-09-08 | 1988-10-17 | Customer Service | d009 |
| Xiaobin | Spinelli | 111877 | 1996-01-03 | 1992-09-08 | Customer Service | d009 |
| Yuchang | Weedman | 111939 | 9999-01-01 | 1996-01-03 | Customer Service | d009 |
+------------+-------------+--------+------------+------------+------------------+---------+
Или можда желимо „Услугу за кориснике“ и „Људске ресурсе“:
select * from management where dept_name = 'Customer Service' OR dept_name = 'Human Resources';
Излаз:
+------------+--------------+--------+------------+------------+------------------+---------+
| first_name | last_name | emp_no | to_date | from_date | dept_name | dept_no |
+------------+--------------+--------+------------+------------+------------------+---------+
| Tonny | Butterworth | 111692 | 1988-10-17 | 1985-01-01 | Customer Service | d009 |
| Marjo | Giarratana | 111784 | 1992-09-08 | 1988-10-17 | Customer Service | d009 |
| Xiaobin | Spinelli | 111877 | 1996-01-03 | 1992-09-08 | Customer Service | d009 |
| Yuchang | Weedman | 111939 | 9999-01-01 | 1996-01-03 | Customer Service | d009 |
| Shirish | Ossenbruggen | 110183 | 1992-03-21 | 1985-01-01 | Human Resources | d003 |
| Karsten | Sigstam | 110228 | 9999-01-01 | 1992-03-21 | Human Resources | d003 |
+------------+--------------+--------+------------+------------+------------------+---------+
Уклањање приказа
Брисање приказа је врло једноставно. Слично уклањању табеле, откуцали бисте drop view view_name;. На пример, ако желимо да избришемо приказ намед_салариес , команда би била: drop view named_salaries;.