MySQL - Szybki przewodnik

Co to jest baza danych?

Baza danych to osobna aplikacja, która przechowuje zbiór danych. Każda baza danych ma co najmniej jeden odrębny interfejs API do tworzenia, uzyskiwania dostępu, zarządzania, wyszukiwania i replikowania przechowywanych danych.

Można również używać innych rodzajów magazynów danych, takich jak pliki w systemie plików lub duże tabele skrótów w pamięci, ale pobieranie i zapisywanie danych nie byłoby tak szybkie i łatwe w tego typu systemach.

Obecnie używamy systemów zarządzania relacyjnymi bazami danych (RDBMS) do przechowywania i zarządzania ogromnymi ilościami danych. Nazywa się to relacyjną bazą danych, ponieważ wszystkie dane są przechowywane w różnych tabelach, a relacje są ustanawiane za pomocą kluczy podstawowych lub innych kluczy znanych jakoForeign Keys.

ZA Relational DataBase Management System (RDBMS) to oprogramowanie, które -

  • Umożliwia wdrożenie bazy danych z tabelami, kolumnami i indeksami.

  • Gwarantuje integralność referencyjną między wierszami różnych tabel.

  • Aktualizuje indeksy automatycznie.

  • Interpretuje zapytanie SQL i łączy informacje z różnych tabel.

Terminologia RDBMS

Zanim przejdziemy do wyjaśnienia systemu baz danych MySQL, zrewidujmy kilka definicji związanych z bazą danych.

  • Database - Baza danych to zbiór tabel z powiązanymi danymi.

  • Table- Tabela to macierz z danymi. Tabela w bazie danych wygląda jak zwykły arkusz kalkulacyjny.

  • Column - Jedna kolumna (element danych) zawiera dane jednego i tego samego rodzaju, na przykład kod pocztowy kolumny.

  • Row - Wiersz (= krotka, wpis lub rekord) to grupa powiązanych danych, na przykład dane jednej subskrypcji.

  • Redundancy - Dwukrotne przechowywanie danych, nadmiarowo, aby przyspieszyć działanie systemu.

  • Primary Key- Klucz podstawowy jest unikalny. Wartość klucza nie może wystąpić dwukrotnie w jednej tabeli. Za pomocą klucza możesz znaleźć tylko jeden wiersz.

  • Foreign Key - Klucz obcy to pin łączący między dwiema tabelami.

  • Compound Key - Klucz złożony (klucz złożony) to klucz składający się z wielu kolumn, ponieważ jedna kolumna nie jest wystarczająco unikalna.

  • Index - Indeks w bazie danych przypomina indeks na końcu książki.

  • Referential Integrity - Więzy integralności zapewniają, że wartość klucza obcego zawsze wskazuje na istniejący wiersz.

Baza danych MySQL

MySQL to szybki, łatwy w użyciu system RDBMS używany w wielu małych i dużych firmach. MySQL jest rozwijany, sprzedawany i obsługiwany przez szwedzką firmę MySQL AB. MySQL staje się tak popularny z wielu dobrych powodów -

  • MySQL jest udostępniany na licencji open source. Więc nie masz nic do zapłacenia, aby go używać.

  • MySQL jest sam w sobie bardzo potężnym programem. Obsługuje duży podzbiór funkcjonalności najdroższych i najbardziej wydajnych pakietów baz danych.

  • MySQL używa standardowej formy dobrze znanego języka danych SQL.

  • MySQL działa w wielu systemach operacyjnych iz wieloma językami, w tym PHP, PERL, C, C ++, JAVA itp.

  • MySQL działa bardzo szybko i dobrze działa nawet z dużymi zestawami danych.

  • MySQL jest bardzo przyjazny dla PHP, najbardziej cenionego języka do tworzenia stron internetowych.

  • MySQL obsługuje duże bazy danych, do 50 milionów wierszy lub więcej w tabeli. Domyślny limit rozmiaru pliku dla tabeli wynosi 4 GB, ale można go zwiększyć (jeśli system operacyjny sobie z tym poradzi) do teoretycznego limitu 8 milionów terabajtów (TB).

  • MySQL można dostosować. Licencja GPL typu open source umożliwia programistom modyfikowanie oprogramowania MySQL w celu dopasowania do ich własnych, specyficznych środowisk.

Zanim zaczniesz

Przed rozpoczęciem tego samouczka powinieneś mieć podstawową wiedzę na temat informacji zawartych w naszych samouczkach PHP i HTML.

Ten samouczek koncentruje się głównie na używaniu MySQL w środowisku PHP. Wiele przykładów podanych w tym samouczku będzie przydatnych dla programistów PHP.

Zalecamy zapoznanie się z naszym samouczkiem PHP w celach informacyjnych.

Wszystkie pliki do pobrania dla MySQL znajdują się na stronie MySQL Downloads . Wybierz numer wersjiMySQL Community Server który jest wymagany wraz z platformą, na której będziesz go uruchamiać.

Instalowanie MySQL w systemie Linux / UNIX

Zalecanym sposobem instalacji MySQL w systemie Linux jest użycie RPM. MySQL AB udostępnia następujące RPM do pobrania na swojej stronie internetowej -

  • MySQL - Serwer bazy danych MySQL zarządza bazami danych i tabelami, kontroluje dostęp użytkowników i przetwarza zapytania SQL.

  • MySQL-client - Programy klienckie MySQL, które umożliwiają połączenie się i interakcję z serwerem.

  • MySQL-devel - Biblioteki i pliki nagłówkowe, które przydają się podczas kompilowania innych programów korzystających z MySQL.

  • MySQL-shared - Biblioteki współdzielone dla klienta MySQL.

  • MySQL-bench - Narzędzia do testów porównawczych i testowania wydajności serwera bazy danych MySQL.

Wymienione tutaj RPM MySQL są zbudowane na platformie SuSE Linux system, ale zazwyczaj będą działać na innych wariantach Linuksa bez żadnych trudności.

Teraz musisz postępować zgodnie z poniższymi krokami, aby kontynuować instalację -

  • Zaloguj się do systemu za pomocą root użytkownik.

  • Przejdź do katalogu zawierającego pliki RPM.

  • Zainstaluj serwer bazy danych MySQL, wykonując następujące polecenie. Pamiętaj, aby zastąpić nazwę pliku kursywą nazwą pliku RPM.

