четверг, 10 января 2019 г.

SQL SELECT

SQL SELECT

Не многие владеют в совершенстве языками, а если говорит о языках программирования, то большая часть знает о них только то, что изучали в школе. Однако в полной мере об используемых языках, для управления компьютерными программами, можно почерпнуть только при глубоком изучении материала, в высших учебных заведениях и путем самостоятельного обучения.
Огромное количество программ позволяют выбирать данные для финансовых и других отчетов в считанные минуты. Одна из самых простых и к тому же удобных — SQL SELECT. При знакомстве с ней любой программист сможет без проблем рассказать о том, что SQL – это язык программирования, помогающий структурировать все необходимые запросы, а SELECT – это команда, используемая в комбинации с SQL. Безусловно, в сочетании SQL SELECT позволяют проводить все необходимые действия, изложенные на примерах данной страницы. В связи, с чем нижеизложенный материал более подробно и наглядно характеризует возможности SQL SELECT. Поэтому, установив программу, используемую SQL SELECT, вы сэкономите время своих сотрудников, а также деньги предприятия.
С помощью запроса SQL SELECT можно выполнять выборку данных из таблицы. Следующие примеры запросов SQL SELECT используются в таких SQL СУБД как MySQLOracleAccess и других.
SQL Select
SQL Select

Для выполнения следующих SQL запросов SELECT нам необходимо прежде всего изучить структуру таблиц.
Имя таблицыИмя поляТип поляПримечание
FAKULTETKOD_Fцелое числоОСНОВНОЙ КЛЮЧ
NAZV_FЧар, 30
SPECKOD_Sцелое числоОСНОВНОЙ КЛЮЧ
KOD_Fцелое число
NAZV_SChar, 50
УЧЕНИКKOD_STUDцелое числоОСНОВНОЙ КЛЮЧ
KOD_Sцелое число
FAMЧар, 30
ВЧар, 15
OTЧар, 15
DOTSДесятичный, 3
МЯЧДесятичный, 3

Примеры запросов SELECT на языке SQL:
SQL Пример SELECT №1
Выбрать студентов, получающих стипендию, равную 150.
ВЫБЕРИТЕ имя  от студента, где STIP = 150;
С помощью данного SQL запроса SELECT выбираются все значения из таблицы STUDENT, поле STIP которых строго равно 150.

SQL Пример SELECT №2
Выбрать студентов, имеющих балл от 82 до 90. Студенты должны быть отсортированы в порядке убывания балла.
ВЫБЕРИТЕ  FAM ИЗ СТУДЕНТА, ГДЕ ШАР МЕЖДУ 81 И 91 ПОРЯДОК БАЛ ДЕСК ;         
Как видно из SQL примера, чтобы выбрать студентов, которые имеют балл от 82 до 90, мы используем условие BETWEEN. Чтобы отсортировать в убывающем порядке DESC.

SQL Пример SELECT №3
Выбрать студентов, фамилии которых начинаются с буквы «А».
ВЫБЕРИТЕ  FAM ИЗ СТУДЕНТА, ГДЕ FAM LIKE 'А%';      
Для того, чтобы выбрать фамилии, начинающиеся с буквы «А», мы используем оператор SQL LIKE для поиска значений по образцу.

SQL SELECT Пример №4
Подсчитать средний балл на каждом факультете.
ВЫБЕРИТЕ  NAZV_F в качестве имени , КРУГЛЫЙ ( AVG (BALL), 2) как SredBall ОТ FAKULTET, SPEC, STUDENT, ГДЕ STUDENT.KOD_S = SPEC.KOD_S AND SPEC.KOD_F = FAKULTET.KOD_F GROUP BY NAZV_F;          
Пример запроса SQL SELECT показывает нам использование функции SQL AVG для вычисления среднего значения, ROUND для округления значения, раздела GROUP BY для группировки столбцов.

SQL SELECT. Пример №5.
Подсчитать количество студентов, обучающихся на каждом факультете. Вывести в запросе название факультета, комментарий – «обучается», количество студентов, комментарий «человек».
ВЫБЕРИТЕ  NAZV_F || ' обучается '|| COUNT (STUDENT.BALL) || ' ' Как CountStudOnFakultet ИЗ ФАКУЛЬТЕТА, SPEC, СТУДЕНТ, ГДЕ STUDENT.KOD_S = SPEC.KOD_S AND SPEC.KOD_F = FAKULTET.KOD_F GROUP BY NAZV_F;       

SQL SELECT. Пример №6.
Упорядочить студентов по факультетам, специальностям, фамилиям.
SELECT NAZV_F, NAZV_S, FAM FROM FAKULTET, SPEC, STUDENT WHERE STUDENT.KOD_S=SPEC.KOD_S AND SPEC.KOD_F=FAKULTET.KOD_F ORDER BYNAZV_F, NAZV_S, FAM;

SQL SELECT. Пример №7.
Определить, кто учится на специальности, к которой относится студент «Асанов».
ВЫБЕРИТЕ  FAM ИЗ СТУДЕНТА, ГДЕ STUDENT.KOD_S = ( ВЫБЕРИТЕ  KOD_S ИЗ СТУДЕНТА, ГДЕ FAM = 'Асанов');
В данном SQL примере мы используем подзапрос SQL SELECT, который возвращает код специальности, на которой учится студент по фамилии Асанов.

SQL SELECT. Пример №8.
Показать, какие специальности встречаются в таблице STUDENT. Дубликаты исключить. Вывести в запросе названия специальностей.
ВЫБЕРИТЕ  DISTINCT NAZV_S ОТ SPEC, СТУДЕНТ, ГДЕ STUDENT.KOD_S = SPEC.KOD_S;
Здесь мы с помощью SQL ограничения DISTINCT выводим только различные значения.