[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm

Powyższe polecenie zajmuje się instalacją serwera MySQL, utworzeniem użytkownika MySQL, utworzeniem niezbędnej konfiguracji i automatycznym uruchomieniem serwera MySQL.

Wszystkie pliki binarne związane z MySQL można znaleźć w / usr / bin i / usr / sbin. Wszystkie tabele i bazy danych zostaną utworzone w katalogu / var / lib / mysql.

Poniższa skrzynka kodowa ma opcjonalny, ale zalecany krok, aby zainstalować pozostałe RPM w ten sam sposób -

[root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm

Instalowanie MySQL w systemie Windows

Domyślna instalacja w dowolnej wersji systemu Windows jest teraz znacznie łatwiejsza niż kiedyś, ponieważ MySQL jest teraz ładnie zapakowany z instalatorem. Wystarczy pobrać pakiet instalacyjny, rozpakować go w dowolnym miejscu i uruchomić plik setup.exe.

Domyślny instalator setup.exe przeprowadzi Cię przez trywialny proces i domyślnie zainstaluje wszystko w C: \ mysql.

Przetestuj serwer, uruchamiając go z wiersza poleceń za pierwszym razem. Przejdź do lokalizacjimysqld server czyli prawdopodobnie C: \ mysql \ bin i wpisz -

mysqld.exe --console

NOTE - Jeśli korzystasz z systemu NT, będziesz musiał użyć mysqld-nt.exe zamiast mysqld.exe

Jeśli wszystko poszło dobrze, zobaczysz kilka komunikatów o uruchomieniu i InnoDB. Jeśli nie, możesz mieć problem z uprawnieniami. Upewnij się, że katalog zawierający dane jest dostępny dla dowolnego użytkownika (prawdopodobnie MySQL), w którym działają procesy bazy danych.

MySQL nie doda się do menu startowego i nie ma szczególnie przyjemnego sposobu GUI na zatrzymanie serwera. Dlatego jeśli masz tendencję do uruchamiania serwera przez dwukrotne kliknięcie pliku wykonywalnego mysqld, powinieneś pamiętać o ręcznym zatrzymaniu procesu za pomocą mysqladmin, listy zadań, menedżera zadań lub innych środków specyficznych dla systemu Windows.

Weryfikacja instalacji MySQL

Po pomyślnym zainstalowaniu MySQL, podstawowe tabele zostały zainicjowane i serwer został uruchomiony: możesz sprawdzić, czy wszystko działa tak, jak powinno, za pomocą kilku prostych testów.

Użyj narzędzia mysqladmin, aby uzyskać stan serwera

Posługiwać się mysqladminbinarny, aby sprawdzić wersję serwera. Ten plik binarny byłby dostępny w / usr / bin w systemie Linux oraz w C: \ mysql \ bin w systemie Windows.

[root@host]# mysqladmin --version

W systemie Linux da to następujący wynik. Może się różnić w zależności od instalacji -

mysqladmin  Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386

Jeśli nie otrzymasz takiego komunikatu, może to oznaczać, że wystąpił problem z instalacją i będziesz potrzebować pomocy, aby go naprawić.

Wykonuj proste polecenia SQL za pomocą klienta MySQL

Możesz połączyć się z serwerem MySQL za pośrednictwem klienta MySQL i przy użyciu rozszerzenia mysqlKomenda. W tej chwili nie musisz podawać żadnego hasła, ponieważ domyślnie będzie ono puste.

Możesz po prostu użyć następującego polecenia -

[root@host]# mysql

Powinien zostać nagrodzony zachętą mysql>. Teraz masz połączenie z serwerem MySQL i możesz wykonać wszystkie polecenia SQL w wierszu polecenia mysql> w następujący sposób -

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
|   mysql  | 
|   test   |  
+----------+
2 rows in set (0.13 sec)

Kroki poinstalacyjne

MySQL jest dostarczany z pustym hasłem dla użytkownika root MySQL. Jak tylko pomyślnie zainstalujesz bazę danych i klienta, musisz ustawić hasło roota podane w poniższym bloku kodu -

[root@host]# mysqladmin -u root password "new_password";

Teraz, aby nawiązać połączenie z serwerem MySQL, musisz użyć następującego polecenia -

[root@host]# mysql -u root -p
Enter password:*******

Użytkownicy systemu UNIX będą również chcieli umieścić katalog MySQL w PATH, więc nie będziesz musiał wpisywać pełnej ścieżki za każdym razem, gdy chcesz użyć klienta wiersza poleceń.

Dla basha byłoby to coś w rodzaju -

export PATH = $PATH:/usr/bin:/usr/sbin

Uruchamianie MySQL w czasie rozruchu

Jeśli chcesz uruchomić serwer MySQL podczas rozruchu, upewnij się, że w pliku /etc/rc.local znajduje się następujący wpis.

/etc/init.d/mysqld start

Powinieneś także mieć plik binarny mysqld w katalogu /etc/init.d/.

Uruchamianie i zamykanie serwera MySQL

Najpierw sprawdź, czy serwer MySQL działa, czy nie. Możesz użyć następującego polecenia, aby to sprawdzić -

ps -ef | grep mysqld

Jeśli Twój MySql jest uruchomiony, zobaczysz mysqldproces wymieniony w wyniku. Jeśli serwer nie działa, możesz go uruchomić za pomocą następującego polecenia -

root@host# cd /usr/bin
./safe_mysqld &

Teraz, jeśli chcesz zamknąć już działający serwer MySQL, możesz to zrobić za pomocą następującego polecenia -

root@host# cd /usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******

Konfiguracja konta użytkownika MySQL

Aby dodać nowego użytkownika do MySQL, wystarczy dodać nowy wpis do pliku user tabela w bazie danych mysql.

Poniższy program jest przykładem dodawania nowego użytkownika guest z uprawnieniami SELECT, INSERT i UPDATE za pomocą hasła guest123; zapytanie SQL to -

root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed

mysql> INSERT INTO user 
   (host, user, password, 
   select_priv, insert_priv, update_priv) 
   VALUES ('localhost', 'guest', 
   PASSWORD('guest123'), 'Y', 'Y', 'Y');
Query OK, 1 row affected (0.20 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0.01 sec)

mysql> SELECT host, user, password FROM user WHERE user = 'guest';
+-----------+---------+------------------+
|    host   |   user  |     password     |    
+-----------+---------+------------------+
| localhost |  guest  | 6f8c114b58f2ce9e |
+-----------+---------+------------------+
1 row in set (0.00 sec)

Dodając nowego użytkownika pamiętaj o zaszyfrowaniu nowego hasła za pomocą funkcji PASSWORD () dostarczanej przez MySQL. Jak widać w powyższym przykładzie, hasło moje jest zaszyfrowane do 6f8c114b58f2ce9e.

Zwróć uwagę na instrukcję FLUSH PRIVILEGES. To instruuje serwer, aby ponownie załadował tabele grantów. Jeśli go nie używasz, nie będziesz w stanie połączyć się z MySQL przy użyciu nowego konta użytkownika, przynajmniej do czasu ponownego uruchomienia serwera.

Możesz również określić inne uprawnienia dla nowego użytkownika, ustawiając wartości kolejnych kolumn w tabeli użytkowników na „Y” podczas wykonywania zapytania INSERT lub możesz je później zaktualizować za pomocą zapytania UPDATE.

  • Select_priv
  • Insert_priv
  • Update_priv
  • Delete_priv
  • Create_priv
  • Drop_priv
  • Reload_priv
  • Shutdown_priv
  • Process_priv
  • File_priv
  • Grant_priv
  • References_priv
  • Index_priv
  • Alter_priv

Innym sposobem dodania konta użytkownika jest użycie polecenia GRANT SQL. Poniższy przykład doda użytkownikazara z hasłem zara123 dla określonej bazy danych, która nosi nazwę TUTORIALS.

root@host# mysql -u root -p password;
Enter password:*******
mysql> use mysql;
Database changed

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
   -> ON TUTORIALS.*
   -> TO 'zara'@'localhost'
   -> IDENTIFIED BY 'zara123';

Spowoduje to również utworzenie wpisu w tabeli bazy danych MySQL o nazwie as user.

NOTE - MySQL nie kończy polecenia, dopóki nie wstawisz średnika (;) na końcu polecenia SQL.

Konfiguracja pliku /etc/my.cnf

W większości przypadków nie należy dotykać tego pliku. Domyślnie będzie zawierał następujące wpisy -

[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

[mysql.server]
user = mysql
basedir = /var/lib

[safe_mysqld]
err-log = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid

W tym miejscu możesz określić inny katalog dla dziennika błędów, w przeciwnym razie nie powinieneś zmieniać żadnego wpisu w tej tabeli.

Administracyjne polecenie MySQL

Oto lista ważnych poleceń MySQL, z których będziesz korzystać od czasu do czasu podczas pracy z bazą danych MySQL -

  • USE Databasename - Posłuży do wybrania bazy danych w obszarze roboczym MySQL.

  • SHOW DATABASES - Wyświetla listę baz danych, które są dostępne dla MySQL DBMS.

  • SHOW TABLES - Pokazuje tabele w bazie danych po wybraniu bazy danych za pomocą polecenia use.

  • SHOW COLUMNS FROM tablename: Pokazuje atrybuty, typy atrybutów, kluczowe informacje, czy NULL jest dozwolone, wartości domyślne i inne informacje dotyczące tabeli.

  • SHOW INDEX FROM tablename - Przedstawia szczegóły wszystkich indeksów w tabeli, w tym KLUCZ PODSTAWOWY.

  • SHOW TABLE STATUS LIKE tablename\G - Raportuje szczegóły wydajności i statystyk MySQL DBMS.

W następnym rozdziale omówimy sposób wykorzystania składni PHP w MySQL.

MySQL działa bardzo dobrze w połączeniu różnych języków programowania, takich jak PERL, C, C ++, JAVA i PHP. Spośród tych języków PHP jest najpopularniejszym ze względu na możliwości tworzenia aplikacji internetowych.

Ten samouczek koncentruje się głównie na używaniu MySQL w środowisku PHP. Jeśli jesteś zainteresowany MySQL z PERL, możesz rozważyć przeczytanie samouczka PERL .

PHP zapewnia różne funkcje dostępu do bazy danych MySQL i manipulowania rekordami danych w bazie danych MySQL. Wymagałbyś wywoływania funkcji PHP w ten sam sposób, w jaki wywołujesz każdą inną funkcję PHP.

Funkcje PHP używane z MySQL mają następujący ogólny format -

mysql_function(value,value,...);

Druga część nazwy funkcji jest specyficzna dla funkcji i zwykle jest słowem opisującym, co robi funkcja. Poniżej znajdują się dwie funkcje, których użyjemy w naszym samouczku -

mysqli_connect($connect);
mysqli_query($connect,"SQL statement");

Poniższy przykład przedstawia ogólną składnię języka PHP do wywoływania dowolnej funkcji MySQL.

<html>
   <head>
      <title>PHP with MySQL</title>
   </head>
   
   <body>
      <?php
         $retval = mysql_function(value, [value,...]);
         if( !$retval ) {
            die ( "Error: a related error message" );
         }
         // Otherwise MySQL  or PHP Statements
      ?>
   </body>
</html>

Począwszy od następnego rozdziału, zobaczymy wszystkie ważne funkcje MySQL wraz z PHP.

Połączenie MySQL za pomocą binarnego MySQL

Możesz ustanowić bazę danych MySQL za pomocą rozszerzenia mysql binarny w wierszu polecenia.

Przykład

Oto prosty przykład połączenia z serwerem MySQL z wiersza poleceń -

[root@host]# mysql -u root -p
Enter password:******

To da ci wiersz poleceń mysql>, w którym będziesz mógł wykonać dowolne polecenie SQL. Oto wynik powyższego polecenia -

Poniższy blok kodu pokazuje wynik powyższego kodu -

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2854760 to server version: 5.0.9

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

W powyższym przykładzie użyliśmy rootjako użytkownik, ale możesz też użyć dowolnego innego użytkownika. Każdy użytkownik będzie mógł wykonać wszystkie operacje SQL, które są dla niego dozwolone.

Możesz odłączyć się od bazy danych MySQL w dowolnym momencie przy użyciu rozszerzenia exit polecenie w mysql> prompt.

mysql> exit
Bye

Połączenie MySQL za pomocą skryptu PHP

PHP zapewnia mysql_connect()funkcja, aby otworzyć połączenie z bazą danych. Ta funkcja przyjmuje pięć parametrów i zwraca identyfikator łącza MySQL w przypadku sukcesu lub FALSE w przypadku niepowodzenia.

Składnia

connection mysql_connect(server,user,passwd,new_link,client_flag);

Sr.No. Parametr i opis
1

server

Opcjonalne - nazwa hosta, na którym działa serwer bazy danych. Jeśli nie zostanie określony, wartością domyślną będzielocalhost:3306.

2

user

Opcjonalne - nazwa użytkownika uzyskująca dostęp do bazy danych. Jeśli nie zostanie określony, domyślną nazwą będzie nazwa użytkownika będącego właścicielem procesu serwera.

3

passwd

Opcjonalne - hasło użytkownika uzyskującego dostęp do bazy danych. Jeśli nie zostanie określony, domyślnym hasłem będzie puste hasło.

4

new_link

Opcjonalne - jeśli nastąpi drugie wywołanie mysql_connect () z tymi samymi argumentami, nowe połączenie nie zostanie nawiązane; zamiast tego zostanie zwrócony identyfikator już otwartego połączenia.

5

client_flags

Opcjonalnie - kombinacja następujących stałych -

  • MYSQL_CLIENT_SSL - użyj szyfrowania SSL.

  • MYSQL_CLIENT_COMPRESS - użyj protokołu kompresji.

  • MYSQL_CLIENT_IGNORE_SPACE - Zezwalaj na spację po nazwach funkcji.

  • MYSQL_CLIENT_INTERACTIVE - Zezwalaj na interaktywny limit czasu nieaktywności w sekundach przed zamknięciem połączenia.

Możesz odłączyć się od bazy danych MySQL w dowolnym momencie za pomocą innej funkcji PHP mysql_close(). Ta funkcja przyjmuje pojedynczy parametr, który jest połączeniem zwracanym przezmysql_connect() funkcjonować.

Składnia

bool mysql_close ( resource $link_identifier );

Jeśli zasób nie zostanie określony, ostatnia otwarta baza danych jest zamykana. Ta funkcja zwraca prawdę, jeśli pomyślnie zamyka połączenie, w przeciwnym razie zwraca fałsz.

Przykład

Wypróbuj następujący przykład, aby połączyć się z serwerem MySQL -

<html>
   <head>
      <title>Connecting MySQL Server</title>
   </head>
   <body>
      <?php
         $dbhost = 'localhost:3306'; $dbuser = 'guest';
         $dbpass = 'guest123'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully';
         mysql_close($conn);
      ?>
   </body>
</html>

Utwórz bazę danych za pomocą mysqladmin

Do tworzenia lub usuwania bazy danych MySQL potrzebne byłyby specjalne uprawnienia. Zakładając, że masz dostęp do użytkownika root, możesz utworzyć dowolną bazę danych za pomocą mysqlmysqladmin dwójkowy.

Przykład

Oto prosty przykład tworzenia bazy danych o nazwie TUTORIALS -

[root@host]# mysqladmin -u root -p create TUTORIALS
Enter password:******

Spowoduje to utworzenie bazy danych MySQL o nazwie TUTORIALS.

Utwórz bazę danych za pomocą skryptu PHP

PHP używa mysql_queryfunkcja tworzenia lub usuwania bazy danych MySQL. Ta funkcja przyjmuje dwa parametry i zwraca wartość TRUE w przypadku sukcesu lub FALSE w przypadku niepowodzenia.

Składnia

bool mysql_query( sql, connection );

Sr.No. Parametr i opis
1

sql

Wymagane - zapytanie SQL do utworzenia lub usunięcia bazy danych MySQL

2

connection

Opcjonalnie - jeśli nie zostanie określony, zostanie użyte ostatnio otwarte połączenie przez mysql_connect.

Przykład

Poniższy przykład tworzenia bazy danych -

<html>
   <head>
      <title>Creating MySQL Database</title>
   </head>
   
   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root'; $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);
         
         if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = 'CREATE DATABASE TUTORIALS';
         $retval = mysql_query( $sql, $conn ); if(! $retval ) {
            die('Could not create database: ' . mysql_error());
         }
         echo "Database TUTORIALS created successfully\n";
         mysql_close($conn);
      ?>
   </body>
</html>

Usuń bazę danych za pomocą mysqladmin

Do tworzenia lub usuwania bazy danych MySQL potrzebne byłyby specjalne uprawnienia. Zakładając, że masz dostęp do użytkownika root, możesz utworzyć dowolną bazę danych za pomocą mysqlmysqladmin dwójkowy.

Zachowaj ostrożność podczas usuwania jakiejkolwiek bazy danych, ponieważ utracisz wszystkie dane dostępne w bazie danych.

Oto przykład usuwania bazy danych (TUTORIALE) utworzonej w poprzednim rozdziale -

[root@host]# mysqladmin -u root -p drop TUTORIALS
Enter password:******

To da ci ostrzeżenie i potwierdzi, czy naprawdę chcesz usunąć tę bazę danych, czy nie.

Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.

Do you really want to drop the 'TUTORIALS' database [y/N] y
Database "TUTORIALS" dropped

Usuń bazę danych za pomocą skryptu PHP

PHP używa mysql_queryfunkcja tworzenia lub usuwania bazy danych MySQL. Ta funkcja przyjmuje dwa parametry i zwraca wartość TRUE w przypadku sukcesu lub FALSE w przypadku niepowodzenia.

Składnia

bool mysql_query( sql, connection );

Sr.No Parametr i opis
1

sql

Wymagane - zapytanie SQL do utworzenia lub usunięcia bazy danych MySQL

2

connection

Opcjonalnie - jeśli nie zostanie określony, zostanie użyte ostatnio otwarte połączenie przez mysql_connect.

Przykład

Wypróbuj następujący przykład, aby usunąć bazę danych -

<html>
   <head>
      <title>Deleting MySQL Database</title>
   </head>
   
   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root'; $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);
         
         if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = 'DROP DATABASE TUTORIALS';
         $retval = mysql_query( $sql, $conn ); if(! $retval ) {
            die('Could not delete database: ' . mysql_error());
         }
         echo "Database TUTORIALS deleted successfully\n";
         mysql_close($conn);
      ?>
   </body>
</html>

WARNING- Podczas usuwania bazy danych za pomocą skryptu PHP nie wyświetla monitu o żadne potwierdzenie. Dlatego zachowaj ostrożność podczas usuwania bazy danych MySQL.

Po nawiązaniu połączenia z serwerem MySQL należy wybrać bazę danych do pracy. Dzieje się tak, ponieważ na serwerze MySQL może być dostępnych więcej niż jedna baza danych.

Wybieranie bazy danych MySQL z wiersza polecenia

Wybór bazy danych z polecenia mysql> jest bardzo prosty. Możesz użyć polecenia SQLuse aby wybrać bazę danych.

Przykład

Oto przykład wyboru bazy danych o nazwie TUTORIALS -

[root@host]# mysql -u root -p
Enter password:******
mysql> use TUTORIALS;
Database changed
mysql>

Teraz wybrałeś bazę danych TUTORIALS i wszystkie kolejne operacje będą wykonywane na bazie TUTORIALS.

NOTE- We wszystkich nazwach baz danych, nazwach tabel, nazwach pól tabeli rozróżniana jest wielkość liter. Musiałbyś więc używać nazw własnych podczas wydawania dowolnego polecenia SQL.

Wybór bazy danych MySQL za pomocą skryptu PHP

PHP zapewnia funkcje mysql_select_dbaby wybrać bazę danych. Zwraca TRUE w przypadku sukcesu lub FALSE w przypadku niepowodzenia.

Składnia

bool mysql_select_db( db_name, connection );

Sr.No. Parametr i opis
1

db_name

Wymagane - nazwa bazy danych MySQL do wybrania

2

connection

Opcjonalnie - jeśli nie zostanie określony, zostanie użyte ostatnio otwarte połączenie przez mysql_connect.

Przykład

Oto przykład pokazujący, jak wybrać bazę danych.

<html>
   <head>
      <title>Selecting MySQL Database</title>
   </head>
   
   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'guest'; $dbpass = 'guest123';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);
         
         if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; mysql_select_db( 'TUTORIALS' ); mysql_close($conn);
      ?>
   </body>
</html>

Prawidłowe zdefiniowanie pól w tabeli jest ważne dla ogólnej optymalizacji bazy danych. Powinieneś używać tylko typu i rozmiaru pola, którego naprawdę potrzebujesz. Na przykład nie definiuj pola o szerokości 10 znaków, jeśli wiesz, że zamierzasz użyć tylko 2 znaków. Te typy pól (lub kolumn) są również określane jako typy danych po rozszerzeniutype of data będziesz przechowywać na tych polach.

MySQL używa wielu różnych typów danych podzielonych na trzy kategorie -

  • Numeric
  • Data i godzina
  • Typy strun.

Omówmy je teraz szczegółowo.

Numeryczne typy danych

MySQL wykorzystuje wszystkie standardowe numeryczne typy danych ANSI SQL, więc jeśli przychodzisz do MySQL z innego systemu baz danych, te definicje będą wyglądać znajomo.

Poniższa lista przedstawia typowe numeryczne typy danych i ich opisy -

  • INT- Liczba całkowita o normalnej wielkości, która może być ze znakiem lub bez znaku. W przypadku podpisania dopuszczalny zakres wynosi od -2147483648 do 2147483647. Jeśli bez znaku, dopuszczalny zakres wynosi od 0 do 4294967295. Można określić szerokość do 11 cyfr.

  • TINYINT- Bardzo mała liczba całkowita, która może być ze znakiem lub bez znaku. Jeśli podpisany, dopuszczalny zakres wynosi od -128 do 127. Jeśli nie ma znaku, dopuszczalny zakres wynosi od 0 do 255. Można określić szerokość do 4 cyfr.

  • SMALLINT- Mała liczba całkowita, która może być ze znakiem lub bez. W przypadku podpisania dopuszczalny zakres wynosi od -32768 do 32767. Jeśli nie ma znaku, dopuszczalny zakres wynosi od 0 do 65535. Można określić szerokość do 5 cyfr.

  • MEDIUMINT- średniej wielkości liczba całkowita, która może być ze znakiem lub bez znaku. Jeśli znak jest podpisany, dopuszczalny zakres wynosi od -8388608 do 8388607. W przypadku braku znaku dopuszczalny zakres wynosi od 0 do 16777215. Możesz określić szerokość do 9 cyfr.

  • BIGINT- duża liczba całkowita, która może być ze znakiem lub bez znaku. Jeśli jest podpisany, dopuszczalny zakres wynosi od -9223372036854775808 do 9223372036854775807. W przypadku braku znaku dopuszczalny zakres wynosi od 0 do 18446744073709551615. Możesz określić szerokość do 20 cyfr.

  • FLOAT(M,D)- Liczba zmiennoprzecinkowa, której nie można bez znaku. Możesz zdefiniować długość wyświetlania (M) i liczbę miejsc po przecinku (D). Nie jest to wymagane i domyślnie wynosi 10,2, gdzie 2 to liczba miejsc po przecinku, a 10 to całkowita liczba cyfr (w tym dziesiętnych). Precyzja dziesiętna może dochodzić do 24 miejsc w przypadku zmiennej FLOAT.

  • DOUBLE(M,D)- Liczba zmiennoprzecinkowa podwójnej precyzji, która nie może być bez znaku. Możesz zdefiniować długość wyświetlania (M) i liczbę miejsc po przecinku (D). Nie jest to wymagane i domyślnie wynosi 16,4, gdzie 4 to liczba miejsc po przecinku. Dokładność dziesiętna może dochodzić do 53 miejsc w przypadku DOUBLE. REAL to synonim DOUBLE.

  • DECIMAL(M,D)- Rozpakowana liczba zmiennoprzecinkowa, której nie można bez znaku. W rozpakowanych liczbach dziesiętnych każda cyfra dziesiętna odpowiada jednemu bajtowi. Wymagane jest zdefiniowanie długości wyświetlania (M) i liczby miejsc po przecinku (D). NUMERIC to synonim DECIMAL.

Typy daty i godziny

Typy danych daty i godziny MySQL są następujące -

  • DATE- Data w formacie RRRR-MM-DD między 1000-01-01 a 9999-12-31. Na przykład, 30 grudnia th , 1973 byłyby przechowywane jako 1973-12-30.

  • DATETIME- Kombinacja daty i godziny w formacie RRRR-MM-DD HH: MM: SS, między 1000-01-01 00:00:00 a 9999-12-31 23:59:59. Na przykład, 3:30 po południu w dniu 30 grudnia th , 1973 byłyby przechowywane jako 1973-12-30 15:30:00.

  • TIMESTAMP- znacznik czasu pomiędzy północy 1 stycznia st , 1970 i kiedyś w 2037 roku to wygląda poprzedniego formatu DateTime tylko bez myślników pomiędzy numerami; 3:30 po południu w dniu 30 grudnia th , 1973 byłyby przechowywane jako 19731230153000 (rrrrmmddggmmss).

  • TIME - Przechowuje czas w formacie HH: MM: SS.

  • YEAR(M)- Przechowuje rok w formacie 2-cyfrowym lub 4-cyfrowym. Jeśli długość jest określona jako 2 (na przykład ROK (2)), ROK może wynosić od 1970 do 2069 (od 70 do 69). Jeśli długość jest określona jako 4, to YEAR może wynosić od 1901 do 2155. Domyślna długość to 4.

Typy strun

Chociaż typy liczbowe i daty są zabawne, większość danych, które będziesz przechowywać, będzie w formacie ciągu. Ta lista opisuje typowe typy danych typu string w MySQL.

  • CHAR(M)- Ciąg o stałej długości o długości od 1 do 255 znaków (na przykład CHAR (5)), dopełniony spacjami po prawej stronie do określonej długości podczas przechowywania. Określenie długości nie jest wymagane, ale wartość domyślna to 1.

  • VARCHAR(M)- Ciąg o zmiennej długości, zawierający od 1 do 255 znaków. Na przykład VARCHAR (25). Podczas tworzenia pola VARCHAR należy zdefiniować długość.

  • BLOB or TEXT- Pole o maksymalnej długości 65535 znaków. Obiekty BLOB to „duże obiekty binarne”, które służą do przechowywania dużych ilości danych binarnych, takich jak obrazy lub inne typy plików. Pola zdefiniowane jako TEKST również przechowują duże ilości danych. Różnica między nimi polega na tym, że sortowanie i porównania przechowywanych danych sącase sensitive na BLOB-ach i są not case sensitivew polach TEKST. Nie określasz długości za pomocą BLOB lub TEXT.

  • TINYBLOB or TINYTEXT- Kolumna typu BLOB lub TEXT o maksymalnej długości 255 znaków. Nie określasz długości za pomocą TINYBLOB lub TINYTEXT.

  • MEDIUMBLOB or MEDIUMTEXT- Kolumna typu BLOB lub TEXT o maksymalnej długości 16777215 znaków. Nie określasz długości za pomocą MEDIUMBLOB lub MEDIUMTEXT.

  • LONGBLOB or LONGTEXT- Kolumna typu BLOB lub TEXT o maksymalnej długości 4294967295 znaków. Nie określasz długości za pomocą LONGBLOB lub LONGTEXT.

  • ENUM- Wyliczenie, które jest fantazyjnym określeniem listy. Definiując ENUM, tworzysz listę elementów, z których należy wybrać wartość (lub może to być NULL). Na przykład, jeśli chcesz, aby Twoje pole zawierało „A”, „B” lub „C”, należy zdefiniować ENUM jako ENUM („A”, „B”, „C”) i tylko te wartości (lub NULL) mógłby kiedykolwiek wypełnić to pole.

W następnym rozdziale omówimy sposób tworzenia tabel w MySQL.

Na początek polecenie tworzenia tabeli wymaga następujących szczegółów -

  • Nazwa tabeli
  • Nazwy pól
  • Definicje dla każdego pola

Składnia

Oto ogólna składnia SQL do tworzenia tabeli MySQL -

CREATE TABLE table_name (column_name column_type);

Teraz utworzymy następującą tabelę w TUTORIALS Baza danych.

create table tutorials_tbl(
   tutorial_id INT NOT NULL AUTO_INCREMENT,
   tutorial_title VARCHAR(100) NOT NULL,
   tutorial_author VARCHAR(40) NOT NULL,
   submission_date DATE,
   PRIMARY KEY ( tutorial_id )
);

Tutaj kilka elementów wymaga wyjaśnienia -

  • Atrybut pola NOT NULLjest używane, ponieważ nie chcemy, aby to pole miało wartość NULL. Tak więc, jeśli użytkownik spróbuje utworzyć rekord o wartości NULL, MySQL zgłosi błąd.

  • Atrybut pola AUTO_INCREMENT mówi MySQL, aby kontynuował i dodał następną dostępną liczbę do pola id.

  • Słowo kluczowe PRIMARY KEYsłuży do zdefiniowania kolumny jako klucza podstawowego. Aby zdefiniować klucz podstawowy, możesz użyć wielu kolumn oddzielonych przecinkami.

Tworzenie tabel z wiersza polecenia

Utworzenie tabeli MySQL jest łatwe z poziomu zachęty mysql>. Będziesz używać polecenia SQLCREATE TABLE stworzyć tabelę.

Przykład

Oto przykład, który stworzy tutorials_tbl -

root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> CREATE TABLE tutorials_tbl(
   -> tutorial_id INT NOT NULL AUTO_INCREMENT,
   -> tutorial_title VARCHAR(100) NOT NULL,
   -> tutorial_author VARCHAR(40) NOT NULL,
   -> submission_date DATE,
   -> PRIMARY KEY ( tutorial_id )
   -> );
Query OK, 0 rows affected (0.16 sec)
mysql>

NOTE - MySQL nie kończy polecenia, dopóki nie podasz średnika (;) na końcu polecenia SQL.

Tworzenie tabel za pomocą skryptu PHP

Aby utworzyć nową tabelę w dowolnej istniejącej bazie danych, musisz użyć funkcji PHP mysql_query(). Drugi argument przekażesz za pomocą odpowiedniego polecenia SQL, aby utworzyć tabelę.

Przykład

Poniższy program jest przykładem tworzenia tabeli przy użyciu skryptu PHP -

<html>
   <head>
      <title>Creating MySQL Tables</title>
   </head>
   
   <body>
      <?php
         $dbhost = 'localhost:3036'; $dbuser = 'root';
         $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully<br />';
         $sql = "CREATE TABLE tutorials_tbl( ". "tutorial_id INT NOT NULL AUTO_INCREMENT, ". "tutorial_title VARCHAR(100) NOT NULL, ". "tutorial_author VARCHAR(40) NOT NULL, ". "submission_date DATE, ". "PRIMARY KEY ( tutorial_id )); "; mysql_select_db( 'TUTORIALS' ); $retval = mysql_query( $sql, $conn );
         
         if(! $retval ) { die('Could not create table: ' . mysql_error()); } echo "Table created successfully\n"; mysql_close($conn);
      ?>
   </body>
</html>

Usunięcie istniejącej tabeli MySQL jest bardzo łatwe, ale należy zachować ostrożność podczas usuwania istniejącej tabeli, ponieważ utracone dane nie zostaną odzyskane po usunięciu tabeli.

Składnia

Oto ogólna składnia SQL do usuwania tabeli MySQL -

DROP TABLE table_name ;

Usuwanie tabel z wiersza polecenia

Aby usunąć tabele z wiersza poleceń, musimy wykonać polecenie DROP TABLE SQL w wierszu polecenia mysql>.

Przykład

Poniższy program jest przykładem, który usuwa plik tutorials_tbl -

root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DROP TABLE tutorials_tbl
Query OK, 0 rows affected (0.8 sec)
mysql>

Porzucanie tabel za pomocą skryptu PHP

Aby usunąć istniejącą tabelę z dowolnej bazy danych, musisz użyć funkcji PHP mysql_query(). Drugi argument przekażesz z odpowiednim poleceniem SQL, aby usunąć tabelę.

Przykład

<html>
   <head>
      <title>Creating MySQL Tables</title>
   </head>
   
   <body>
      <?php
         $dbhost = 'localhost:3036'; $dbuser = 'root';
         $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully<br />';
         $sql = "DROP TABLE tutorials_tbl"; mysql_select_db( 'TUTORIALS' ); $retval = mysql_query( $sql, $conn );
         
         if(! $retval ) { die('Could not delete table: ' . mysql_error()); } echo "Table deleted successfully\n"; mysql_close($conn);
      ?>
   </body>
</html>

Aby wstawić dane do tabeli MySQL, musisz użyć SQL INSERT INTOKomenda. Możesz wstawić dane do tabeli MySQL, używając znaku zachęty mysql> lub dowolnego skryptu, takiego jak PHP.

Składnia

Oto ogólna składnia SQL polecenia INSERT INTO do wstawiania danych do tabeli MySQL -

INSERT INTO table_name ( field1, field2,...fieldN )
   VALUES
   ( value1, value2,...valueN );

Aby wstawić ciągowe typy danych, należy zachować wszystkie wartości w podwójnych lub pojedynczych cudzysłowach. Na przykład"value".

Wstawianie danych z wiersza polecenia

Aby wstawić dane z wiersza poleceń, użyjemy polecenia SQL INSERT INTO, aby wstawić dane do tabeli MySQL tutorials_tbl.

Przykład

Poniższy przykład utworzy 3 rekordy w tutorials_tbl stół -

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed

mysql> INSERT INTO tutorials_tbl 
   ->(tutorial_title, tutorial_author, submission_date)
   ->VALUES
   ->("Learn PHP", "John Poul", NOW());
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO tutorials_tbl
   ->(tutorial_title, tutorial_author, submission_date)
   ->VALUES
   ->("Learn MySQL", "Abdul S", NOW());
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO tutorials_tbl
   ->(tutorial_title, tutorial_author, submission_date)
   ->VALUES
   ->("JAVA Tutorial", "Sanjay", '2007-05-06');
Query OK, 1 row affected (0.01 sec)
mysql>

NOTE- Należy pamiętać, że wszystkie znaki strzałek (->) nie są częścią polecenia SQL. Wskazują nowy wiersz i są tworzone automatycznie przez znak zachęty MySQL, podczas naciskania klawisza Enter bez podawania średnika na końcu każdego wiersza polecenia.

W powyższym przykładzie nie podaliśmy tutorial_id, ponieważ w momencie tworzenia tabeli podawaliśmy opcję AUTO_INCREMENT dla tego pola. Dlatego MySQL dba o automatyczne wstawianie tych identyfikatorów. Tutaj,NOW() to funkcja MySQL, która zwraca bieżącą datę i godzinę.

Wstawianie danych za pomocą skryptu PHP

Możesz użyć tego samego polecenia SQL INSERT INTO w funkcji PHP mysql_query() aby wstawić dane do tabeli MySQL.

Przykład

Ten przykład weźmie trzy parametry od użytkownika i wstawi je do tabeli MySQL -

<html>

   <head>
      <title>Add New Record in MySQL Database</title>
   </head>

   <body>
      <?php
         if(isset($_POST['add'])) { $dbhost = 'localhost:3036';
            $dbuser = 'root'; $dbpass = 'rootpassword';
            $conn = mysql_connect($dbhost, $dbuser, $dbpass);
         
            if(! $conn ) { die('Could not connect: ' . mysql_error()); } if(! get_magic_quotes_gpc() ) { $tutorial_title = addslashes ($_POST['tutorial_title']); $tutorial_author = addslashes ($_POST['tutorial_author']); } else { $tutorial_title = $_POST['tutorial_title']; $tutorial_author = $_POST['tutorial_author']; } $submission_date = $_POST['submission_date']; $sql = "INSERT INTO tutorials_tbl ".
               "(tutorial_title,tutorial_author, submission_date) "."VALUES ".
               "('$tutorial_title','$tutorial_author','$submission_date')"; mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
         
            if(! $retval ) { die('Could not enter data: ' . mysql_error()); } echo "Entered data successfully\n"; mysql_close($conn);
         } else {
      ?>
   
      <form method = "post" action = "<?php $_PHP_SELF ?>">
         <table width = "600" border = "0" cellspacing = "1" cellpadding = "2">
            <tr>
               <td width = "250">Tutorial Title</td>
               <td>
                  <input name = "tutorial_title" type = "text" id = "tutorial_title">
               </td>
            </tr>
         
            <tr>
               <td width = "250">Tutorial Author</td>
               <td>
                  <input name = "tutorial_author" type = "text" id = "tutorial_author">
               </td>
            </tr>
         
            <tr>
               <td width = "250">Submission Date [   yyyy-mm-dd ]</td>
               <td>
                  <input name = "submission_date" type = "text" id = "submission_date">
               </td>
            </tr>
      
            <tr>
               <td width = "250"> </td>
               <td> </td>
            </tr>
         
            <tr>
               <td width = "250"> </td>
               <td>
                  <input name = "add" type = "submit" id = "add"  value = "Add Tutorial">
               </td>
            </tr>
         </table>
      </form>
   <?php
      }
   ?>
   </body>
</html>

Podczas wstawiania danych najlepiej jest skorzystać z funkcji get_magic_quotes_gpc()aby sprawdzić, czy bieżąca konfiguracja dla magicznego cudzysłowu jest ustawiona, czy nie. Jeśli ta funkcja zwróci false, użyj funkcjiaddslashes() aby dodać ukośniki przed cudzysłowami.

Możesz umieścić wiele walidacji, aby sprawdzić, czy wprowadzone dane są poprawne, czy nie, i możesz podjąć odpowiednie działania.

SQL SELECTpolecenie służy do pobierania danych z bazy danych MySQL. Możesz użyć tego polecenia w zachęcie mysql>, a także w dowolnym skrypcie, takim jak PHP.

Składnia

Oto ogólna składnia SQL polecenia SELECT do pobierania danych z tabeli MySQL -

SELECT field1, field2,...fieldN 
FROM table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]
  • Możesz użyć jednej lub więcej tabel oddzielonych przecinkami, aby uwzględnić różne warunki za pomocą klauzuli WHERE, ale klauzula WHERE jest opcjonalną częścią polecenia SELECT.

  • Możesz pobrać jedno lub więcej pól za pomocą jednego polecenia SELECT.

  • W miejscu pól można podać gwiazdkę (*). W takim przypadku SELECT zwróci wszystkie pola.

  • Możesz określić dowolny warunek za pomocą klauzuli WHERE.

  • Możesz określić odsunięcie za pomocą OFFSETskąd SELECT zacznie zwracać rekordy. Domyślnie przesunięcie zaczyna się od zera.

  • Możesz ograniczyć liczbę zwrotów za pomocą LIMIT atrybut.

Pobieranie danych z wiersza polecenia

Spowoduje to użycie polecenia SQL SELECT do pobrania danych z tabeli MySQL tutorials_tbl.

Przykład

Poniższy przykład zwróci wszystkie rekordy z pliku tutorials_tbl stół -

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl 
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
|           1 | Learn PHP      | John Poul       | 2007-05-21      |
|           2 | Learn MySQL    | Abdul S         | 2007-05-21      |
|           3 | JAVA Tutorial  | Sanjay          | 2007-05-21      |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.01 sec)

mysql>

Pobieranie danych za pomocą skryptu PHP

Możesz użyć tego samego polecenia SQL SELECT w funkcji PHP mysql_query(). Ta funkcja jest używana do wykonania polecenia SQL, a następnie innej funkcji PHPmysql_fetch_array()można użyć do pobrania wszystkich wybranych danych. Ta funkcja zwraca wiersz jako tablicę asocjacyjną, tablicę numeryczną lub obie. Ta funkcja zwraca FALSE, jeśli nie ma więcej wierszy.

Poniższy program jest prostym przykładem, który pokaże, jak pobrać / wyświetlić rekordy z tutorials_tbl stół.

Przykład

Poniższy blok kodu wyświetli wszystkie rekordy z tabeli tutorials_tbl.

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root'; $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl';

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn ); if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }
   
   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ".
         "Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ".
         "--------------------------------<br>";
   } 
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

Zawartość wierszy jest przypisywana do zmiennej $ row, a wartości w tym wierszu są następnie drukowane.

NOTE - Zawsze pamiętaj o umieszczeniu nawiasów klamrowych, gdy chcesz wstawić wartość tablicy bezpośrednio do ciągu.

W powyższym przykładzie stała MYSQL_ASSOC jest używany jako drugi argument funkcji PHP mysql_fetch_array(), dzięki czemu zwraca wiersz jako tablicę asocjacyjną. Dzięki tablicy asocjacyjnej możesz uzyskać dostęp do pola, używając jego nazwy zamiast indeksu.