SQL SELECT. Пример №9.
Извлечь из базы данных все данные по сотрудникам, принятым на работу после 01.01.1980 г. в формате “Сотрудник < фамилия сотрудника и его инициалы> принят на работу < дата принятия на работу>”.
ВЫБЕРИТЕ  CONCAT (CONCAT (CONCAT ('Сотрудник', sname), CONCAT (SUBSTR (имя, 0, 1), SUBSTR (otch, 0, 1))), CONCAT ('принято на работу', acceptdate)) ОТ сотрудников ГДЕ acceptdate> to_date ('01 .01.80 ′, 'dd.mm.yyyy');
В данном SQL SELECT, используя SQL функцию CONCAT мы выводим все поля таблицы в одну строчку. SQL функция to_date возвращает привычное для СУБД значение даты.

SQL SELECT. Пример №10.
Извлечь из базы данных перечень должностей, которые имеют сотрудники следующих отделов: ‘БИОТЕХНОЛОГИЙ’, ‘ИНЖЕНЕРНОЙ ЭКОЛОГИИ’. В запросе использовать названия отделов.
ВЫБЕРИТЕ  pname ИЗ постов, отделов, сотрудников, ГДЕ posts.pid = employee.pid AND employee.did = департаменты.did AND (департаменты.dname = 'БИОТЕХНОЛОГИЙ' ИСТОРОДА.
Пояснение: posts — таблица должностей, departments — таблица отделов, employees — таблица сотрудников, pname — название должности.

SQL SELECT. Пример №11.
Извлечь из базы данных значение максимального личного шифра и фамилию сотрудника с этим номером в формате “Максимальный личный шифр < значение шифра> имеет сотрудник < фамилия сотрудника и его инициалы>”.
SELECT ‘Максимальный личный шифр ‘||eid||’ имеет сотрудник ‘||sname||’ ‘||SUBSTR(fname, 0, 1)||’. ‘||SUBSTR(otch, 0, 1)||’.’ As Максимальный_личный_шифр FROM employees WHERE eid = (SELECT MAX(eid) from employees);
Для вывода максимального личного шифра мы устанавливаем условие в WHERE так, чтобы шифр был равен полученному максимальному шифру из подзапроса SELECT, используя функцию MAX.

SQL SELECT. Пример №12.
Получить из базы данных значение числа записей в таблице данных о сотрудниках в формате “Таблица данных о сотрудниках содержит < число записей> записей”.
SELECT ‘Таблица данных о сотрудниках содержит ‘||COUNT(*)||’ записей’ FROM employees;
Используя SQL функцию COUNT, выводим количество записей таблицы employees.

SQL SELECT. Пример №13.
Получить единым запросом список отделов и должностей предприятия.
ВЫБЕРИТЕ  pname ОТ постов СОЮЗ ВЫБЕРИТЕ dname ОТ ОТДЕЛЕЙ;  
С помощью UNION мы объединяем два запроса SQL SELECT и выводим их как один.

SQL SELECT. Пример №14.
Вывести 30 комментариев начиная с 5 комментария из таблицы replies, кроме комментариев автора ‘Вася’. Данные сортируются по дате добавления комментария в убывающем порядке.
ВЫБРАТЬ  * ОТ ОТВЕТОВ ГДЕ автор! = 'Вася' ЗАКАЗАТЬ по дате DESC LIMIT 5, 30;

SQL SELECT. Пример №15.
Получить из SQL таблицы news одну новость с пометкой «Важные новости».
SELECT * FROM news WHERE status=’Важные новости’ LIMIT 1;
В данном SQL примере мы выбираем все столбцы поля, у которого столбец status равен ‘Важные новости’. SQL ограничение LIMIT 1 означает, что выбираем только одну запись.

SQL SELECT. Пример №16.
Получить имя письма с идентификатором 1565.
ВЫБЕРИТЕ  имя ОТ mail_inbox ГДЕ id = '1565 ′;

SQL SELECT. Пример №17.
Получить название рекламного пакета с идентификатором 24.
ВЫБЕРИТЕ заголовок ИЗ ad_packages WHERE id = '24 ';

SQL SELECT. Пример №18.
Вывести столбцы id, title, price, c_type с сортировкой по идентификатору в возрастающем порядке.
SELECT id, title, price, c_type FROM ad_packages ORDER BY id ASC;

SQL SELECT. Пример №19.
Вывести все записи из SQL таблицы actions с идентификатором 1234567890.
SELECT * действия, ГДЕ uid = '1234567890 ′;

SQL SELECT. Пример №20.
SELECT * FROM buypts ЗАКАЗАТЬ по c_type DESC, цена DESC;

SQL SELECT. Пример №21.
ВЫБЕРИТЕ uid ОТ refs WHERE rid = '19 ';

SQL SELECT. Пример №22.
ВЫБЕРИТЕ * ОТ Sellpts ЗАКАЗАТЬ ПО ЦЕНЕ ASC;

SQL SELECT. Пример №23.
SELECT * FROM useronline WHERE uid = '1 ′;

SQL SELECT. Пример №24.
SELECT * FROM mail_inbox WHERE uid = '4590 ′ И status =' unread ';  

SQL SELECT. Пример №25.
ВЫБЕРИТЕ * ОТ Buyref ГДЕ избавиться! = '5' ЗАКАЗАТЬ ПО dateStamp DESC;

MySQL SQL SELECT. Пример №26.
ВЫБЕРИТЕ идентификатор ОТ ОТВЕТОВ ГДЕ nid = '5 ′;

MySQL SQL SELECT. Пример №27.
SELECT id, dateStamp, title, text ИЗ новостей WHERE dateStamp = '1232342412 ′;

Oracle SQL SELECT. Пример №28.
SELECT id, dateStamp, автор, текст, remote_addr ОТ ответов WHERE nid = '45 ' ORDER BY dateStamp ASC;  

sql select
sql select

среда, 9 января 2019 г.

PHP против ASP - В примерах, господа!

PHP против ASP - В примерах, господа!


Привет всем!
Написал несколько проектов на PHP. К сожалению ни один не дожил до сегодняшнего дня. Был проект Melodyland, написанный на ASP, www.melodyland.ru , я частично переписал его на ASP.NET (C#) . Сейчас пишу свой сайт на ASP.NET www.melodyland.ru/goodman (потом переедет, сейчас только можно посмотреть фотки, там идет выборка по базе данных). Все работает на связке Win2000+IIS+MS SQLserver2000. Машинка - 500 целерон, 128 памяти, ну да ладно, все равно не моя. Оба АСП на ней летали при загрузке 30-50 пользователей на сайте (АСП.НЕТ летал после первичной компиляции).
Ощущения. РНР-скрипт запросто можно написать болкнотом, открывая книжку. ASP.NET без Studio и MSDN (а также в особо тяжелых случаях - Инета) бесполезен (видимо, поэтому и компилятор бесплатен... хех). Большая часть работы в Студио заключается в том, что ты все время учишься использовать жутко навороченную классовую модель и при этом лазишь, лазишь и еще раз лазишь по МСДН. Можно сказать, что треть времени разработчик сидит в МСДНне.
Зато потом... счетчик посещений? - пожалуйста, 5 строчек. Добавить сюда такую же таблицу? Пожалуста, два щелчка мышкой, 10 строчек. Другой вывод? Пожалуста! Нестим класс, перекрываем процедуру, отлаживаем 5 минут, готово, привязываем к выводу второй таблицы, смотрим. Абстрактно ощущения от работы с .NET - что-то среднее между Delphi и C++, все время ищещь компоненты, но, при этом головой тоже работать приходится, писать самому. Причем держать схему проекта в голове надо постоянно. Потому что если что забудешь- работа, с того момента, как забыл, становится бессмысленной и приходится возвращаться к "контрольной" точке. Сламое главное в .NET - это стадия плаирования, как общего, так и частного. Без нее все рухнет. Именно поэтому .NET плохо подходит одиноким программистам или маленьким группам (маньяки типа меня, свято верящие в светлое будущее M$, не считаются).
Территория .NET - это гигантские, бытро и постоянно расширяющиеся инет-проекты, где один программист в лучшем случае отвечает за один модуль. Ну скажите где еще вы найдете, чтобы в проекте люди писали на разных языках? Только в проектах, которые могут позволить себе нанять профи, пишущего на языке, отличном от проектного основного. Производительность? Не хватает ресурсов? Купим еще компьютеров, лишь бы темпы не падали. Вот в таких проектов РНР-программистам точно труба дело. Почему: потому что им потребуется куча координаторов, которым денег платить нада. Координаторов, большую часть работы которых берет на себя .NET
И, кстати, большинству unix-систем там тоже делать нечего (не надо плеваться! Stand-alone - это прекрасно, но все знают, что сделать кластер на юнихе намного сложнее, и соответственно, денег уйдет больше. Я НЕ говорю о гигантских суперкомпьютерах, я говорю о парке в 20-50 машин), потому что за то время, пока сисадмины на FreeBSD подключат к кластер-серверу дополнительные машины, програмисты на Win уже давно будут писать следующий модуль. Автоматизация взаимодействия между машинами на WinServ2003 - одна из сильнейших сторон этой системы.
Теперь PHP. Если коротко охарактеризовать ощущения от работы с ним - это постоянный дебаг. И дело даже не в том, что нормальная IDE наконец-то выпустили совсем недавно (zend.com),
дело в том, что сам язык так устроен, что в нем очень легко допускать серьезные логические ошибки. Вот пример, который недавно прислала мне однокурсница, попросив помочь:
<p>
<?php
$bukvi = "abcdefguihuiy";
$stroka = "abcdrrrrrrrrrrrrrrr";
echo $stroka[0]; echo "<br>";
echo $bukvi[0]; echo "<br>";
if ( $srtoka[0] == $bukvi[0] )
echo "совпадают";
else
echo "не совпадают";
?>
</p>
Сценарий работает, но работает неправильно.
Даже примитивная опечатка приводит к логической ошибке, которой в C# никогда бы не было в принципе. Вообще, в РНР обьявление переменных отсуствует как класс, что с моей точки зрения, большой минус.
Итак, в РНР, написав скрипт вы обязательно будете сидеть над ДЕБАГОМ, причем делать его придется руками через вывод чего надо в промежуточных местах алгоритма.
Порой найти ошибку очень сложно, особенно когда она появляется только при определенных обстоятельствах, ее можно вообще не выявить до сдачи проекта. В этом минус РНР, в этом же его плюс.
За то время, пока вы в С# будете реализовывать нужные классы, сидеть над их документацией и реализацией, приводить типы и писать всякие интерфейсы для коллекций, чтобы потом одним махом за 5 минут написать страницу, в РНР вы ту же страницу 10 раз напишете. Только вот незадача: следущая такая же страница на ASP.NET делается так же за 5 минут, а в РНР приходится затрачивать все то же время. Нужно визуально в выводе что-то на странице изменить - в АСП.НЕТ 5 минут, а в РНР - придется искать и править вывод echo. Придет другой программер и, немного поразбиравшись с вашими классами, и даже не заглядывая в их устройство сможет создать такую же страницу за 5 минут, а программист на РНР предпочтет скорее переписать все заново, чем разбираться в вашем коде.
Надеюсь, по принципам программирования все понятно. Теперь о скорости. Здесь и говорить нечего - РНР летает. Я юзал его через IIS5, IIS6, РНР 4.3 (Win). Почему не через Apache? Потому что удобнее, когда дома можешь тестить и ASP и РНР. Потому что виндовый Apache я так и не смог нормально запустить службой - он активно оставлял различные ворнинги о нехватке памяти в журнале (хотя и работал). И вообще, потому что IIS удобнее. Так вот, РНР летает (хотя дотнет после первичной компиляции тоже не особо тормозит). Одни и те же функции РНР выполняет от 10 до х.з сколько % быстрее.
Но вот работа с базами данных, отличных от MySQL не особо порадовала. С MS SQL ASP.NET быстрее, причем намного. Через OLE они работают одинаково. ODBC - РНР тормозит. А что такое MySQL? Возможно, я ошибаюсь, но ни для какого БД-сервера я не видел столько багфиксов и статей про критические уязвимости. Со скоростью мне тоже непонятно, не удалось, да и не было времени протестить связки PHP+MySQL и ASP.NET+SQLServer, однако я так понимаю, что в данном случае все очевидно, т. к. скорость никогда не была сильной стороной Microsoft-a . Впрочем, слабой тоже (кто не согласен - могут потестить различные проги под, например Redhat 8 и WinXp. Я точно уверен насчет кваки и пары-других приложений).
Microsoft SQL - это абсолютно нормальный, выделяющийся достаточно большой стабильностью работы и хорошими возмоностями масштабирования сервер, орриетированный на фирмы и небольшие предприятия. Кому нужен ОЧЕНЬ серьезная СУБД- могут идти к Oracle. А MySQL - это скорее Stand-alone-ориентированная СУБД, как раз то что нужно для не очень больших серверов (что отнюдь не означает, что на них не могут выполняться серьезные приложения...). Все это плюс бесплатность MySQL и РНР, плюс скорость работы этой связки без сомнения делают их ИДЕАЛЬНЫМИ для маленьких и средних проектов, в которых участвуют несколько или небольшая группа (очень желательно, чтобы сработавшихся) программистов. И для одиночек тоже. У средне-больших или больших-гигантских проектов с РНР очень вряд ли что-то получится за деньги, меньшие или равные, что придется выложить за лицензию Microsoft. Тем же, кому нужны гигантские проекты, просто пойдут и закажут их у HP, IBM или Sun.
А у РНР есть еще один козырь - это система, на которой по умолчанию все должно запускаться - *nix подобная. Во-первых, большинство из них бесплатные или стоят меньше Win (хотя админы для них стоят дороже на 20-50% в месяц; поддержка тоже стоит денег, причем неслабых). Во-вторых, хотя я с пеной у рта буду долго спорить, по поводу того, что устойчивее в целом Unix ведет себя предсказуемее. В - третьих, в нашей стране до фига непонятных людей, которые способны ради удовольствия иметь СВОЮ систему, терпеть различные тормоза, сидеть под риском, что твою ветку закроют (это я про Linux), без конца копаться в man'ах и говорить, когда к ним приходишь "а я не могу подключить твой зард, на нем NTFS, приноси комп с сетевухой" (это я тоже про линукс; почему-то я свои FreeBSD'ные партиции в конце концов смог подключить к винде). Дабы не спорить насчет устойчивости могу сказать: в одной компании, где я работал, Win2000, державшая на IIS 250 динамических (ASP) веб-сайтов за три года упала всего раз, и то на пару часов, потребовалась лишь переустановка самого IIS. В другой сервер на FreeBSD стабильно падал пару раз в месяц, причем пару раз насмерть, поэтому я абсолютно уверен, что стабильность системы зависит вовсе не от типа ОС, а от наличия или отсутствия кривых рук у сисадмина.
Таким образом, еще раз повторяю, что ASP.NET (и вообще вся .NET) - система для больших проектов (а каким еще нужно быть ПО УМОЛЧАНИЮ кроссплатформенными?).
Написав программу на C# ее будет очень легко портировать на Pocket PC, с небольшими изменениями перенести прямо в Web; для того, чтобы запустить ее на Linux, вообще уже ничего не нужно кроме Mono (www.mono-project.com).
Напоследок могу посоветоваь: зайдите на job.ru и посмотрите на ситуацию с вакансиями. На одну ASP, ASP.NET вакансию приходится 10-15 РНР - вакансий. Только вот ASP.NET-программеру сходу предлагают зарплату как минимум в 2 раза больше, чем РНР.
Как и должно быть. Гемморой стоит денег.
На прощание предлагаю вам 2 варианта одной и той же программы, написанной на ASP.NET и PHP. Обе они написаны "в лоб" (специально :) и решают одну и ту же задачу: вывод колчиества букв во введенной строке.
ASP.NET:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace photos
{
/// <summary>
/// Summary description for WebForm6.
/// </summary>
public class WebForm6 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.Label Label1;
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.TextBox1.TextChanged += new System.EventHandler(this.TextBox1_TextChanged);
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void TextBox1_TextChanged(object sender, System.EventArgs e)
{
}
private void Button1_Click(object sender, System.EventArgs e)
{
string alphabyte= "ABCDEFGHIJKLMNOPQRSTUVWXYZЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ";
int[] count =new int[alphabyte.Length];//Массив-счетчик
string Text=TextBox1.Text;//Забираем данные
Text=Text.ToUpper();//Введенный текст к верхнему регистру
foreach (char t in Text)//Идем по строке как по массиву
{
for (int i=0; i<alphabyte.Length;i++)//Идем по массиву-счетчику
{
if (t==((char)alphabyte[i])) count[i]++;
}
}
//Вывод
for(int i=0; i<count.Length;i++)
{
if (count[i]!=0)
{
Response.Write("Буква "+alphabyte[i]+" встречается "+
Convert.ToString(count[i])+" раз <BR>");
}
}
}
}
}
Это только файл с программой; к счастью, большая его часть сгенерирована Visual Studio и собственно моя программа находится в обработчике Button1_Click
К нему прилагается еще шаблон HTML-файла, благодаря именно котрому можно почти мгновенно полностью менять дизайн страницы (пишушие на РНР оценят:)
Шаблон (вообще другой файл):
<%@ Page language="c#" Codebehind="WebForm6.aspx.cs"
AutoEventWireup="false" Inherits="photos.WebForm6" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<meta name="vs_snapToGrid" content="False">
<title>WebForm6</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:TextBox id="TextBox1" style="Z-INDEX: 101; LEFT: 328px;
POSITION: absolute; TOP: 40px" runat="server"
Width="288px"></asp:TextBox>
<asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 216px;
POSITION: absolute; TOP: 40px" runat="server"
Width="120px" Height="24px">Введите слово</asp:Label>
<asp:Button id="Button1" style="Z-INDEX: 103; LEFT: 632px;
POSITION: absolute; TOP: 40px" runat="server"
Width="128px" Text="Посчитать!"></asp:Button>
</form>
</body>
</HTML>
Перемещая теги внутри страницы и произвольно помещая их в любое место, можно в любой момент изменить дизайн, не прибегая к помощи программиста вообще.
В случае с РНР это практически невозможно
А теперь тот же код на РНР:
<form action="test_update1.php" method="POST">
Введите слово
<input type="text" name="str">
<input type="submit" name="submit" value="Посчитать">
<?php
$quiz_string=$_POST['str'];
if ($_POST['str'])
{
//$alphabyte='QWERTYUIOPASDFGHJKLZXCVBNMЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ';
$quiz_string= strtoupper($quiz_string);
for ($i=0; $i<strlen(quiz_string);$i++)
{
for ($j=0; $j<strlen($quiz_string);$j++)
{
if ($quiz_string[$j]==$quiz_string[$i]) {$result[$j]+=1;}
}
}
echo '<br>';
for ($j=0; $j<strlen($quiz_string);$j++)
{
if (strlen($result[$j])!=0)
echo "Буква $quiz_string[$j] встречается $result[$j] раз<BR>";
//echo $quiz_string;
}
}
?>
</form>
И Все.
Мой общий вывод, не претендующий на обьективность: скорость разработки при применении ASP.NET вначале должна резко падать, потом расти и в конце концов остановиться на определенном уровне. В случае с РНР чем больше код тем больше дебага, поэтому скорость спустя некоторое время с первоначально большого уровня должна начать падать, причем не удивлюсь если она будет падать пропорционально квадрату обьема кода.
За сим откланиваюсь.

Азбука MySQL

Азбука MySQL

Автор: Николай Шляхтун (Издательский Дом "КОМИЗДАТ")
Причина возникновения названия MySQL остается неясной. С одной стороны, разработчики в процессе написания программ ко многим директориям и именам файлов традиционно добавляли префикс "my". С другой стороны, имя дочери одного из разработчиков - My. Какой из этих фактов стал причиной такого названия, остается загадкой даже для разработчиков.
Как только мы задумываемся об упорядоченном хранении информации, неизбежно приходим к мысли о создании базы данных. Создав ее, например, в Microsoft Access, мы облегченно вздыхаем и на какое-то время успокаиваемся. Но это "какое-то время" длится недолго - на горизонте уже маячит следующая, продиктованная жизненной необходимостью задача: нужно обеспечить доступ к данным через интернет с рабочих станций, на которых, вполне возможно, установлены различные ОС. И вот тут на помощь приходит быстрая и надежная СУБД MySQL.
Эта СУБД ведет свое начало от mSQL. Разработчики нуждались в более быстрой, надежной и гибкой СУБД. В результате был создан новый SQL-интерфейс при почти не измененном API-интерфейс mSQL. Этот API был выбран, чтобы облегчить перенос программ других разработчиков.

Вся мощь простоты

SQL - это язык структурированных запросов (Structured Query Language), международный стандарт языка для доступа к базам данных.
MySQL - это, если смотреть в общем, SQL-сервер; иначе говоря - программа, которая принимает запросы, написанные на SQL, и отсылает обратно определенные ответы. Ответами могут быть: данные, количество строк, задействованных в запросе, или просто строка (например, "Привет, Мир!").
СУБД MySQL предоставляет в ваше распоряжение подмножество языка SQL, соответствующее спецификации ANSI SQL 92.
Конечно, нам нужно как-то обеспечить доступ к MySQL. Это можно сделать или через клиент (как текстовый, так и графический), или через какой-то язык программирования.
Ядро, на котором сформирован MySQL, представляет собой набор подпрограмм, которые уже много лет использовались в высокотребовательном окружении. Это богатый и полезный функциональный набор, в то время как MySQL все еще находится в разработке.
Основные цели MySQL: быстродействие и ошибкоустойчивость. Эта СУБД прекрасно справляется с обработкой очень значительных массивов данных (большое количество пользователей сообщают о работе с тысячами и даже миллионами записей). В листах рассылок нередки сообщения об базах данных в несколько гигабайт. Кроме того, MySQL в запросах к большим таблицам превосходит многие другие системы. Она очень стабильна и превосходно работает даже в случаях, когда несколько сотен пользователей нуждаются в доступе к одним и тем же данным. Исходя из вышесказанного легко понять, почему MySQL пользуется такой популярностью у разработчиков веб-приложений. MySQL также очень масштабируема, работает на всем - от персональных компьютеров до больших многопроцессорных систем.
Одно из замечательных свойств MySQL заключается в том, что пользователь имеет доступ к MySQL-серверу независимо от операционной системы, языка программирования или клиента, которым пользуется. Находясь на UNIX-системе, пользователь может связываться с MySQL-сервером, работающим на OS/2- и Windows-платформах.
Для взаимодействия с MySQL-сервером можно использовать множество языков программирования. Можно написать программы на C, C++, Java, PHP, Perl, TCL, Python - и они будут работать.
В MySQL все организовано по схеме "ничего лишнего", поэтому и отсутствуют некоторые функции, которыми оснащены другие базы данных. MySQL не поддерживает вложенных запросов, тригерров; отсутствует также встроенная поддержка XML, OLAP и конструктов (constraits). Но зато есть новации (например, возможность кешировать запросы). Отсутствующие функции были принесены в жертву быстродействию, которое обеспечивает эта СУБД (хотя, если какие-то из этих функций все же понадобятся, можно использовать разработками сторонних производителей).

Как поставил, так и держится

Теперь, когда мы увидели, каким "навороченным" продуктом является MySQL, тем более хочется попробовать его в деле, поставить и пощупать все своими руками. Этим и займемся.
В связи с возрастающим интересом к Linux-платформам, рассмотрим установку и работу с MySQL именно на такой платформе. Чтобы инсталляция MySQL проходила без особых затруднений, будем следовать рекомендациям, выложенным на сайте MySQL.
  • Первое, что нам рекомендуют,- скачать стабильную (stable release) версию (на момент написания статьи - MySQL 3.23.49a).
  • Второй совет: не пытаться скомпилировать MySQL самостоятельно - устанавливать уже скомпилированную версию.
Приняв на вооружение эти рекомендации, запускаем на закачку файл "mysql-3.23.49a-pc-linux-gnu-i686.tar.gz" и спустя некоторое время получаем его. Перед началом установки создадим у себя группу и пользователя mysql:
Shell>groupadd mysql  Shell> useradd -g mysql mysql  
Далее распаковываем этот файл в каталог /usr/local:
Shell> tar -zxf gunzip mysql-3.23.49a-pc-linux-gnu-i686.tar.gz
Затем нужно сделать символическую ссылку mysql с каталога mysql-3.23.49a-pc-linux-gnu-i686:
Shell> ln -s mysql-3.23.49a-pc-linux-gnu-i686 mysql
Причина этих действий заключается в том, что в скриптах прописаны именно эти каталоги.
Теперь создадим каталог, в котором будут хранится базы. Для этого нужно всего лишь зайти в каталог mysql и запустить скрипт mysql_install_db, который находится в каталоге scripts:
Shell>cd /usr/local/mysql  Shell>scripts/mysql_install_db  
И последний штрих: с помощью команды safe_mysqld, которая находится в каталоге bin, запускаем сервер. Если очень хочется, чтобы запуск происходил при каждой загрузке системы, надо поместить запуск safe_mysql в один из файлов инициализации системы.
В качестве примера: дописываем в /etc/rc.d/rc.local строчку /usr/local/mysql/bin/safe_mysqld &. Но, если просто записать эту строку в rc.local, mysql не захочет запускаться при загрузке системы. И вот, пошаманив немного над файлом safe_mysqld, я обнаружил, что в некоторых местах нужно заменить libexec на bin и var на data. Вот строки (начиная с 87), которые подверглись изменениям:
MY_BASEDIR_VERSION=$MY_PWD # Where libexec, share and var are
ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
DATADIR=$MY_BASEDIR_VERSION/data
else
MY_BASEDIR_VERSION=/usr/local/mysql
DATADIR=/usr/local/mysql/data
ledir=/usr/local/mysql/bin
После того как мы все поставили, нужно изменить владельца и группу созданных каталогов.
Каталогу mysql и всем подкаталогам нужно назначить владельца root и группу mysql.
Shell>chown -R root:mysql /usr/local/mysql  
Каталогу баз данных назначаем владельца mysql и одноименную группу.
Shell>chown -R mysql:mysql /usr/local/mysql/data  
И последний штрих в настройке - пропишем путь к исполняемым программам mysql в profile:
PATH=$PATH:/usr/local/mysql/bin  
На сайте mysql можно скачать графические оболочки для работы с базами (mysqlgui и mycc). Только вот, установив эти оболочки, я пришел к выводу, что они не заменяют знание SQL и удобны только для отображения таблиц, находящихся в базе (кстати, для отображения мне больше понравился mycc - у него понятнее интерфейс, и с ним легче работать).
Для связи с базой данных предназначена программа mysql. Это командный интерпретатор, который передает введенные команды СУБД.

Что б такого сотворить

В качестве примера работы с этой системой управления базами данных создадим базу аудиодисков. Думаю, найдется немало любителей музыки, владеющих такой массой музыкальных дисков, что в ней можно запутаться. Кроме того, еще одна проблема возникает, когда даешь кому-то послушать диск. Диск слушают, а возвращать забывают (да и сам нередко забываешь, кому что дал). Вот и получается: что диск у тебя был, помнишь, а где он сейчас - без понятия.
Итак, мы поняли, что нужно сделать; приступим к исполнению.
Для начала создадим базу данных. Запускаем командный интерпретатор и набираем:
Mysql> create database audio_cd;  
Теперь самое время подумать, из чего же будет состоять наша база. Иначе говоря, какие таблицы она будет в себя включать.

Создадим таблицу дисков, которая будет включать в себя 3 поля:
  • уникальный номер диска;
  • название диска;
  • год выпуска диска.

Следующая таблица - это таблица песен:
  • уникальный номер песни
  • название песни
  • исполнитель
  • описание, или жанр

Третья таблица, которую мы создадим, это таблица друзей:
  • уникальный номер;
  • имя;
  • адрес;
  • телефон;
  • адрес электронной почты.
Естественно, что на диске может быть больше одной песни, и что одна песня может быть на разных компактах, поэтому это связь "многие ко многим". Но, вместе с тем, конкретный диск одновременно может находиться только у одного человека, и один человек может взять несколько дисков - поэтому это связь "многие к одному".
Для фиксации связей нам понадобятся две таблицы. В первой будет записано, какие песни на каких дисках находятся, во второй - у кого из друзей сейчас диск.
Теперь, когда мы разобрались с тем, какой должна быть структура нашей базы, можно набрать несколько команд, чтобы претворить задуманное в жизнь. Все команды будем выполнять в командном интерпретаторе mysql. Можно также набрать их в любом текстовом редакторе, записать в файл, а потом передать на командный вход интерпретатору - и он выполнит наши команды. Например, если мы сделаем текстовый файл db.txt, в котором запишем необходимые команды SQL, то выполнить этот файл можно с помощью команды:
Shell>mysql <DB.TXT pre ><>
Вот как выглядит этот файл:
use audio_cd;
create table cd (
   cd_id SMALLINT unsigned not null auto_increment PRIMARY KEY,
   name VARCHAR(100) not null default "",
   release_year YEAR
);
create table songs(
   song_id SMALLINT unsigned not null auto_increment,
   primary key (song_id),
   song_name VARCHAR(200) not null default "",
   autor_name VARCHAR(100) not null default "",
   description VARCHAR(255) not null default ""
);
create table songs_on_cd(
   cd_id SMALLINT unsigned not null REFERENCES cd,
   song_id SMALLINT unsigned not null REFERENCES songs
);
create table people(
   p_id SMALLINT unsigned not null auto_increment PRIMARY KEY,
   name VARCHAR(100) not null default "",
   addr VARCHAR(255) not null default "",
   phonnum char(6) not null default "000000",
   email varchar(50) not null default ""
);
create table take_disk(
   cd_id SMALLINT unsigned not null REFERENCES cd,
   p_id SMALLINT unsigned not null REFERENCES people
);
У нас есть база, нужно заполнить ее полезной информацией. Для начала добавим в нее несколько дисков с песнями. Для примера возьмем диски "Pink Floyd".
Итак, добавляем диск 1983 года - "The Final Cut":
Mysql>insert into cd values (NULL, 'The Final Cut', 1983);
Добавляем в этот альбом песни:
mysql> insert into songs values
   (NULL, "The post war dream", "Pink Floyd", ""),
   (NULL, "Your possible pasts", "Pink Floyd",""),
   (NULL, "One of the few", "Pink Floyd",""),
   (NULL, "The hero's return", "Pink Floyd",""),
   (NULL, "The gunner's dream", "Pink Floyd",""),
   (NULL, "Paranoyd eyes", "Pink Floyd",""),
   (NULL, "Get your filthy hands off my desert", "Pink Floyd",""),
   (NULL, "The fletcher memorial home", "Pink Floyd",""),
   (NULL, "Southampton dock", "Pink Floyd",""),
   (NULL, "The final cut", "Pink Floyd",""),
   (NULL, "Hot now john", "Pink Floyd",""),
   (NULL, "Two suns in the sunset", "Pink Floyd","");
Нужно присоединить эти песни к диску -для этого заполним таблицу songs_on_cd. Смотрим в соответствующих таблицах, под каким номером находятся песни, а под каким номером - диск. Это можно сделать с помощью команды select:
Mysql>select * from cd;  Mysql>select * from songs;  
Или просмотрев таблицы с помощью графической оболочки.

Из рисунка видно, что нужно добавить песни с номерами 1-12 к диску номер 1:
Mysql>insert into songs_on_cd values (1,1), (1,2), (1,3), (1,4), (1,5),
      (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12); 
Аналогично добавляем альбом 1999 года "Red Hot Chili Peppers" "Californication".
Если возникнет необходимость посмотреть, какие песни на каком диске находятся, можно воспользоваться sql-командой select. Например, чтобы посмотреть, что находится на диске Californication (см. рис. 3), набираем следующую команду:
mysql> select songs.song_name as song, songs.autor_name as autor
from songs, songs_on_cd, cd
where songs.song_id=songs_on_cd.song_id and
cd.cd_id=songs_on_cd.cd_id and cd.name="Californication";

Если мы хотим на время отдать диск кому-то из друзей, то для начала нужно будет ввести координаты этого человека в базу, а потом зафиксировать передачу диска. Вот как это выглядит на языке sql:
Mysql>insert into people values
   (NULL, "Ivanov Ivan", "st. Lenina 53,34", "4523412", "ivan@mail.ru");
Передаем диск:
Mysql> insert into take_disk values (1,1);
И последний пример - посмотрим, у кого находится диск "The Final Cut" (см. рис. 4):
mysql> select people.name as "Name", people.addr as "Address",
people.phonnum as "Phone", people.email from people, cd, take_disk
where take_disk.cd_id=cd.cd_id and take_disk.p_id=people.p_id and
cd.name='The Final Cut';

Хотя команда и получилась громоздкой, но она прекрасно работает даже в случае, если бы в базе было несколько тысяч записей.

Напутствие в дорогу

Mysql - быстрая и надежная система управления базами данных, хотя ее редко используют, набирая все команды вручную - так, как это сделали мы. Обычно она играет свою роль за кулисами, обслуживая разнообразнейшие веб-сайты. Мы также можем создать с помощью PHP или Perl собственный веб-сайт для учета музыкальных дисков. Но использование этих языков для доступа к mysql - это уже тема для отдельной статьи.

SQL - запросы и их обработка с помощью PHP

SQL - запросы и их обработка с помощью PHP

В данной статье мы рассмотрим способы обращения к таблицам баз данный MySQL с помощью языка запросов SQL. SQL - это аббревиатура, которая так и "раскрывается" - структуризированный язык запросов.
В языке PHP для это цели существует целый ряд функций с префиксом "mysql". Нам для рассмотрения запросов понадобится не так много из них. Функция, без которой в языке PHP выполнение SQL-запросов было бы просто невозможным:
resource mysql_query(запрос)
Данная функция посылает запрос к базе данных и возвращает в случае успешного обращения идентификатор ресурса.
Для того чтобы подключиться к базе данных MySQL необходимо выполнить следующую последовательность:
$host='localhost'; // имя хоста (уточняется у провайдера)
$database='db_name'; // имя базы данных, которую вы должны создать
$user='user_name'; // заданное вами имя пользователя, либо определенное провайдером
$pswd='your_pass'; // заданный вами пароль
 
$dbh = mysql_connect($host, $user, $pswd) or die("Не могу соединиться с MySQL.");
mysql_select_db($database) or die("Не могу подключиться к базе.");
Итак mysql_connect() - функция для подключения к серверу MySQL на Вашем хостинге.
А mysql_select_db() выбирает базу данных на сервере для подключения.
Иными словами подключаемся к серверу, выбираем базу и начинаем работать.
Функция die() вызывается в случае ошибки и выводит в окно браузера сообщение, которое вы указали.
Для завершения работы с базами данных используется функция:
mysql_close($dbh);
Здесь $dbh - дескриптор, которые при соединении возвратила функция mysql_connect.
Закончив стартовый обзор, начнем рассмотрение собственно SQL-запросов.
Для этого прежде всего вам необходимо создать базу данных с определенном именем. А в ней создать таблицу, тоже с конкретным именем. В наших примерах будем обращаться к таблице my_sql_table. Чтобы создать эту таблицу давайте выполним в phpmyadmin нашего localhost следующий запрос:
CREATE TABLE `my_sql_table` (
`id` INT NOT NULL ,    // идентификатор будущих записей таблицы
`firstname` VARCHAR( 50 ) NOT NULL , // текстовое поле VARCHAR
`surname` VARCHAR( 50 ) NOT NULL , // max длиной 50 символов
PRIMARY KEY ( `id` ) // первичный ключ - идентификатор id
);
Итак таблица создана. Выполним первый запрос, который сразу оформим в виде PHP-кода:
<?php
// Файл firstsql.php
$host='localhost'; // имя хоста (уточняется у провайдера)
$database='db_name'; // имя базы данных, которую вы должны создать
$user='user_name'; // заданное вами имя пользователя, либо определенное провайдером
$pswd='your_pass'; // заданный вами пароль
 
$dbh = mysql_connect($host, $user, $pswd) or die("Не могу соединиться с MySQL.");
mysql_select_db($database) or die("Не могу подключиться к базе.");
$query = "SELECT * FROM `my_sql_table`";
$res = mysql_query($query);
while($row = mysql_fetch_array($res))
{
echo "Номер: ".$row['id']."<br>\n";
echo "Имя: ".$row['firstname']."<br>\n";
echo "Фамилия: ".$row['surname']."<br><hr>\n";
}
?>
Разберем PHP-код файла firstsql.php. Начнем с собственно запроса к таблицам базы данных (БД).
$query = "SELECT * FROM `my_sql_table`";
Данный запрос можно расшифровать так: выбрать из таблицы my_sql_table БД все записи из всех полей. Таким образом знак * после слова SELECT означает "выбрать абсолютно все". Итак, запрос сформирован. Теперь его надо выполнить:
$res = mysql_query($query); 
В случае успешного выполнения запроса функция mysql_query() вернет нам идентификатор ресурса $res.
Его мы должны передать в качестве параметра в функцию mysql_fetch_array(). Название этой функции говорит само за себя. Т.е. она формирует и выдает массив по выборке из таблицы БД. В случае нашей таблицы массив будет состоять из числа элементов, равных количествам записей (строк) в таблице и содержать значения id, firstname, surname для каждой строки таблицы. Следовательно, следующий код:
while($row = mysql_fetch_array($res))
{
echo "Номер: ".$row['id']."<br>\n";
echo "Имя:".$row['firstname']."<br>\n";
echo "Фамилия:".$row['surname']."<br><hr>\n";
}
можно прокомментировать так: пока введенная нами переменная $row получает не нулевые результаты работы функции mysql_fetch_row следует выдать в броузер значение полей $row['id'], $row['firstname'], $row['surname'] с помощью echo.
Если запрос выполнить так:
$query = "SELECT firstname FROM `my_sql_table`";
то это будет означать, что из всех строк выбирается только значения поля firstname.
Следовательно предыдущий код следует переписать как:
$res = mysql_query($query);
while($row = mysql_fetch_array($res))
{
echo "Имя:".$row['firstname']."<br>\n";
}
Если Вы хотите выбрать строки таблицы с конкретным значением id где фамилия (surname) будет Петров, то запрос перепишется следующим образом:
$query = "SELECT id FROM `my_sql_table` where surname='Петров'";
А вот если потребуется узнать фамилию того, кто находится под номером, к примеру, 5, то запрос будет таким:
$query = "SELECT surname FROM `my_sql_table` where id=5";
В этом случае Вы знаете, что результатом запроса будет всего одна строка из таблицы. Т.е. нет смысла организовывать цикл с использованием while. И обработка запроса будет следующей
$res =  mysql_query($query);
$row = mysql_fetch_row($res);
echo "Фамилия пятого человека в списке:  ".$row[0]."\n";
Здесь вместо mysql_fetch_array() мы применили mysql_fetch_row(). Т.е. получить значение поля (или полей) конкретной строки. Поскольку поле у нас было одно -  surname - мы можем обратиться к единственному элементу массива $row как $row[0];.
Далее мы не будем столь подробно останавливаться на обработке запросов, а будем рассматривать наиболее типичные примеры собственно запросов.
Итак, рассмотрим наиболее типичные примеры запросов MySQL. Рассмотрение проведем на базе таблицы my_sql_table:
1. Добавим в таблицу my_sql_table поле middle_name (отчество) после surname:
$query = "ALTER TABLE `my_sql_table` ADD `middle_name` 
  VARCHAR( 50 ) NOT NULL AFTER `surname`"; 
2. Теперь удалим поле surname из таблицы my_sql_table:
$query = "ALTER TABLE `my_sql_table` DROP `surname`"; 
3. Удаляем записи из таблицы my_sql_table с фамилией Сидоров :
$query = "DELETE FROM `my_sql_table` where surname='Сидоров'"; 
4. Помимо знаков равенства,  также "больше" или "меньше", в языке MySQL запросов существует понятие "похоже на". Выберем записи из таблицы my_sql_table, где в фамилии встречается "дор" :
$query = "SELECT * FROM `my_sql_table` where surname like '%дор%'"; 
Здесь наличие "%" в начале и конце 'дор' и означает, что запрос будет искать именно 'дор', причем не важно в начале, конце, или середине фамилии он находится. Рассмотрим следующий пример
5. Выберем записи из таблицы my_sql_table с фамилией, которая начинается на П. Обратите внимание на расположение "%":
$query = "SELECT * FROM `my_sql_table` where surname like 'П%'";
6. Вычислим максимальное значение id:
$query = "SELECT MAX(id) FROM `my_sql_table`";
7. Вычислим количество полей в my_sql_table с фамилией, которая начинается на П.
$query = "SELECT COUNT(*) FROM `my_sql_table` where surname like 'П%'";
8. Удаление таблицы  my_sql_table:
$query = "DROP TABLE `my_sql_table`";
Для запросов 1-3 на языке PHP достаточно просто выполнить запрос:
mysql_query($query);
Мы рассмотрели наиболее характерные примеры запросов. Полагаю, с их помощью, следуя элементарной логике, Вы сможете выполнять более сложные запросы к созданным Вами таблицам баз данных MySQL.

суббота, 5 января 2019 г.

XQuery и виртуализация

XQuery и виртуализация

  • Чулан
XQuery — это не просто технология из мира XML, а что-то, что всем придётся знать. Каким образом XQuery начинает своё наступление, рассказывается в этих статьях:

XQuery и абстракция данных
Функциональность XPath 2.0 (через XQuery или XSLT) даёт возможность работы с объектами и в тех случаях, когда данные не включены в объект, а хранятся во внешних источниках или даже существуют только в виртуальной форме.

XQuery, libferris и виртуальные файловые системы.
С помощью libferris можно всё что угодно превратить в виртуальную файловую систему. А так как ФС является деревом, то получается, что совместное использование XQuery и libferris даёт универсальную систему запросов к данным.

Спасибо kate_kulikova за перевод.