PHP udostępnia inną funkcję o nazwie mysql_fetch_assoc(), co również zwraca wiersz jako tablicę asocjacyjną.

Przykład

Poniższy przykład przedstawia wszystkie rekordy z tabeli tutorial_tbl przy użyciu funkcji mysql_fetch_assoc ().

<?php
   $dbhost = 'localhost:3036'; $dbuser = 'root';
   $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }
   
   $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
   
   if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_assoc($retval)) { echo "Tutorial ID :{$row['tutorial_id']}  <br> ".
         "Title: {$row['tutorial_title']} <br> ". "Author: {$row['tutorial_author']} <br> ".
         "Submission Date : {$row['submission_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn);
?>

Możesz także użyć stałej MYSQL_NUMjako drugi argument funkcji PHP mysql_fetch_array (). Spowoduje to, że funkcja zwróci tablicę z indeksem liczbowym.

Przykład

Wypróbuj poniższy przykład, aby wyświetlić wszystkie rekordy z tabeli tutorials_tbl przy użyciu argumentu MYSQL_NUM.

<?php
   $dbhost = 'localhost:3036'; $dbuser = 'root';
   $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }
   
   $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
   
   if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Tutorial ID :{$row[0]}  <br> ".
         "Title: {$row[1]} <br> ". "Author: {$row[2]} <br> ".
         "Submission Date : {$row[3]} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn);
?>

Wszystkie powyższe trzy przykłady dadzą ten sam wynik.

Uwalnianie pamięci

Dobrą praktyką jest zwolnienie pamięci kursora na końcu każdej instrukcji SELECT. Można to zrobić za pomocą funkcji PHPmysql_free_result(). Poniższy program jest przykładem pokazującym, jak powinien być używany.

Przykład

Wypróbuj następujący przykład -

<?php
   $dbhost = 'localhost:3036'; $dbuser = 'root';
   $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }
   
   $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
   
   if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Tutorial ID :{$row[0]}  <br> ".
         "Title: {$row[1]} <br> ". "Author: {$row[2]} <br> ".
         "Submission Date : {$row[3]} <br> ". "--------------------------------<br>"; } mysql_free_result($retval);
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

Podczas pobierania danych możesz napisać tak złożony kod, jak chcesz, ale procedura pozostanie taka sama, jak wspomniano powyżej.

Widzieliśmy SQL SELECTpolecenie pobierania danych z tabeli MySQL. Możemy użyć klauzuli warunkowej zwanejWHERE Clauseaby odfiltrować wyniki. Używając tej klauzuli WHERE, możemy określić kryteria wyboru, aby wybrać wymagane rekordy z tabeli.

Składnia

Poniższy blok kodu ma ogólną składnię SQL polecenia SELECT z klauzulą ​​WHERE do pobierania danych z tabeli MySQL -

SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
  • Możesz użyć jednej lub więcej tabel oddzielonych przecinkami, aby uwzględnić różne warunki za pomocą klauzuli WHERE, ale klauzula WHERE jest opcjonalną częścią polecenia SELECT.

  • Możesz określić dowolny warunek za pomocą klauzuli WHERE.

  • Możesz określić więcej niż jeden warunek za pomocą AND albo OR operatorzy.

  • Klauzuli WHERE można używać wraz z poleceniem DELETE lub UPDATE SQL również w celu określenia warunku.

Plik WHERE klauzula działa jak if conditionw dowolnym języku programowania. Ta klauzula służy do porównania podanej wartości z wartością pola dostępną w tabeli MySQL. Jeśli podana wartość z zewnątrz jest równa dostępnej wartości pola w tabeli MySQL, to zwraca ten wiersz.

Oto lista operatorów, których można używać z WHERE klauzula.

Załóżmy, że pole A ma 10, a pole B 20, a następnie -

Operator Opis Przykład
= Sprawdza, czy wartości dwóch operandów są równe, czy nie. Jeśli tak, warunek staje się prawdziwy. (A = B) nie jest prawdą.
! = Sprawdza, czy wartości dwóch operandów są równe, czy nie. Jeśli wartości nie są równe, warunek staje się prawdziwy. (A! = B) jest prawdą.
> Sprawdza, czy wartość lewego operandu jest większa niż wartość prawego operandu, jeśli tak, warunek staje się prawdziwy. (A> B) nie jest prawdą.
< Sprawdza, czy wartość lewego operandu jest mniejsza niż wartość prawego operandu. Jeśli tak, warunek staje się prawdziwy. (A <B) jest prawdą.
> = Sprawdza, czy wartość lewego operandu jest większa lub równa wartości prawego operandu. Jeśli tak, warunek staje się prawdziwy. (A> = B) nie jest prawdą.
<= Sprawdza, czy wartość lewego operandu jest mniejsza lub równa wartości prawego operandu, jeśli tak, warunek staje się prawdziwy. (A <= B) jest prawdą.

Klauzula WHERE jest bardzo przydatna, gdy chcesz pobrać wybrane wiersze z tabeli, zwłaszcza gdy używasz MySQL Join. Połączenia są omówione w innym rozdziale.

Powszechną praktyką jest wyszukiwanie rekordów przy użyciu rozszerzenia Primary Key aby przyspieszyć wyszukiwanie.

Jeśli podany warunek nie pasuje do żadnego rekordu w tabeli, zapytanie nie zwróci żadnego wiersza.

Pobieranie danych z wiersza polecenia

Spowoduje to użycie polecenia SQL SELECT z klauzulą ​​WHERE w celu pobrania wybranych danych z tabeli MySQL - tutorials_tbl.

Przykład

Poniższy przykład zwróci wszystkie rekordy z pliku tutorials_tbl tabela, której autorem jest nazwisko Sanjay.

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl WHERE tutorial_author = 'Sanjay';
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
|      3      | JAVA Tutorial  |      Sanjay     |    2007-05-21   |      
+-------------+----------------+-----------------+-----------------+
1 rows in set (0.01 sec)

mysql>

Chyba że wykonasz LIKEporównanie w ciągu, porównanie nie jest rozróżniane. W wyszukiwaniu można rozróżniać wielkość liter, używając rozszerzeniaBINARY słowo kluczowe w następujący sposób -

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl \
   WHERE BINARY tutorial_author = 'sanjay';
Empty set (0.02 sec)

mysql>

Pobieranie danych za pomocą skryptu PHP

Możesz użyć tego samego polecenia SQL SELECT z WHERE CLAUSE w funkcji PHP mysql_query(). Ta funkcja jest używana do wykonania polecenia SQL, a później innej funkcji PHPmysql_fetch_array()można użyć do pobrania wszystkich wybranych danych. Ta funkcja zwraca wiersz jako tablicę asocjacyjną, tablicę numeryczną lub obie. Ta funkcja zwraca FALSE, jeśli nie ma więcej wierszy.

Przykład

Poniższy przykład zwróci wszystkie rekordy z pliku tutorials_tbl tabela, której autorem jest nazwisko Sanjay -

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root'; $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title, 
      tutorial_author, submission_date
      FROM tutorials_tbl
      WHERE tutorial_author = "Sanjay"';

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn ); if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ".
      "Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ".
      "--------------------------------<br>";
   } 

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

Może zaistnieć potrzeba zmodyfikowania istniejących danych w tabeli MySQL. Możesz to zrobić za pomocą SQLUPDATEKomenda. Spowoduje to zmodyfikowanie dowolnej wartości pola dowolnej tabeli MySQL.

Składnia

Poniższy blok kodu ma ogólną składnię SQL polecenia UPDATE do modyfikacji danych w tabeli MySQL -

UPDATE table_name SET field1 = new-value1, field2 = new-value2
[WHERE Clause]
  • Możesz zaktualizować jedno lub więcej pól łącznie.
  • Możesz określić dowolny warunek za pomocą klauzuli WHERE.
  • Możesz aktualizować wartości w jednej tabeli naraz.

Klauzula WHERE jest bardzo przydatna, gdy chcesz zaktualizować wybrane wiersze w tabeli.

Aktualizowanie danych z wiersza polecenia

Spowoduje to użycie polecenia SQL UPDATE z klauzulą ​​WHERE w celu zaktualizowania wybranych danych w tabeli MySQL tutorials_tbl.

Przykład

Poniższy przykład zaktualizuje tutorial_title pole dla rekordu o wartości tutorial_id równej 3.

root@host# mysql -u root -p password;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> UPDATE tutorials_tbl 
   -> SET tutorial_title = 'Learning JAVA' 
   -> WHERE tutorial_id = 3;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>

Aktualizacja danych za pomocą skryptu PHP

Możesz użyć polecenia SQL UPDATE z lub bez WHERE CLAUSE w funkcji PHP - mysql_query(). Ta funkcja wykona polecenie SQL w podobny sposób, w jaki jest wykonywana po znaku zachęty mysql>.

Przykład

Poniższy przykład, aby zaktualizować tutorial_title pole dla rekordu z tutorial_id równym 3.

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root'; $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'UPDATE tutorials_tbl
      SET tutorial_title="Learning JAVA"
      WHERE tutorial_id=3';

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn ); if(! $retval ) {
      die('Could not update data: ' . mysql_error());
   }
   echo "Updated data successfully\n";
   mysql_close($conn);
?>

Jeśli chcesz usunąć rekord z dowolnej tabeli MySQL, możesz użyć polecenia SQL DELETE FROM. Możesz użyć tego polecenia w wierszu polecenia mysql>, a także w dowolnym skrypcie, takim jak PHP.

Składnia

Poniższy blok kodu zawiera ogólną składnię SQL polecenia DELETE służącą do usuwania danych z tabeli MySQL.

DELETE FROM table_name [WHERE Clause]
  • Jeśli klauzula WHERE nie zostanie określona, ​​wszystkie rekordy zostaną usunięte z danej tabeli MySQL.

  • Możesz określić dowolny warunek za pomocą klauzuli WHERE.

  • Możesz usuwać rekordy z jednej tabeli naraz.

Klauzula WHERE jest bardzo przydatna, gdy chcesz usunąć wybrane wiersze w tabeli.

Usuwanie danych z wiersza polecenia

Spowoduje to użycie polecenia SQL DELETE z klauzulą ​​WHERE w celu usunięcia wybranych danych z tabeli MySQL - tutorials_tbl.

Przykład

Poniższy przykład usunie rekord z tutorial_tbl, którego tutorial_id to 3.

root@host# mysql -u root -p password;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> DELETE FROM tutorials_tbl WHERE tutorial_id=3;
Query OK, 1 row affected (0.23 sec)

mysql>

Usuwanie danych za pomocą skryptu PHP

Możesz użyć polecenia SQL DELETE z lub bez WHERE CLAUSE w funkcji PHP - mysql_query(). Ta funkcja wykona polecenie SQL w taki sam sposób, jak jest wykonywane w wierszu polecenia mysql>.

Przykład

Wypróbuj poniższy przykład, aby usunąć rekord z tutorial_tbl, którego tutorial_id to 3.

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root'; $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'DELETE FROM tutorials_tbl WHERE tutorial_id = 3';

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn ); if(! $retval ) {
      die('Could not delete data: ' . mysql_error());
   }
   echo "Deleted data successfully\n";
   mysql_close($conn);
?>

Widzieliśmy SQL SELECTpolecenie pobierania danych z tabeli MySQL. Możemy również użyć klauzuli warunkowej zwanej jakoWHERE klauzulę, aby wybrać wymagane rekordy.

Klauzula WHERE ze znakiem „równości” (=) działa dobrze, gdy chcemy uzyskać dokładne dopasowanie. Na przykład "tutorial_author = 'Sanjay'". Ale może istnieć wymóg, w którym będziemy chcieli odfiltrować wszystkie wyniki, w których nazwa tutorial_author powinna zawierać „jay”. Można to zrobić za pomocąSQL LIKE Clause wraz z klauzulą ​​WHERE.

Jeśli klauzula SQL LIKE jest używana wraz ze znakiem%, to będzie działać jak znak meta (*), jak w systemie UNIX, wyświetlając wszystkie pliki lub katalogi w wierszu polecenia. Bez znaku% klauzula LIKE jest taka sama jakequal to podpisać wraz z klauzulą ​​WHERE.

Składnia

Poniższy blok kodu zawiera ogólną składnię SQL polecenia SELECT wraz z klauzulą ​​LIKE do pobierania danych z tabeli MySQL.

SELECT field1, field2,...fieldN table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
  • Możesz określić dowolny warunek za pomocą klauzuli WHERE.

  • Możesz użyć klauzuli LIKE razem z klauzulą ​​WHERE.

  • Możesz użyć klauzuli LIKE zamiast equals to znak.

  • Gdy LIKE zostanie użyte wraz ze znakiem%, będzie działać jak wyszukiwanie metaznaków.

  • Możesz określić więcej niż jeden warunek za pomocą AND lub OR operatorzy.

  • Klauzula WHERE ... LIKE może być używana wraz z poleceniem DELETE lub UPDATE SQL również w celu określenia warunku.

Korzystanie z klauzuli LIKE w wierszu polecenia

Spowoduje to użycie polecenia SQL SELECT z klauzulą ​​WHERE ... LIKE w celu pobrania wybranych danych z tabeli MySQL - tutorials_tbl.

Przykład

Poniższy przykład zwróci wszystkie rekordy z pliku tutorials_tbl tabela, dla której nazwisko autora kończy się na jay -

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl 
   -> WHERE tutorial_author LIKE '%jay';
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
|      3      |  JAVA Tutorial |     Sanjay      |    2007-05-21   |   
+-------------+----------------+-----------------+-----------------+
1 rows in set (0.01 sec)

mysql>

Używanie klauzuli LIKE wewnątrz skryptu PHP

Możesz użyć podobnej składni klauzuli WHERE ... LIKE w funkcji PHP - mysql_query(). Ta funkcja jest używana do wykonania polecenia SQL, a później innej funkcji PHP -mysql_fetch_array() można użyć do pobrania wszystkich wybranych danych, jeśli klauzula WHERE ... LIKE jest używana wraz z poleceniem SELECT.

Ale jeśli klauzula WHERE ... LIKE jest używana z poleceniem DELETE lub UPDATE, wówczas nie jest wymagane żadne dalsze wywołanie funkcji PHP.

Przykład

Wypróbuj poniższy przykład, aby zwrócić wszystkie rekordy z tutorials_tbl tabela, dla której zawiera nazwisko autora jay -

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root'; $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title, 
      tutorial_author, submission_date
      FROM tutorials_tbl
      WHERE tutorial_author LIKE "%jay%"';

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn ); if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ".
         "Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ".
         "--------------------------------<br>";
   } 
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

Widzieliśmy SQL SELECTpolecenie pobierania danych z tabeli MySQL. Gdy wybierzesz wiersze, serwer MySQL może zwrócić je w dowolnej kolejności, chyba że zalecisz inaczej, mówiąc, jak posortować wynik. Ale możesz posortować zestaw wyników, dodając plikORDER BY klauzula, która nazywa kolumnę lub kolumny, które chcesz posortować.

Składnia

Poniższy blok kodu to ogólna składnia SQL polecenia SELECT wraz z klauzulą ​​ORDER BY do sortowania danych z tabeli MySQL.

SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
  • Możesz posortować zwrócony wynik według dowolnego pola, jeśli to pole jest wyszczególnione.

  • Możesz sortować wynik według więcej niż jednego pola.

  • Możesz użyć słowa kluczowego ASC lub DESC, aby uzyskać wynik w porządku rosnącym lub malejącym. Domyślnie jest to kolejność rosnąca.

  • Aby umieścić warunek, możesz użyć klauzuli WHERE ... LIKE w zwykły sposób.

Korzystanie z klauzuli ORDER BY w wierszu polecenia

Spowoduje to użycie polecenia SQL SELECT z rozszerzeniem ORDER BY klauzula do pobierania danych z tabeli MySQL - tutorials_tbl.

Przykład

Wypróbuj poniższy przykład, który zwraca wynik w kolejności rosnącej.

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl ORDER BY tutorial_author ASC
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
|      2      |  Learn MySQL   |     Abdul S     |    2007-05-24   |   
|      1      |   Learn PHP    |    John Poul    |    2007-05-24   |   
|      3      | JAVA Tutorial  |     Sanjay      |    2007-05-06   |   
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.42 sec)

mysql>

Sprawdź wszystkie nazwiska autorów, które są wymienione w kolejności rosnącej.

Używanie klauzuli ORDER BY wewnątrz skryptu PHP

Możesz użyć podobnej składni klauzuli ORDER BY w funkcji PHP - mysql_query(). Ta funkcja jest używana do wykonania polecenia SQL, a później innej funkcji PHPmysql_fetch_array() można użyć do pobrania wszystkich wybranych danych.

Przykład

Wypróbuj następujący przykład, który zwraca wynik w kolejności malejącej według autorów samouczka.

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root'; $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title, 
      tutorial_author, submission_date
      FROM tutorials_tbl
      ORDER BY  tutorial_author DESC';

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn ); if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ".
         "Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ".
         "--------------------------------<br>";
   } 
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

W poprzednich rozdziałach otrzymywaliśmy dane z jednej tabeli naraz. Jest to wystarczające do prostych prób, ale w większości rzeczywistych zastosowań MySQL często będziesz musiał pobrać dane z wielu tabel w jednym zapytaniu.

Możesz użyć wielu tabel w pojedynczym zapytaniu SQL. Łączenie się w MySQL odnosi się do rozbicia dwóch lub więcej tabel w jedną.

Możesz użyć JOINS w instrukcjach SELECT, UPDATE i DELETE, aby połączyć tabele MySQL. Zobaczymy przykład LEFT JOIN, który różni się również od prostego MySQL JOIN.

Korzystanie z połączeń w wierszu polecenia

Załóżmy, że mamy dwie tabele tcount_tbl i tutorials_tbl, w TUTORIALACH. Teraz spójrz na przykłady podane poniżej -

Przykład

Następujące przykłady -

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * FROM tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|      mahran     |       20       |     
|      mahnaz     |      NULL      |        
|       Jen       |      NULL      |          
|      Gill       |       20       |          
|    John Poul    |        1       |      
|     Sanjay      |        1       |        
+-----------------+----------------+
6 rows in set (0.01 sec)
mysql> SELECT * from tutorials_tbl;
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
|      1      |  Learn PHP     |     John Poul   |    2007-05-24   |   
|      2      |  Learn MySQL   |      Abdul S    |    2007-05-24   |   
|      3      | JAVA Tutorial  |      Sanjay     |    2007-05-06   |   
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.00 sec)
mysql>

Teraz możemy napisać zapytanie SQL, aby połączyć te dwie tabele. To zapytanie wybierze wszystkich autorów z tabelitutorials_tbl i wybierze odpowiednią liczbę samouczków z tcount_tbl.

mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
   -> FROM tutorials_tbl a, tcount_tbl b
   -> WHERE a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
|      1      |    John Poul    |        1       |
|      3      |     Sanjay      |        1       |
+-------------+-----------------+----------------+
2 rows in set (0.01 sec)
mysql>

Używanie łączeń w skrypcie PHP

Możesz użyć dowolnego z wyżej wymienionych zapytań SQL w skrypcie PHP. Musisz tylko przekazać zapytanie SQL do funkcji PHPmysql_query() a następnie pobierzesz wyniki w zwykły sposób.

Przykład

Poniższy przykład -

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root'; $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
      FROM tutorials_tbl a, tcount_tbl b
      WHERE a.tutorial_author = b.tutorial_author';

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn ); if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Author:{$row['tutorial_author']} <br> ". "Count: {$row['tutorial_count']} <br> ".
         "Tutorial ID: {$row['tutorial_id']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn);
?>

MySQL LEWY DOŁĄCZ

Łączenie lewe MySQL różni się od łączenia prostego. LEWE POŁĄCZENIE MySQL daje dodatkowe uwagi tabeli po lewej stronie.

Jeśli zrobię LEFT JOIN, Otrzymuję wszystkie rekordy, które pasują w ten sam sposób i DODATKOWO otrzymuję dodatkowy rekord dla każdego niedopasowanego rekordu w lewej tabeli sprzężenia: zapewniając w ten sposób (w moim przykładzie), że każdy AUTOR otrzyma wzmiankę.

Przykład

Wypróbuj poniższy przykład, aby zrozumieć LEFT JOIN.

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
   -> FROM tutorials_tbl a LEFT JOIN tcount_tbl b
   -> ON a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
|      1      |    John Poul    |       1        |
|      2      |     Abdul S     |      NULL      |
|      3      |     Sanjay      |       1        |
+-------------+-----------------+----------------+
3 rows in set (0.02 sec)

Aby zapoznać się z JOINS, musisz poćwiczyć więcej. Jest to nieco skomplikowana koncepcja w MySQL / SQL i stanie się jaśniejsza podczas robienia prawdziwych przykładów.

Widzieliśmy SQL SELECT polecenie wraz z WHERE klauzula do pobierania danych z tabeli MySQL, ale gdy próbujemy podać warunek, który porównuje wartość pola lub kolumny z NULL, nie działa prawidłowo.

Aby poradzić sobie z taką sytuacją, MySQL udostępnia trzy operatory -

  • IS NULL - Ten operator zwraca prawdę, jeśli wartość kolumny jest równa NULL.

  • IS NOT NULL - Ten operator zwraca prawdę, jeśli wartość kolumny nie jest równa NULL.

  • <=> - Ten operator porównuje wartości, które (w przeciwieństwie do operatora =) są prawdziwe nawet dla dwóch wartości NULL.

Warunki dotyczące NULL są szczególne. Nie możesz użyć =NULL lub! = NULLaby szukać wartości NULL w kolumnach. Takie porównania zawsze zawodzą, ponieważ nie można stwierdzić, czy są prawdziwe, czy nie. Czasami nawet NULL = NULL zawodzi.

Aby wyszukać kolumny, które mają lub nie mają wartości NULL, użyj IS NULL lub IS NOT NULL.

Używanie wartości NULL w wierszu polecenia

Załóżmy, że istnieje tabela o nazwie tcount_tbl w bazie TUTORIALS i zawiera dwie kolumny, a mianowicie tutorial_author i tutorial_count, gdzie NULL tutorial_count wskazuje, że wartość jest nieznana.

Przykład

Wypróbuj następujące przykłady -

root@host# mysql -u root -p password;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> create table tcount_tbl
   -> (
   -> tutorial_author varchar(40) NOT NULL,
   -> tutorial_count  INT
   -> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('mahran', 20);

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('mahnaz', NULL);

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('Jen', NULL);

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('Gill', 20);

mysql> SELECT * from tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|     mahran      |       20       |
|     mahnaz      |      NULL      |
|      Jen        |      NULL      |
|     Gill        |       20       |
+-----------------+----------------+
4 rows in set (0.00 sec)

mysql>

Możesz to zobaczyć = i != nie działają z wartościami NULL w następujący sposób -

mysql> SELECT * FROM tcount_tbl WHERE tutorial_count = NULL;
Empty set (0.00 sec)

mysql> SELECT * FROM tcount_tbl WHERE tutorial_count != NULL;
Empty set (0.01 sec)

Aby znaleźć rekordy, w których kolumna tutorial_count ma wartość NULL lub nie, zapytania należy zapisać w sposób pokazany w poniższym programie.

mysql> SELECT * FROM tcount_tbl 
   -> WHERE tutorial_count IS NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|     mahnaz      |      NULL      |
|      Jen        |      NULL      |
+-----------------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT * from tcount_tbl 
   -> WHERE tutorial_count IS NOT NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|     mahran      |       20       |
|     Gill        |       20       |
+-----------------+----------------+
2 rows in set (0.00 sec)

Obsługa wartości NULL w skrypcie PHP

Możesz użyć if...else warunek przygotowania zapytania na podstawie wartości NULL.

Przykład

Poniższy przykład przyjmuje tutorial_count z zewnątrz, a następnie porównuje ją z wartością dostępną w tabeli.

<?php
   $dbhost = 'localhost:3036'; $dbuser = 'root';
   $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   if( isset($tutorial_count )) { $sql = 'SELECT tutorial_author, tutorial_count
         FROM  tcount_tbl
         WHERE tutorial_count = $tutorial_count'; } else { $sql = 'SELECT tutorial_author, tutorial_count
         FROM  tcount_tbl
         WHERE tutorial_count IS $tutorial_count'; } mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
   
   if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Author:{$row['tutorial_author']}  <br> ".
         "Count: {$row['tutorial_count']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn);
?>

Widziałeś dopasowywanie wzorców MySQL z LIKE ...%. MySQL obsługuje inny typ operacji dopasowywania wzorców w oparciu o wyrażenia regularne i rozszerzenieREGEXPoperator. Jeśli znasz PHP lub PERL, to jest to bardzo łatwe do zrozumienia, ponieważ to dopasowanie jest takie samo, jak w przypadku skryptów dla wyrażeń regularnych.

Poniżej znajduje się tabela wzorców, których można używać razem z REGEXP operator.

Wzór Jaki wzór pasuje
^ Początek ciągu
$ Koniec łańcucha
. Dowolny pojedynczy znak
[…] Dowolny znak wymieniony w nawiasach kwadratowych
[^ ...] Dowolny znak niewymieniony w nawiasach kwadratowych
p1 | p2 | p3 Alternacja; pasuje do dowolnego ze wzorów p1, p2 lub p3
* Zero lub więcej wystąpień poprzedniego elementu
+ Co najmniej jedno wystąpienie poprzedniego elementu
{n} n wystąpień elementu poprzedzającego
{m, n} m do n wystąpień elementu poprzedzającego

Przykłady

Teraz w oparciu o powyższą tabelę możesz ustawić różne typy zapytań SQL, aby spełnić Twoje wymagania. Tutaj wymieniam kilka dla twojego zrozumienia.

Rozważmy, że mamy tabelę o nazwie person_tbl i ma pole zwane name -

Zapytanie, aby znaleźć wszystkie nazwy zaczynające się od 'st' -

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

Zapytanie, aby znaleźć wszystkie nazwy kończące się na 'ok' -

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

Zapytanie, aby znaleźć wszystkie nazwy, które zawierają 'mar' -

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

Zapytanie, aby znaleźć wszystkie imiona zaczynające się od samogłoski, a kończące się na 'ok' -

mysql> SELECT FirstName FROM intque.person_tbl WHERE FirstName REGEXP '^[aeiou].*ok$';

Transakcja to sekwencyjna grupa operacji manipulowania bazą danych, która jest wykonywana tak, jakby była pojedynczą jednostką pracy. Innymi słowy, transakcja nigdy nie zostanie zakończona, chyba że każda pojedyncza operacja w grupie zakończy się sukcesem. Jeśli jakakolwiek operacja w ramach transakcji nie powiedzie się, cała transakcja zakończy się niepowodzeniem.

W praktyce wiele zapytań SQL połączysz w grupę i wykonasz je wszystkie razem jako część transakcji.

Właściwości transakcji

Transakcje mają następujące cztery standardowe właściwości, zwykle określane akronimem ACID -

  • Atomicity- Zapewnia to pomyślne zakończenie wszystkich operacji w jednostce pracy; w przeciwnym razie transakcja jest przerywana w momencie niepowodzenia, a poprzednie operacje są przywracane do poprzedniego stanu.

  • Consistency - Zapewnia to, że baza danych prawidłowo zmienia stany po pomyślnym zatwierdzeniu transakcji.

  • Isolation - Dzięki temu transakcje mogą działać niezależnie i wzajemnie się przejrzyste.

  • Durability - Gwarantuje to, że wynik lub skutek zatwierdzonej transakcji będzie się utrzymywał w przypadku awarii systemu.

W MySQL transakcje rozpoczynają się od wyciągu BEGIN WORK i zakończ albo COMMIT lub a ROLLBACKkomunikat. Większość transakcji stanowią polecenia SQL znajdujące się między instrukcją początkową i końcową.

COMMIT i ROLLBACK

Te dwa słowa kluczowe Commit i Rollback są używane głównie do transakcji MySQL.

  • Po pomyślnym zakończeniu transakcji należy wydać komendę COMMIT, aby zmiany we wszystkich zaangażowanych tabelach odniosły skutek.

  • W przypadku niepowodzenia należy wydać komendę ROLLBACK, aby przywrócić poprzedni stan każdej tabeli, do której odwołuje się transakcja.

Możesz kontrolować zachowanie transakcji, ustawiając zmienną sesji o nazwie AUTOCOMMIT. Jeśli AUTOCOMMIT ma wartość 1 (wartość domyślna), to każda instrukcja SQL (w ramach transakcji lub nie) jest uważana za transakcję zakończoną i domyślnie zatwierdzana po jej zakończeniu.

Gdy AUTOCOMMIT jest ustawiony na 0, wydając SET AUTOCOMMIT = 0 polecenie, kolejna seria instrukcji zachowuje się jak transakcja i żadne działania nie są wykonywane, dopóki nie zostanie wydana jawna instrukcja COMMIT.

Możesz wykonać te polecenia SQL w PHP przy użyciu rozszerzenia mysql_query() funkcjonować.

Ogólny przykład transakcji

Ta sekwencja zdarzeń jest niezależna od używanego języka programowania. Ścieżkę logiczną można utworzyć w dowolnym języku używanym do tworzenia aplikacji.

Możesz wykonać te polecenia SQL w PHP przy użyciu rozszerzenia mysql_query() funkcjonować.

  • Rozpocznij transakcję, wydając polecenie SQL BEGIN WORK.

  • Wydaj co najmniej jedno polecenie SQL, takie jak SELECT, INSERT, UPDATE lub DELETE.

  • Sprawdź, czy nie ma błędu i wszystko jest zgodne z wymaganiami.

  • Jeśli wystąpi jakikolwiek błąd, wydaj polecenie ROLLBACK, w przeciwnym razie wydaj polecenie COMMIT.

Typy tabel bezpiecznych dla transakcji w MySQL

Nie możesz używać transakcji bezpośrednio, ale w pewnych wyjątkach możesz. Jednak nie są one bezpieczne i gwarantowane. Jeśli planujesz używać transakcji w programowaniu MySQL, musisz stworzyć swoje tabele w specjalny sposób. Istnieje wiele typów tabel, które obsługują transakcje, ale najpopularniejszym jestInnoDB.

Obsługa tabel InnoDB wymaga określonego parametru kompilacji podczas kompilowania MySQL ze źródła. Jeśli Twoja wersja MySQL nie obsługuje InnoDB, poproś swojego dostawcę usług internetowych o zbudowanie wersji MySQL z obsługą typów tabel InnoDB lub pobierz i zainstalujMySQL-Max Binary Distribution dla Windows lub Linux / UNIX i pracuj z typem tabeli w środowisku programistycznym.

Jeśli Twoja instalacja MySQL obsługuje tabele InnoDB, po prostu dodaj plik TYPE = InnoDB definicja do instrukcji tworzenia tabeli.

Na przykład poniższy kod tworzy tabelę InnoDB o nazwie tcount_tbl -

root@host# mysql -u root -p password;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> create table tcount_tbl
   -> (
   -> tutorial_author varchar(40) NOT NULL,
   -> tutorial_count  INT
   -> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.05 sec)

Aby uzyskać więcej informacji na temat InnoDB, kliknij poniższe łącze - InnoDB

Możesz użyć innych typów tabel, takich jak GEMINI lub BDB, ale zależy to od instalacji, czy obsługuje te dwa typy tabel, czy nie.

MySQL ALTER polecenie jest bardzo przydatne, gdy chcesz zmienić nazwę swojej tabeli, dowolnego pola tabeli lub jeśli chcesz dodać lub usunąć istniejącą kolumnę w tabeli.

Zacznijmy od stworzenia tabeli o nazwie testalter_tbl.

root@host# mysql -u root -p password;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> create table testalter_tbl
   -> (
   -> i INT,
   -> c CHAR(1)
   -> );
Query OK, 0 rows affected (0.05 sec)
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field |  Type   | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
|   i   | int(11) | YES  |     |   NULL  |       |
|   c   | char(1) | YES  |     |   NULL  |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Upuszczanie, dodawanie lub zmiana położenia kolumny

Jeśli chcesz usunąć istniejącą kolumnę i z powyższej tabeli MySQL, użyjesz rozszerzenia DROP klauzula wraz z ALTER polecenie, jak pokazano poniżej -

mysql> ALTER TABLE testalter_tbl  DROP i;

ZA DROP klauzula nie zadziała, jeśli kolumna jest jedyną pozostałą w tabeli.

Aby dodać kolumnę, użyj DODAJ i określ definicję kolumny. Poniższa instrukcja przywraca pliki kolumna do testalter_tbl -

mysql> ALTER TABLE testalter_tbl ADD i INT;

Po wydaniu tej instrukcji testalter będzie zawierał te same dwie kolumny, które miał podczas pierwszego tworzenia tabeli, ale nie będzie miał takiej samej struktury. Dzieje się tak, ponieważ domyślnie dodawane są nowe kolumny na końcu tabeli. Więc pomimo tego, żei pierwotnie była to pierwsza kolumna w mytbl, teraz jest ostatnią.

mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field |  Type   | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
|   c   | char(1) | YES  |     |   NULL  |       |
|   i   | int(11) | YES  |     |   NULL  |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Aby wskazać, że chcesz, aby kolumna znajdowała się w określonej pozycji w tabeli, użyj przycisku FIRST, aby ustawić ją jako pierwszą kolumnę lub AFTER col_name aby wskazać, że nowa kolumna powinna zostać umieszczona po kolumnie_nazwa.

Spróbuj wykonać następujące czynności ALTER TABLE oświadczenia, używając SHOW COLUMNS po każdym, aby zobaczyć, jaki efekt ma każdy z nich -

ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;

Specyfikatory FIRST i AFTER działają tylko z klauzulą ​​ADD. Oznacza to, że jeśli chcesz zmienić położenie istniejącej kolumny w tabeli, musisz najpierwDROP to i wtedy ADD w nowej pozycji.

Zmiana (zmiana) definicji kolumny lub nazwy

Aby zmienić definicję kolumny, użyj MODIFY lub CHANGE klauzula wraz z poleceniem ALTER.

Na przykład, aby zmienić kolumnę c od CHAR (1) do CHAR (10), możesz użyć następującego polecenia -

mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);

Z CHANGE, składnia jest nieco inna. Po słowie kluczowym CHANGE nadaj nazwę kolumnie, którą chcesz zmienić, a następnie określ nową definicję, która zawiera nową nazwę.

Wypróbuj następujący przykład -

mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;

Jeśli teraz używasz CHANGE do konwersji j od BIGINT wrócić do INT bez zmiany nazwy kolumny wyciąg będzie wyglądał jak poniżej -

mysql> ALTER TABLE testalter_tbl CHANGE j j INT;

The Effect of ALTER TABLE on Null and Default Value Attributes- Podczas MODYFIKOWANIA lub ZMIANY kolumny można również określić, czy kolumna może zawierać wartości NULL i jaka jest jej wartość domyślna. W rzeczywistości, jeśli tego nie zrobisz, MySQL automatycznie przypisze wartości tym atrybutom.

Poniższy blok kodu jest przykładem, w którym NOT NULL kolumna będzie miała domyślnie wartość 100.

mysql> ALTER TABLE testalter_tbl 
   -> MODIFY j BIGINT NOT NULL DEFAULT 100;

Jeśli nie użyjesz powyższego polecenia, MySQL wypełni wartości NULL we wszystkich kolumnach.

Zmiana (zmiana) wartości domyślnej kolumny

Możesz zmienić wartość domyślną dla dowolnej kolumny przy użyciu ALTER Komenda.

Wypróbuj następujący przykład.

mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field |  Type   | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
|   c   | char(1) | YES  |     |   NULL  |       |
|   i   | int(11) | YES  |     |   1000  |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Możesz usunąć domyślne ograniczenie z dowolnej kolumny, używając klauzuli DROP wraz z ALTER Komenda.

mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field |  Type   | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
|   c   | char(1) | YES  |     |   NULL  |       |
|   i   | int(11) | YES  |     |   NULL  |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Zmiana (zmiana) typu tabeli

Możesz użyć typu tabeli, używając TYPEklauzula wraz z poleceniem ALTER. Wypróbuj poniższy przykład, aby zmienićtestalter_tbl do MYISAM typ tabeli.

Aby poznać aktualny typ tabeli, użyj SHOW TABLE STATUS komunikat.

mysql> ALTER TABLE testalter_tbl TYPE = MYISAM;
mysql>  SHOW TABLE STATUS LIKE 'testalter_tbl'\G
*************************** 1. row ****************
           Name: testalter_tbl
           Type: MyISAM
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 25769803775
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2007-06-03 08:04:36
    Update_time: 2007-06-03 08:04:36
     Check_time: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

Zmiana nazwy (zmiana) tabeli

Aby zmienić nazwę tabeli, użyj RENAME opcja ALTER TABLE komunikat.

Wypróbuj następujący przykład, aby zmienić nazwę testalter_tbl do alter_tbl.

mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

Możesz użyć polecenia ALTER, aby utworzyć i upuścić polecenie INDEX w pliku MySQL. Szczegółowo omówimy to polecenie w następnym rozdziale.

Indeks bazy danych to struktura danych, która poprawia szybkość operacji w tabeli. Indeksy można tworzyć przy użyciu jednej lub wielu kolumn, co stanowi podstawę zarówno do szybkiego losowego wyszukiwania, jak i efektywnego porządkowania dostępu do rekordów.

Podczas tworzenia indeksu należy wziąć pod uwagę, które kolumny posłużą do wykonania zapytań SQL i utworzenia jednego lub więcej indeksów na tych kolumnach.

Praktycznie, indeksy są również rodzajem tabel, które przechowują klucz podstawowy lub pole indeksu i wskaźnik do każdego rekordu w rzeczywistej tabeli.

Użytkownicy nie widzą indeksów, służą one jedynie do przyspieszania zapytań i będą wykorzystywane przez wyszukiwarkę bazy danych do bardzo szybkiego lokalizowania rekordów.

Instrukcje INSERT i UPDATE zajmują więcej czasu w przypadku tabel z indeksami, podczas gdy instrukcje SELECT w tych tabelach stają się szybkie. Powodem jest to, że podczas wstawiania lub aktualizacji baza danych musi również wstawiać lub aktualizować wartości indeksu.

Prosty i niepowtarzalny indeks

Możesz utworzyć unikalny indeks w tabeli. Unikalny indeks oznacza, że ​​dwa wiersze nie mogą mieć tej samej wartości indeksu. Oto składnia tworzenia indeksu w tabeli.

CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);

Do utworzenia indeksu można użyć jednej lub kilku kolumn.

Na przykład możemy utworzyć indeks na tutorials_tbl za pomocą tutorial_author.

CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author)

Możesz utworzyć prosty indeks w tabeli. Po prostu pomińUNIQUEsłowo kluczowe z zapytania, aby utworzyć prosty indeks. Prosty indeks umożliwia zduplikowane wartości w tabeli.

Jeśli chcesz indeksować wartości w kolumnie w porządku malejącym, możesz dodać zarezerwowane słowo DESC po nazwie kolumny.

mysql> CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author DESC)

ALTER polecenie, aby dodać i upuścić INDEKS

Istnieją cztery typy instrukcji dodawania indeksów do tabeli -

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list) - To stwierdzenie dodaje PRIMARY KEY, co oznacza, że ​​indeksowane wartości muszą być unikalne i nie mogą mieć wartości NULL.

  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list) - Ta instrukcja tworzy indeks, dla którego wartości muszą być unikalne (z wyjątkiem wartości NULL, które mogą występować wielokrotnie).

  • ALTER TABLE tbl_name ADD INDEX index_name (column_list) - To dodaje zwykły indeks, w którym dowolna wartość może pojawić się więcej niż raz.

  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list) - Tworzy specjalny indeks FULLTEXT, który jest używany do wyszukiwania tekstu.

Poniższy blok kodu jest przykładem dodawania indeksu w istniejącej tabeli.

mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

Możesz usunąć dowolny INDEKS, używając rozszerzenia DROP klauzula wraz z poleceniem ALTER.

Wypróbuj poniższy przykład, aby usunąć powyższy indeks.

mysql> ALTER TABLE testalter_tbl DROP INDEX (c);

Możesz usunąć dowolny INDEX, używając klauzuli DROP wraz z poleceniem ALTER.

ALTER Polecenie, aby dodać i upuścić KLUCZ PODSTAWOWY

Możesz również dodać klucz podstawowy w ten sam sposób. Ale upewnij się, że klucz podstawowy działa na kolumnach, które NIE mają wartości NULL.

Poniższy blok kodu jest przykładem dodawania klucza podstawowego w istniejącej tabeli. Spowoduje to, że najpierw kolumna NIE będzie NULL, a następnie dodamy ją jako klucz podstawowy.

mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

Możesz użyć polecenia ALTER, aby upuścić klucz podstawowy w następujący sposób -

mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

Aby usunąć indeks, który nie jest KLUCZEM PODSTAWOWYM, należy określić nazwę indeksu.

Wyświetlanie informacji INDEKSU

Możesz użyć SHOW INDEXpolecenie, aby wyświetlić wszystkie indeksy powiązane z tabelą. Wyjście w formacie pionowym (określone przez \ G) jest często przydatne w przypadku tej instrukcji, aby uniknąć zawijania długich linii -

Wypróbuj następujący przykład -

mysql> SHOW INDEX FROM table_name\G
........

Tabele tymczasowe mogą być bardzo przydatne w niektórych przypadkach do przechowywania danych tymczasowych. Najważniejszą rzeczą, o której należy wiedzieć w przypadku tabel tymczasowych, jest to, że zostaną one usunięte po zakończeniu bieżącej sesji klienta.

Co to są tabele tymczasowe?

Tabele tymczasowe zostały dodane w MySQL w wersji 3.23. Jeśli używasz starszej wersji MySQL niż 3.23, nie możesz używać tabel tymczasowych, ale możesz użyćHeap Tables.

Jak wspomniano wcześniej, tymczasowe tabele będą działać tylko tak długo, jak długo trwa sesja. Jeśli uruchomisz kod w skrypcie PHP, tabela tymczasowa zostanie automatycznie zniszczona po zakończeniu wykonywania skryptu. Jeśli łączysz się z serwerem bazy danych MySQL za pośrednictwem programu klienta MySQL, tabela tymczasowa będzie istnieć do momentu zamknięcia klienta lub ręcznego zniszczenia tabeli.

Przykład

Poniższy program jest przykładem pokazującym użycie tabeli tymczasowej. Ten sam kod może być używany w skryptach PHP przy użyciu rozszerzeniamysql_query() funkcjonować.

mysql> CREATE TEMPORARY TABLE SalesSummary (
   -> product_name VARCHAR(50) NOT NULL
   -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
   -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
   -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO SalesSummary
   -> (product_name, total_sales, avg_unit_price, total_units_sold)
   -> VALUES
   -> ('cucumber', 100.25, 90, 2);

mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
|   cucumber   |   100.25    |     90.00      |         2        |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)

Kiedy wydajesz plik SHOW TABLESpolecenie, twoja tymczasowa tabela nie zostanie wymieniona na liście. Teraz, jeśli wylogujesz się z sesji MySQL, a następnie wydasz plikSELECTpolecenie, to nie znajdziesz żadnych danych dostępnych w bazie danych. Nawet twój tymczasowy stół nie będzie istniał.

Upuszczanie tabel tymczasowych

Domyślnie wszystkie tabele tymczasowe są usuwane przez MySQL po zerwaniu połączenia z bazą danych. Jeśli nadal chcesz je usunąć w międzyczasie, możesz to zrobić, wydając plikDROP TABLE Komenda.

Poniższy program jest przykładem usuwania tymczasowej tabeli -

mysql> CREATE TEMPORARY TABLE SalesSummary (
   -> product_name VARCHAR(50) NOT NULL
   -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
   -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
   -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO SalesSummary
   -> (product_name, total_sales, avg_unit_price, total_units_sold)
   -> VALUES
   -> ('cucumber', 100.25, 90, 2);

mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
|   cucumber   |   100.25    |     90.00      |         2        |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
mysql> DROP TABLE SalesSummary;
mysql>  SELECT * FROM SalesSummary;
ERROR 1146: Table 'TUTORIALS.SalesSummary' doesn't exist

Może zaistnieć sytuacja, w której będziesz potrzebować dokładnej kopii tabeli i CREATE TABLE ... SELECT nie pasuje do twoich celów, ponieważ kopia musi zawierać te same indeksy, wartości domyślne i tak dalej.

Możesz poradzić sobie z tą sytuacją, wykonując kroki podane poniżej -

  • Użyj polecenia SHOW CREATE TABLE, aby uzyskać instrukcję CREATE TABLE, która określa strukturę tabeli źródłowej, indeksy i wszystko.

  • Zmodyfikuj instrukcję, aby zmienić nazwę tabeli na nazwę tabeli klonowania i wykonaj instrukcję. W ten sposób będziesz mieć dokładną tabelę klonów.

  • Opcjonalnie, jeśli chcesz również skopiować zawartość tabeli, wydaj również instrukcję INSERT INTO ... SELECT.

Przykład

Wypróbuj następujący przykład, aby utworzyć tabelę klonów dla tutorials_tbl.

Step 1 - Uzyskaj pełną strukturę stołu.

mysql> SHOW CREATE TABLE tutorials_tbl \G;
*************************** 1. row ***************************
      Table: tutorials_tbl
Create Table: CREATE TABLE `tutorials_tbl` (
   `tutorial_id` int(11) NOT NULL auto_increment,
   `tutorial_title` varchar(100) NOT NULL default '',
   `tutorial_author` varchar(40) NOT NULL default '',
   `submission_date` date default NULL,
   PRIMARY KEY  (`tutorial_id`),
   UNIQUE KEY `AUTHOR_INDEX` (`tutorial_author`)
) TYPE = MyISAM
1 row in set (0.00 sec)

ERROR:
No query specified

Step 2 - Zmień nazwę tej tabeli i utwórz inną tabelę.

mysql> CREATE TABLE clone_tbl (
   -> tutorial_id int(11) NOT NULL auto_increment,
   -> tutorial_title varchar(100) NOT NULL default '',
   -> tutorial_author varchar(40) NOT NULL default '',
   -> submission_date date default NULL,
   -> PRIMARY KEY  (tutorial_id),
   -> UNIQUE KEY AUTHOR_INDEX (tutorial_author)
-> ) TYPE = MyISAM;
Query OK, 0 rows affected (1.80 sec)

Step 3- Po wykonaniu kroku 2 utworzysz tabelę klonów w swojej bazie danych. Jeśli chcesz skopiować dane ze starej tabeli, możesz to zrobić za pomocą instrukcji INSERT INTO ... SELECT.

mysql> INSERT INTO clone_tbl (tutorial_id,
   -> tutorial_title,
   -> tutorial_author,
   -> submission_date)
   
   -> SELECT tutorial_id,tutorial_title,
   -> tutorial_author,submission_date
   -> FROM tutorials_tbl;
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

Wreszcie będziesz mieć dokładną tabelę klonów, jaką chciałeś mieć.

Uzyskiwanie i używanie metadanych MySQL

Istnieją trzy rodzaje informacji, które chciałbyś otrzymać z MySQL.

  • Information about the result of queries - Obejmuje to liczbę rekordów, na które ma wpływ dowolna instrukcja SELECT, UPDATE lub DELETE.

  • Information about the tables and databases - Obejmuje to informacje dotyczące struktury tabel i baz danych.

  • Information about the MySQL server - Obejmuje to stan serwera bazy danych, numer wersji itp.

Uzyskanie wszystkich tych informacji po wyświetleniu monitu MySQL jest bardzo łatwe, ale korzystając z interfejsów API PERL lub PHP, musimy jawnie wywoływać różne interfejsy API, aby uzyskać wszystkie te informacje.

Uzyskanie liczby wierszy, na które ma wpływ zapytanie

Zobaczmy teraz, jak uzyskać te informacje.

Przykład PERL

W skryptach DBI liczba wierszy, których to dotyczy, jest zwracana przez do( ) lub przez execute( ) polecenie, w zależności od sposobu wykonania zapytania.

# Method 1
# execute $query using do( )
my $count = $dbh->do ($query); # report 0 rows if an error occurred printf "%d rows were affected\n", (defined ($count) ? $count : 0); # Method 2 # execute query using prepare( ) plus execute( ) my $sth = $dbh->prepare ($query);
my $count = $sth->execute ( );
printf "%d rows were affected\n", (defined ($count) ? $count : 0);

Przykład PHP

W PHP wywołaj mysql_affected_rows( ) funkcję, aby dowiedzieć się, ile wierszy zostało zmienionych przez zapytanie.

$result_id = mysql_query ($query, $conn_id); # report 0 rows if the query failed $count = ($result_id ? mysql_affected_rows ($conn_id) : 0);
print ("$count rows were affected\n");

Tabele list i bazy danych

Spisanie wszystkich baz danych i tabel dostępnych na serwerze bazy danych jest bardzo łatwe. Twój wynik może byćnull jeśli nie masz wystarczających uprawnień.

Oprócz metody, która jest pokazana w poniższym bloku kodu, możesz użyć SHOW TABLES lub SHOW DATABASES zapytania, aby uzyskać listę tabel lub baz danych w PHP lub PERL.

Przykład PERL

# Get all the tables available in current database.
my @tables = $dbh->tables ( );

foreach $table (@tables ){ print "Table Name $table\n";
}

Przykład PHP

<?php
   $con = mysql_connect("localhost", "userid", "password"); if (!$con) {
      die('Could not connect: ' . mysql_error());
   }
   $db_list = mysql_list_dbs($con);

   while ($db = mysql_fetch_object($db_list)) {
      echo $db->Database . "<br />"; } mysql_close($con);
?>

Pobieranie metadanych serwera

W MySQL jest kilka ważnych poleceń, które można wykonać w zachęcie MySQL lub przy użyciu dowolnego skryptu, takiego jak PHP, aby uzyskać różne ważne informacje o serwerze bazy danych.

Sr.No. Polecenie i opis
1

SELECT VERSION( )

Ciąg wersji serwera

2

SELECT DATABASE( )

Nazwa aktualnej bazy danych (pusta, jeśli brak)

3

SELECT USER( )

Aktualna nazwa użytkownika

4

SHOW STATUS

Wskaźniki stanu serwera

5

SHOW VARIABLES

Zmienne konfiguracyjne serwera

Sekwencja to zbiór liczb całkowitych 1, 2, 3, ..., które są generowane w kolejności na określone żądanie. Sekwencje są często używane w bazach danych, ponieważ wiele aplikacji wymaga, aby każdy wiersz w tabeli zawierał unikatową wartość, a sekwencje zapewniają łatwy sposób ich generowania.

W tym rozdziale opisano, jak używać sekwencji w MySQL.

Korzystanie z kolumny AUTO_INCREMENT

Najprostszym sposobem użycia sekwencji w MySQL jest zdefiniowanie kolumny jako AUTO_INCREMENT a pozostałe rzeczy pozostaw MySQL, aby się zajął.

Przykład

Wypróbuj następujący przykład. Spowoduje to utworzenie tabeli, a następnie wstawi kilka wierszy w tej tabeli, w których nie jest wymagane podawanie identyfikatora rekordu, ponieważ jest on automatycznie zwiększany przez MySQL.

mysql> CREATE TABLE insect
   -> (
   -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   -> PRIMARY KEY (id),
   -> name VARCHAR(30) NOT NULL, # type of insect
   -> date DATE NOT NULL, # date collected
   -> origin VARCHAR(30) NOT NULL # where collected
);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO insect (id,name,date,origin) VALUES
   -> (NULL,'housefly','2001-09-10','kitchen'),
   -> (NULL,'millipede','2001-09-10','driveway'),
   -> (NULL,'grasshopper','2001-09-10','front yard');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+-------------+------------+------------+
| id |    name     |    date    |   origin   |
+----+-------------+------------+------------+
|  1 |  housefly   | 2001-09-10 |   kitchen  |
|  2 |  millipede  | 2001-09-10 |  driveway  |
|  3 | grasshopper | 2001-09-10 | front yard |
+----+-------------+------------+------------+
3 rows in set (0.00 sec)

Uzyskaj wartości AUTO_INCREMENT

Plik LAST_INSERT_ID( )jest funkcją SQL, więc można jej używać z poziomu dowolnego klienta, który rozumie, jak wydawać instrukcje SQL. W przeciwnym razie skrypty PERL i PHP zapewniają wyłączne funkcje do pobierania automatycznie zwiększonej wartości ostatniego rekordu.

Przykład PERL

Użyj mysql_insertid atrybut, aby uzyskać AUTO_INCREMENTwartość wygenerowana przez zapytanie. Dostęp do tego atrybutu uzyskuje się za pośrednictwem uchwytu bazy danych lub uchwytu instrukcji, w zależności od sposobu wysłania zapytania.

Poniższy przykład odwołuje się do niego za pośrednictwem uchwytu bazy danych.

$dbh->do ("INSERT INTO insect (name,date,origin) VALUES('moth','2001-09-14','windowsill')"); my $seq = $dbh->{mysql_insertid};

Przykład PHP

Po wysłaniu zapytania, które generuje wartość AUTO_INCREMENT, pobierz wartość, wywołując metodę mysql_insert_id( ) Komenda.

mysql_query ("INSERT INTO insect (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id);
$seq = mysql_insert_id ($conn_id);

Renumeracja istniejącej sekwencji

Może wystąpić sytuacja, w której usunięto wiele rekordów z tabeli i chcesz ponownie ustawić kolejność wszystkich rekordów. Można to zrobić za pomocą prostej sztuczki, ale powinieneś być bardzo ostrożny, jeśli twój stół ma połączenia z innym stołem.

Jeśli stwierdzisz, że ponowne sekwencjonowanie kolumny AUTO_INCREMENT jest nieuniknione, sposobem na to jest usunięcie kolumny z tabeli, a następnie dodanie jej ponownie.

Poniższy przykład pokazuje, jak zmienić numerację id values w tabeli przy użyciu tej techniki.

mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
   -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
   -> ADD PRIMARY KEY (id);

Rozpoczynanie sekwencji o określonej wartości

Domyślnie MySQL rozpocznie sekwencję od 1, ale podczas tworzenia tabeli możesz również określić dowolną inną liczbę.

Poniższy program jest przykładem, który pokazuje, jak MySQL rozpocznie sekwencję od 100.

mysql> CREATE TABLE insect
   -> (
   -> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,
   -> PRIMARY KEY (id),
   -> name VARCHAR(30) NOT NULL, # type of insect
   -> date DATE NOT NULL, # date collected
   -> origin VARCHAR(30) NOT NULL # where collected
);

Alternatywnie możesz utworzyć tabelę, a następnie ustawić początkową wartość sekwencji za pomocą ALTER TABLE Komenda.

mysql> ALTER TABLE t AUTO_INCREMENT = 100;

Zwykle tabele lub zestawy wyników zawierają czasami zduplikowane rekordy. W większości przypadków jest to dozwolone, ale czasami wymagane jest zatrzymanie zduplikowanych rekordów. Wymagane jest zidentyfikowanie zduplikowanych rekordów i usunięcie ich z tabeli. W tym rozdziale opisano, jak zapobiec występowaniu zduplikowanych rekordów w tabeli i jak usunąć już istniejące zduplikowane rekordy.

Zapobieganie występowaniu duplikatów w tabeli

Możesz użyć PRIMARY KEY lub a UNIQUE Indeksuj w tabeli z odpowiednimi polami, aby zatrzymać zduplikowane rekordy.

Weźmy przykład - poniższa tabela nie zawiera takiego indeksu ani klucza podstawowego, więc pozwoliłaby na zduplikowane rekordy dla first_name i last_name.

CREATE TABLE person_tbl (
   first_name CHAR(20),
   last_name CHAR(20),
   sex CHAR(10)
);

Aby zapobiec tworzeniu wielu rekordów z tymi samymi wartościami imienia i nazwiska w tej tabeli, dodaj rozszerzenie PRIMARY KEYdo jego definicji. Kiedy to zrobisz, konieczne jest również zadeklarowanie indeksowanych kolumnNOT NULL, ponieważ PRIMARY KEY nie pozwala NULL wartości -

CREATE TABLE person_tbl (
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   PRIMARY KEY (last_name, first_name)
);

Obecność unikatowego indeksu w tabeli zwykle powoduje wystąpienie błędu, jeśli wstawisz do tabeli rekord, który powiela istniejący rekord w kolumnie lub kolumnach definiujących indeks.

Użyj INSERT IGNORE polecenie zamiast INSERTKomenda. Jeśli rekord nie powiela istniejącego rekordu, MySQL wstawia go jak zwykle. Jeśli rekord jest duplikatem, plikIGNORE słowo kluczowe mówi MySQL, aby po cichu je odrzucił bez generowania błędu.

Poniższy przykład nie zawiera błędów, a jednocześnie nie wstawia zduplikowanych rekordów.

mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
   -> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
   -> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)

Użyj REPLACEzamiast polecenia WSTAW. Jeśli rekord jest nowy, jest wstawiany tak samo, jak w przypadku polecenia INSERT. Jeśli jest to duplikat, nowy rekord zastępuje stary.

mysql> REPLACE INTO person_tbl (last_name, first_name)
   -> VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)

mysql> REPLACE INTO person_tbl (last_name, first_name)
   -> VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)

Polecenia INSERT IGNORE i REPLACE należy wybrać zgodnie z zachowaniem obsługi duplikatów, które chcesz zastosować. Polecenie INSERT IGNORE zachowuje pierwszy zestaw zduplikowanych rekordów, a pozostałe usuwa. Polecenie REPLACE zachowuje ostatni zestaw duplikatów i usuwa wszystkie wcześniejsze.

Innym sposobem na wymuszenie wyjątkowości jest dodanie UNIQUE index zamiast klucza podstawowego do tabeli.

CREATE TABLE person_tbl (
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10)
   UNIQUE (last_name, first_name)
);

Liczenie i identyfikacja duplikatów

Poniżej znajduje się kwerenda licząca zduplikowane rekordy z first_name i last_name w tabeli.

mysql> SELECT COUNT(*) as repetitions, last_name, first_name
   -> FROM person_tbl
   -> GROUP BY last_name, first_name
   -> HAVING repetitions > 1;

To zapytanie zwróci listę wszystkich zduplikowanych rekordów w tabeli person_tbl. Ogólnie, aby zidentyfikować zestawy wartości, które są zduplikowane, wykonaj czynności podane poniżej.

  • Określ, które kolumny zawierają wartości, które mogą zostać zduplikowane.

  • Wymień te kolumny na liście wyboru kolumn, wraz z rozszerzeniem COUNT(*).

  • Wymień kolumny w GROUP BY klauzula również.

  • Dodać HAVING klauzula, która eliminuje unikatowe wartości, wymagając, aby liczba grup była większa niż jeden.

Eliminowanie duplikatów z wyniku zapytania

Możesz użyć DISTINCT polecenie wraz z instrukcją SELECT, aby znaleźć unikalne rekordy dostępne w tabeli.

mysql> SELECT DISTINCT last_name, first_name
   -> FROM person_tbl
   -> ORDER BY last_name;

Alternatywą dla polecenia DISTINCT jest dodanie klauzuli GROUP BY, która nazywa wybrane kolumny. Powoduje to usunięcie duplikatów i wybranie tylko unikalnych kombinacji wartości w określonych kolumnach.

mysql> SELECT last_name, first_name
   -> FROM person_tbl
   -> GROUP BY (last_name, first_name);

Usuwanie duplikatów za pomocą wymiany tabeli

Jeśli masz zduplikowane rekordy w tabeli i chcesz usunąć wszystkie zduplikowane rekordy z tej tabeli, postępuj zgodnie z procedurą podaną poniżej.

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
   -> FROM person_tbl;
   -> GROUP BY (last_name, first_name);

mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;

Prostym sposobem na usunięcie zduplikowanych rekordów z tabeli jest dodanie INDEKSU lub KLUCZA PODSTAWOWEGO do tej tabeli. Nawet jeśli ta tabela jest już dostępna, możesz użyć tej techniki, aby usunąć zduplikowane rekordy, a także będziesz bezpieczny w przyszłości.

mysql> ALTER IGNORE TABLE person_tbl
   -> ADD PRIMARY KEY (last_name, first_name);

Jeśli weźmiesz dane wejściowe użytkownika za pośrednictwem strony internetowej i wstawisz je do bazy danych MySQL, istnieje szansa, że ​​pozostawiłeś się szeroko otwarty na problem bezpieczeństwa znany jako SQL Injection. W tym rozdziale nauczysz się, jak temu zapobiec i jak zabezpieczyć swoje skrypty i instrukcje MySQL.

SQL Injection zwykle występuje, gdy prosisz użytkownika o wprowadzenie danych, na przykład o jego imię i nazwisko, a zamiast nazwy podają ci instrukcję MySQL, którą nieświadomie uruchomisz w swojej bazie danych.

Nigdy nie ufaj danym dostarczonym przez użytkownika, przetwarzaj te dane dopiero po walidacji; z reguły odbywa się to poprzez dopasowywanie wzorców. W poniższym przykładzie nazwa użytkownika jest ograniczona do znaków alfanumerycznych i podkreślenia oraz do długości od 8 do 20 znaków - zmodyfikuj te zasady w razie potrzeby.

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysql_query("SELECT * FROM users WHERE username = $matches[0]");
} else  {
   echo "username not accepted";
}

Aby zademonstrować ten problem, rozważ następujący fragment.

// supposed input
$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name = '{$name}'");

Wywołanie funkcji ma na celu pobranie rekordu z tabeli użytkowników, gdzie kolumna name odpowiada nazwie podanej przez użytkownika. W normalnych okolicznościach $ nazwa zawierałaby tylko znaki alfanumeryczne i być może spacje. Ale tutaj, dołączając zupełnie nowe zapytanie do$name, wezwanie do bazy danych zamienia się w katastrofę. Wstrzyknięte zapytanie DELETE usuwa wszystkie rekordy od użytkowników.

Na szczęście, jeśli używasz MySQL, rozszerzenie mysql_query()funkcja nie zezwala na układanie zapytań w stos lub wykonywanie wielu zapytań w jednym wywołaniu funkcji. Jeśli spróbujesz zestawić zapytania, wywołanie nie powiedzie się.

Jednak inne rozszerzenia baz danych PHP, takie jak SQLite i PostgreSQL, szczęśliwie wykonuj zapytania skumulowane, wykonując wszystkie zapytania dostarczone w jednym ciągu i tworząc poważny problem z bezpieczeństwem.

Zapobieganie iniekcji SQL

Możesz inteligentnie obsługiwać wszystkie znaki ucieczki w językach skryptowych, takich jak PERL i PHP. Rozszerzenie MySQL dla PHP zapewnia tę funkcjęmysql_real_escape_string() aby uniknąć znaków wejściowych, które są specjalne dla MySQL.

if (get_magic_quotes_gpc()) {
   $name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM users WHERE name = '{$name}'");

LIKE Quandary

Aby rozwiązać problem LIKE, niestandardowy mechanizm zmiany znaczenia musi konwertować dostarczone przez użytkownika znaki% i _ na literały. Posługiwać sięaddcslashes(), funkcja, która pozwala określić zakres znaków do zmiany znaczenia.

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_"); // $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Najprostszym sposobem wyeksportowania danych tabeli do pliku tekstowego jest użycie rozszerzenia SELECT...INTO OUTFILE instrukcja, która eksportuje wynik zapytania bezpośrednio do pliku na hoście serwera.

Eksportowanie danych za pomocą instrukcji SELECT ... INTO OUTFILE

Składnia tej instrukcji łączy zwykły plik SELECT polecenie z INTO OUTFILE filenamena końcu. Domyślny format wyjściowy jest taki sam, jak w przypadku polecenia LOAD DATA. Tak więc poniższa instrukcja eksportuje pliktutorials_tbl stół do /tmp/tutorials.txt jako plik rozdzielany znakami tabulacji i zakończony wysuwem wiersza.

mysql> SELECT * FROM tutorials_tbl 
   -> INTO OUTFILE '/tmp/tutorials.txt';

Możesz zmienić format wyjściowy, korzystając z różnych opcji, aby wskazać, jak cytować i ograniczać kolumny i rekordy. Aby wyeksportować tabelę tutorial_tbl w formacie CSV z liniami zakończonymi CRLF, użyj następującego kodu.

mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/tutorials.txt'
   -> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
   -> LINES TERMINATED BY '\r\n';

Plik SELECT ... INTO OUTFILE ma następujące właściwości -

  • Plik wyjściowy jest tworzony bezpośrednio przez serwer MySQL, więc nazwa pliku powinna wskazywać, gdzie chcesz zapisać plik na hoście serwera. Nie ma LOKALNEJ wersji instrukcji analogicznej doLOCAL wersja LOAD DATA.

  • Musisz mieć MySQL FILE przywilej wykonania SELECT ... INTO komunikat.

  • Plik wyjściowy nie może już istnieć. Zapobiega to blokowaniu przez MySQL plików, które mogą być ważne.

  • Powinieneś mieć konto logowania na hoście serwera lub jakiś sposób na pobranie pliku z tego hosta. W przeciwnym razieSELECT ... INTO OUTFILE polecenie najprawdopodobniej nie będzie dla ciebie wartościowe.

  • W systemie UNIX plik jest tworzony world readablei jest własnością serwera MySQL. Oznacza to, że chociaż będziesz mógł odczytać plik, możesz nie być w stanie go usunąć.

Eksportowanie tabel jako surowych danych

Plik mysqldumpProgram służy do kopiowania lub tworzenia kopii zapasowych tabel i baz danych. Może zapisać dane wyjściowe tabeli jako plikRaw Datafile lub jako zestaw INSERT instrukcje, które odtwarzają rekordy w tabeli.

Aby zrzucić tabelę jako plik danych, musisz określić plik --tab opcja wskazująca katalog, w którym serwer MySQL ma zapisać plik.

Na przykład, aby zrzucić plik tutorials_tbl stół z TUTORIALS baza danych do pliku w /tmp katalogu, użyj polecenia, jak pokazano poniżej.

$ mysqldump -u root -p --no-create-info \
   --tab=/tmp tutorials tutorials_tbl
password ******

Eksportowanie zawartości tabeli lub definicji w formacie SQL

Aby wyeksportować tabelę w formacie SQL do pliku, użyj polecenia pokazanego poniżej.

$ mysqldump -u root -p TUTORIALS tutorials_tbl > dump.txt
password ******

Spowoduje to utworzenie pliku o zawartości, jak pokazano poniżej.

-- MySQL dump 8.23
--
-- Host: localhost    Database: TUTORIALS
---------------------------------------------------------
-- Server version       3.23.58

--
-- Table structure for table `tutorials_tbl`
--

CREATE TABLE tutorials_tbl (
   tutorial_id int(11) NOT NULL auto_increment,
   tutorial_title varchar(100) NOT NULL default '',
   tutorial_author varchar(40) NOT NULL default '',
   submission_date date default NULL,
   PRIMARY KEY  (tutorial_id),
   UNIQUE KEY AUTHOR_INDEX (tutorial_author)
) TYPE = MyISAM;

--
-- Dumping data for table `tutorials_tbl`
--

INSERT INTO tutorials_tbl 
   VALUES (1,'Learn PHP','John Poul','2007-05-24');
INSERT INTO tutorials_tbl 
   VALUES (2,'Learn MySQL','Abdul S','2007-05-24');
INSERT INTO tutorials_tbl 
   VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');

Aby zrzucić wiele tabel, nadaj im nazwę, a po niej argument nazwa bazy danych. Aby zrzucić całą bazę danych, nie nazywaj żadnych tabel po bazie danych, jak pokazano w poniższym bloku kodu.

$ mysqldump -u root -p TUTORIALS > database_dump.txt
password ******

Aby utworzyć kopię zapasową wszystkich baz danych dostępnych na hoście, użyj następującego kodu.

$ mysqldump -u root -p --all-databases > database_dump.txt
password ******

Opcja --all-databases jest dostępna w wersji MySQL 3.23.12. Tej metody można użyć do wdrożenia strategii tworzenia kopii zapasowych bazy danych.

Kopiowanie tabel lub baz danych do innego hosta

Jeśli chcesz skopiować tabele lub bazy danych z jednego serwera MySQL na inny, użyj rozszerzenia mysqldump z nazwą bazy danych i nazwą tabeli.

Uruchom następujące polecenie na hoście źródłowym. Spowoduje to zrzucenie całej bazy danych dodump.txt plik.

$ mysqldump -u root -p database_name table_name > dump.txt
password *****

Możesz skopiować całą bazę danych bez używania konkretnej nazwy tabeli, jak wyjaśniono powyżej.

Teraz plik ftp dump.txt na innym hoście i użyj następującego polecenia. Przed uruchomieniem tego polecenia upewnij się, że utworzyłeś nazwę_bazy_danych na serwerze docelowym.

$ mysql -u root -p database_name < dump.txt
password *****

Innym sposobem na osiągnięcie tego bez korzystania z pliku pośredniczącego jest wysłanie danych wyjściowych mysqldump bezpośrednio przez sieć do zdalnego serwera MySQL. Jeśli możesz połączyć się z obydwoma serwerami z hosta, na którym znajduje się źródłowa baza danych, użyj następującego polecenia (upewnij się, że masz dostęp do obu serwerów).

$ mysqldump -u root -p database_name \
   | mysql -h other-host.com database_name

W mysqldump połowa polecenia łączy się z lokalnym serwerem i zapisuje dane wyjściowe zrzutu do potoku. Pozostała połowa polecenia łączy się ze zdalnym serwerem MySQL na stronie other-host.com. Odczytuje potok wejściowy i wysyła każdą instrukcję do serwera other-host.com.

W MySQL istnieją dwa proste sposoby ładowania danych do bazy danych MySQL z pliku, którego kopia zapasowa została wcześniej utworzona.

Importowanie danych z LOAD DATA

MySQL udostępnia instrukcję LOAD DATA, która działa jak zbiorczy program ładujący dane. Oto przykładowa instrukcja odczytująca plikdump.txt z bieżącego katalogu i ładuje go do tabeli mytbl w bieżącej bazie danych.

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
  • Jeśli LOCAL brak słowa kluczowego, MySQL szuka pliku danych na hoście serwera przy użyciu rozszerzenia looking into absolute pathname, który w pełni określa lokalizację pliku, zaczynając od katalogu głównego systemu plików. MySQL odczytuje plik z podanej lokalizacji.

  • Domyślnie, LOAD DATA zakłada, że ​​pliki danych zawierają wiersze zakończone wysunięciem wiersza (nowe wiersze) i że wartości danych w wierszu są oddzielone tabulatorami.

  • Aby jawnie określić format pliku, użyj rozszerzenia FIELDS klauzula opisująca charakterystykę pól w wierszu, a LINESklauzula, aby określić sekwencję końca wiersza. NastępująceLOAD DATA instrukcja określa, że ​​plik danych zawiera wartości oddzielone dwukropkami i wierszami zakończonymi znakami powrotu karetki i znakiem nowego wiersza.

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
   -> FIELDS TERMINATED BY ':'
   -> LINES TERMINATED BY '\r\n';
  • Polecenie LOAD DATA zakłada, że ​​kolumny w pliku danych mają tę samą kolejność, co kolumny w tabeli. Jeśli tak nie jest, można określić listę wskazującą, do których kolumn tabeli mają zostać załadowane kolumny z plikiem danych. Załóżmy, że Twoja tabela ma kolumny a, b i c, ale kolejne kolumny w pliku danych odpowiadają kolumnom b, c i a.

Możesz załadować plik, jak pokazano w poniższym bloku kodu.

mysql> LOAD DATA LOCAL INFILE 'dump.txt' 
   -> INTO TABLE mytbl (b, c, a);

Importowanie danych za pomocą mysqlimport

MySQL zawiera również program narzędziowy o nazwie mysqlimport który działa jak opakowanie wokół LOAD DATA, dzięki czemu można ładować pliki wejściowe bezpośrednio z wiersza poleceń.

Aby załadować dane z dump.txt w mytblużyj następującego polecenia w wierszu poleceń systemu UNIX.

$ mysqlimport -u root -p --local database_name dump.txt
password *****

Jeśli użyjesz mysqlimport, opcje wiersza polecenia zawierają specyfikatory formatu. Plikmysqlimport polecenia odpowiadające dwóm poprzednim LOAD DATA instrukcje wyglądają tak, jak pokazano w poniższym bloku kodu.

$ mysqlimport -u root -p --local --fields-terminated-by = ":" \
   --lines-terminated-by = "\r\n"  database_name dump.txt
password *****

Kolejność, w jakiej określasz opcje, nie ma znaczenia dla mysqlimport, poza tym, że wszystkie powinny poprzedzać nazwę bazy danych.

Plik mysqlimport instrukcja używa --columns możliwość określenia kolejności kolumn -

$ mysqlimport -u root -p --local --columns=b,c,a \
   database_name dump.txt
password *****

Obsługa cytatów i znaków specjalnych

Klauzula FIELDS może określać inne opcje formatu oprócz TERMINATED BY. Domyślnie LOAD DATA zakłada, że ​​wartości nie są cytowane i interpretuje ukośnik odwrotny (\) jako znak zmiany znaczenia dla znaków specjalnych. Aby jawnie wskazać znak cytowania wartości, użyjENCLOSED BYKomenda. MySQL usunie ten znak z końców wartości danych podczas przetwarzania danych wejściowych. Aby zmienić domyślny znak zmiany znaczenia, użyjESCAPED BY.

Jeśli określisz ENCLOSED BY, aby wskazać, że znaki cudzysłowu powinny zostać usunięte z wartości danych, można umieścić znak cudzysłowu dosłownie w wartościach danych, podwajając go lub poprzedzając go znakiem zmiany znaczenia.

Na przykład, jeśli cudzysłów i znaki zmiany znaczenia to „i \”, wartość wejściowa "a""b\"c" zostaną zinterpretowane jako a"b"c.

Dla mysqlimport, odpowiednie opcje wiersza polecenia do określania cudzysłowu i wartości ucieczki to --fields-enclosed-by i --fields-escaped-by.