MySQL-퀵 가이드
데이터베이스 란?
데이터베이스는 데이터 모음을 저장하는 별도의 응용 프로그램입니다. 각 데이터베이스에는 보유한 데이터를 생성, 액세스, 관리, 검색 및 복제하기위한 하나 이상의 고유 한 API가 있습니다.
파일 시스템의 파일이나 메모리의 큰 해시 테이블과 같은 다른 종류의 데이터 저장소도 사용할 수 있지만 이러한 유형의 시스템에서는 데이터 가져 오기 및 쓰기가 그렇게 빠르고 쉽지 않습니다.
오늘날 우리는 관계형 데이터베이스 관리 시스템 (RDBMS)을 사용하여 방대한 양의 데이터를 저장하고 관리합니다. 모든 데이터가 서로 다른 테이블에 저장되고 관계가 기본 키 또는 다음과 같은 다른 키를 사용하여 설정되기 때문에이를 관계형 데이터베이스라고합니다.Foreign Keys.
ㅏ Relational DataBase Management System (RDBMS) 소프트웨어는-
테이블, 열 및 인덱스가있는 데이터베이스를 구현할 수 있습니다.
다양한 테이블의 행간에 참조 무결성을 보장합니다.
색인을 자동으로 업데이트합니다.
SQL 쿼리를 해석하고 다양한 테이블의 정보를 결합합니다.
RDBMS 용어
MySQL 데이터베이스 시스템을 설명하기 전에 데이터베이스와 관련된 몇 가지 정의를 수정하겠습니다.
Database − 데이터베이스는 관련 데이터가있는 테이블 모음입니다.
Table− 테이블은 데이터가있는 행렬입니다. 데이터베이스의 테이블은 단순한 스프레드 시트처럼 보입니다.
Column − 하나의 열 (데이터 요소)에는 동일한 종류의 데이터 (예 : 열 우편 번호)가 포함됩니다.
Row − 행 (= 튜플, 항목 또는 레코드)은 관련 데이터 그룹입니다 (예 : 한 구독의 데이터).
Redundancy − 시스템 속도를 높이기 위해 중복 데이터를 두 번 저장합니다.
Primary Key− 기본 키는 고유합니다. 키 값은 한 테이블에서 두 번 발생할 수 없습니다. 키를 사용하면 하나의 행만 찾을 수 있습니다.
Foreign Key − 외래 키는 두 테이블 간의 연결 핀입니다.
Compound Key − 복합 키 (복합 키)는 하나의 열이 충분히 고유하지 않기 때문에 여러 열로 구성된 키입니다.
Index − 데이터베이스의 색인은 책 뒷면의 색인과 유사합니다.
Referential Integrity − 참조 무결성은 외래 키 값이 항상 기존 행을 가리키는 지 확인합니다.
MySQL 데이터베이스
MySQL은 많은 중소기업에서 사용되는 빠르고 사용하기 쉬운 RDBMS입니다. MySQL은 스웨덴 회사 인 MySQL AB에서 개발, 판매 및 지원합니다. MySQL은 많은 이유 때문에 인기를 얻고 있습니다.
MySQL은 오픈 소스 라이선스로 출시되었습니다. 그래서 당신은 그것을 사용하기 위해 지불 할 것이 없습니다.
MySQL은 그 자체로 매우 강력한 프로그램입니다. 가장 비싸고 강력한 데이터베이스 패키지의 기능 중 상당 부분을 처리합니다.
MySQL은 잘 알려진 SQL 데이터 언어의 표준 형식을 사용합니다.
MySQL은 다양한 운영 체제와 PHP, PERL, C, C ++, JAVA 등 다양한 언어에서 작동합니다.
MySQL은 매우 빠르게 작동하며 대용량 데이터 세트에서도 잘 작동합니다.
MySQL은 웹 개발에서 가장 인정받는 언어 인 PHP에 매우 친숙합니다.
MySQL은 테이블에서 최대 5 천만 행 이상의 대규모 데이터베이스를 지원합니다. 테이블의 기본 파일 크기 제한은 4GB이지만 (운영 체제에서 처리 할 수있는 경우) 이론적 제한 인 8 백만 테라 바이트 (TB)까지 늘릴 수 있습니다.
MySQL은 사용자 정의 할 수 있습니다. 오픈 소스 GPL 라이선스를 통해 프로그래머는 자신의 특정 환경에 맞게 MySQL 소프트웨어를 수정할 수 있습니다.
시작하기 전에
이 튜토리얼을 시작하기 전에 PHP 및 HTML 튜토리얼에서 다루는 정보에 대한 기본 지식이 있어야합니다.
이 튜토리얼은 PHP 환경에서 MySQL을 사용하는 데 중점을 둡니다. 이 튜토리얼에 제공된 많은 예제는 PHP 프로그래머에게 유용합니다.
참조를 위해 PHP 자습서 를 확인하는 것이 좋습니다 .
MySQL에 대한 모든 다운로드는 MySQL 다운로드에 있습니다. 버전 번호 선택MySQL Community Server 실행할 플랫폼과 함께 필요합니다.
Linux / UNIX에 MySQL 설치
Linux 시스템에 MySQL을 설치하는 권장 방법은 RPM을 사용하는 것입니다. MySQL AB는 웹 사이트에서 다음 RPM을 다운로드 할 수 있도록합니다.
MySQL − MySQL 데이터베이스 서버는 데이터베이스와 테이블을 관리하고 사용자 액세스를 제어하며 SQL 쿼리를 처리합니다.
MySQL-client − 서버에 연결하고 상호 작용할 수있는 MySQL 클라이언트 프로그램.
MySQL-devel − MySQL을 사용하는 다른 프로그램을 컴파일 할 때 유용한 라이브러리 및 헤더 파일.
MySQL-shared − MySQL 클라이언트 용 공유 라이브러리.
MySQL-bench − MySQL 데이터베이스 서버를위한 벤치 마크 및 성능 테스트 도구.
여기에 나열된 MySQL RPM은 모두 SuSE Linux system, 그러나 그들은 일반적으로 어려움없이 다른 Linux 변형에서 작동합니다.
이제 설치를 계속하려면 아래 단계를 따라야합니다.
다음을 사용하여 시스템에 로그인합니다. root 사용자.
RPM이 포함 된 디렉토리로 전환하십시오.
다음 명령을 실행하여 MySQL 데이터베이스 서버를 설치합니다. 기울임 꼴로 표시된 파일 이름을 RPM의 파일 이름으로 바꾸는 것을 잊지 마십시오.
[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm
위의 명령은 MySQL 서버 설치, MySQL 사용자 생성, 필요한 구성 생성 및 MySQL 서버 자동 시작을 처리합니다.
/ usr / bin 및 / usr / sbin에서 모든 MySQL 관련 바이너리를 찾을 수 있습니다. 모든 테이블과 데이터베이스는 / var / lib / mysql 디렉토리에 생성됩니다.
다음 코드 상자에는 선택 사항이지만 동일한 방식으로 나머지 RPM을 설치하는 권장 단계가 있습니다.
[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
Windows에 MySQL 설치
MySQL은 이제 설치 프로그램과 함께 깔끔하게 패키지로 제공되므로 모든 버전의 Windows에서 기본 설치가 예전보다 훨씬 쉬워졌습니다. 설치 프로그램 패키지를 다운로드하고 압축을 풀고 setup.exe 파일을 실행하기 만하면됩니다.
기본 설치 프로그램 setup.exe는 간단한 프로세스를 안내하며 기본적으로 C : \ mysql 아래에 모든 것을 설치합니다.
처음으로 명령 프롬프트에서 실행하여 서버를 테스트하십시오. 의 위치로 이동mysqld server 아마도 C : \ mysql \ bin이고 다음을 입력하십시오.
mysqld.exe --console
NOTE − NT를 사용하는 경우 mysqld.exe 대신 mysqld-nt.exe를 사용해야합니다.
모든 것이 순조롭게 진행되면 시작 및 InnoDB. 그렇지 않은 경우 권한 문제가있을 수 있습니다. 데이터베이스 프로세스가 실행되는 모든 사용자 (아마 MySQL)가 데이터를 보관하는 디렉토리에 액세스 할 수 있는지 확인하십시오.
MySQL은 시작 메뉴에 자신을 추가하지 않으며 서버를 중지하는 특별한 GUI 방법도 없습니다. 따라서 mysqld 실행 파일을 두 번 클릭하여 서버를 시작하는 경향이있는 경우 mysqladmin, 작업 목록, 작업 관리자 또는 기타 Windows 관련 수단을 사용하여 프로세스를 수동으로 중지해야합니다.
MySQL 설치 확인
MySQL이 성공적으로 설치된 후 기본 테이블이 초기화되고 서버가 시작되었습니다. 간단한 테스트를 통해 모든 것이 정상적으로 작동하는지 확인할 수 있습니다.
mysqladmin 유틸리티를 사용하여 서버 상태 얻기
사용하다 mysqladmin바이너리를 사용하여 서버 버전을 확인하십시오. 이 바이너리는 Linux의 경우 / usr / bin, Windows의 경우 C : \ mysql \ bin에서 사용할 수 있습니다.
[root@host]# mysqladmin --version
Linux에서 다음과 같은 결과가 생성됩니다. 설치에 따라 다를 수 있습니다.
mysqladmin Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386
이러한 메시지가 나타나지 않으면 설치에 문제가있을 수 있으며 문제를 해결하려면 도움이 필요합니다.
MySQL 클라이언트를 사용하여 간단한 SQL 명령 실행
MySQL 클라이언트를 통해 그리고 다음을 사용하여 MySQL 서버에 연결할 수 있습니다. mysql명령. 이 시점에서는 기본적으로 공백으로 설정되므로 암호를 제공 할 필요가 없습니다.
다음 명령을 사용할 수 있습니다-
[root@host]# mysql
mysql> 프롬프트로 보상을 받아야합니다. 이제 MySQL 서버에 연결되었으며 다음과 같이 mysql> 프롬프트에서 모든 SQL 명령을 실행할 수 있습니다.
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.13 sec)
설치 후 단계
MySQL은 루트 MySQL 사용자에 대한 빈 암호와 함께 제공됩니다. 데이터베이스와 클라이언트를 성공적으로 설치하자마자 다음 코드 블록과 같이 루트 암호를 설정해야합니다.
[root@host]# mysqladmin -u root password "new_password";
이제 MySQL 서버에 연결하려면 다음 명령을 사용해야합니다.
[root@host]# mysql -u root -p
Enter password:*******
UNIX 사용자는 또한 MySQL 디렉토리를 PATH에 저장하기를 원하므로 명령 줄 클라이언트를 사용할 때마다 전체 경로를 계속 입력 할 필요가 없습니다.
bash의 경우 다음과 같습니다.
export PATH = $PATH:/usr/bin:/usr/sbin
부팅시 MySQL 실행
부팅시 MySQL 서버를 실행하려면 /etc/rc.local 파일에 다음 항목이 있는지 확인하십시오.
/etc/init.d/mysqld start
또한 /etc/init.d/ 디렉토리에 mysqld 바이너리가 있어야합니다.
MySQL 서버 실행 및 종료
먼저 MySQL 서버가 실행 중인지 확인하십시오. 다음 명령을 사용하여 확인할 수 있습니다.
ps -ef | grep mysqld
MySql이 실행 중이면 mysqld결과에 나열된 프로세스. 서버가 실행되고 있지 않으면 다음 명령을 사용하여 시작할 수 있습니다.
root@host# cd /usr/bin
./safe_mysqld &
이제 이미 실행중인 MySQL 서버를 종료하려면 다음 명령을 사용하여 수행 할 수 있습니다.
root@host# cd /usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******
MySQL 사용자 계정 설정
MySQL에 새 사용자를 추가하려면 새 항목을 MySQL에 추가하기 만하면됩니다. user 데이터베이스의 테이블 mysql.
다음 프로그램은 새로운 사용자를 추가하는 예입니다. guest 비밀번호가있는 SELECT, INSERT 및 UPDATE 권한 guest123; SQL 쿼리는-
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)
새 사용자를 추가 할 때는 MySQL에서 제공하는 PASSWORD () 함수를 사용하여 새 암호를 암호화해야합니다. 위의 예에서 볼 수 있듯이 mypass 비밀번호는 6f8c114b58f2ce9e로 암호화됩니다.
FLUSH PRIVILEGES 문을 확인하십시오. 이는 서버에 부여 테이블을 다시로드하도록 지시합니다. 사용하지 않으면 최소한 서버가 재부팅 될 때까지 새 사용자 계정을 사용하여 MySQL에 연결할 수 없습니다.
INSERT 쿼리를 실행할 때 사용자 테이블의 다음 컬럼 값을 'Y'로 설정하여 새 사용자에게 다른 권한을 지정하거나 나중에 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
사용자 계정을 추가하는 또 다른 방법은 GRANT SQL 명령을 사용하는 것입니다. 다음 예제는 사용자를 추가합니다.zara 비밀번호 zara123 이름이 지정된 특정 데이터베이스에 대해 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';
이렇게하면 MySQL 데이터베이스 테이블에 다음과 같은 항목이 생성됩니다. user.
NOTE − MySQL은 SQL 명령 끝에 세미콜론 (;)을 줄 때까지 명령을 종료하지 않습니다.
/etc/my.cnf 파일 구성
대부분의 경우이 파일을 건 드리면 안됩니다. 기본적으로 다음 항목이 있습니다.
[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
여기에서 오류 로그에 대해 다른 디렉토리를 지정할 수 있습니다. 그렇지 않으면이 테이블의 항목을 변경하지 않아야합니다.
관리 MySQL 명령
다음은 중요한 MySQL 명령 목록입니다. MySQL 데이터베이스를 사용하는 데 시간을 할애 할 것입니다.
USE Databasename − 이것은 MySQL 작업 영역에서 데이터베이스를 선택하는 데 사용됩니다.
SHOW DATABASES − MySQL DBMS에서 액세스 할 수있는 데이터베이스를 나열합니다.
SHOW TABLES − use 명령으로 데이터베이스를 선택하면 데이터베이스의 테이블을 표시합니다.
SHOW COLUMNS FROM tablename: 속성, 속성 유형, 키 정보, NULL 허용 여부, 기본값 및 테이블에 대한 기타 정보를 표시합니다.
SHOW INDEX FROM tablename − PRIMARY KEY를 포함하여 테이블에있는 모든 인덱스의 세부 정보를 표시합니다.
SHOW TABLE STATUS LIKE tablename\G − MySQL DBMS 성능 및 통계에 대한 세부 정보를보고합니다.
다음 장에서는 MySQL에서 PHP 구문을 사용하는 방법에 대해 설명합니다.
MySQL은 PERL, C, C ++, JAVA 및 PHP와 같은 다양한 프로그래밍 언어의 조합에서 매우 잘 작동합니다. 이러한 언어 중에서 PHP는 웹 애플리케이션 개발 기능으로 인해 가장 많이 사용되는 언어입니다.
이 튜토리얼은 PHP 환경에서 MySQL을 사용하는 데 중점을 둡니다. PERL을 사용하는 MySQL에 관심이 있다면 PERL 자습서를 읽어보십시오 .
PHP는 MySQL 데이터베이스에 액세스하고 MySQL 데이터베이스 내부의 데이터 레코드를 조작하는 다양한 기능을 제공합니다. 다른 PHP 함수를 호출하는 것과 동일한 방식으로 PHP 함수를 호출해야합니다.
MySQL과 함께 사용하는 PHP 함수는 다음과 같은 일반적인 형식을 가지고 있습니다.
mysql_function(value,value,...);
함수 이름의 두 번째 부분은 함수에 따라 다르며 일반적으로 함수의 기능을 설명하는 단어입니다. 다음은 튜토리얼에서 사용할 두 가지 기능입니다.
mysqli_connect($connect);
mysqli_query($connect,"SQL statement");
다음 예제는 MySQL 함수를 호출하는 PHP의 일반 구문을 보여줍니다.
<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>
다음 장부터 PHP와 함께 중요한 MySQL 기능을 모두 살펴 보겠습니다.
MySQL 바이너리를 사용한 MySQL 연결
다음을 사용하여 MySQL 데이터베이스를 설정할 수 있습니다. mysql 명령 프롬프트에서 바이너리.
예
다음은 명령 프롬프트에서 MySQL 서버에 연결하는 간단한 예입니다.
[root@host]# mysql -u root -p
Enter password:******
그러면 SQL 명령을 실행할 수있는 mysql> 명령 프롬프트가 표시됩니다. 다음은 위 명령의 결과입니다-
다음 코드 블록은 위 코드의 결과를 보여줍니다-
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.
위의 예에서 우리는 root사용자이지만 다른 사용자도 사용할 수 있습니다. 모든 사용자는 해당 사용자에게 허용되는 모든 SQL 작업을 수행 할 수 있습니다.
다음을 사용하여 언제든지 MySQL 데이터베이스에서 연결을 끊을 수 있습니다. exit mysql> 프롬프트에서 명령.
mysql> exit
Bye
PHP 스크립트를 사용한 MySQL 연결
PHP는 mysql_connect()데이터베이스 연결을 여는 기능. 이 함수는 5 개의 매개 변수를 취하고 성공하면 MySQL 링크 식별자를 반환하고 실패하면 FALSE를 반환합니다.
통사론
connection mysql_connect(server,user,passwd,new_link,client_flag);
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | server 선택 사항-데이터베이스 서버를 실행하는 호스트 이름. 지정되지 않은 경우 기본값은localhost:3306. |
2 | user 선택 사항-데이터베이스에 액세스하는 사용자 이름. 지정하지 않으면 기본값은 서버 프로세스를 소유 한 사용자의 이름이됩니다. |
삼 | passwd 선택 사항-데이터베이스에 액세스하는 사용자의 비밀번호. 지정하지 않으면 기본값은 빈 암호입니다. |
4 | new_link 선택 사항-동일한 인수를 사용하여 mysql_connect ()를 두 번째 호출하면 새로운 연결이 설정되지 않습니다. 대신 이미 열린 연결의 식별자가 반환됩니다. |
5 | client_flags 선택 사항-다음 상수의 조합-
|
다른 PHP 기능을 사용하여 언제든지 MySQL 데이터베이스에서 연결을 끊을 수 있습니다. mysql_close(). 이 함수는 단일 매개 변수를 사용합니다.mysql_connect() 함수.
통사론
bool mysql_close ( resource $link_identifier );
리소스를 지정하지 않으면 마지막으로 연 데이터베이스가 닫힙니다. 이 함수는 연결이 성공적으로 종료되면 true를 반환하고 그렇지 않으면 false를 반환합니다.
예
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>
mysqladmin을 사용하여 데이터베이스 생성
MySQL 데이터베이스를 생성하거나 삭제하려면 특별한 권한이 필요합니다. 따라서 루트 사용자에 대한 액세스 권한이 있다고 가정하면 mysql을 사용하여 모든 데이터베이스를 만들 수 있습니다.mysqladmin 바이너리.
예
다음은라는 데이터베이스를 만드는 간단한 예입니다. TUTORIALS −
[root@host]# mysqladmin -u root -p create TUTORIALS
Enter password:******
그러면 TUTORIALS라는 MySQL 데이터베이스가 생성됩니다.
PHP 스크립트를 사용하여 데이터베이스 생성
PHP 사용 mysql_queryMySQL 데이터베이스를 생성하거나 삭제하는 기능. 이 함수는 두 개의 매개 변수를 취하고 성공하면 TRUE를, 실패하면 FALSE를 반환합니다.
통사론
bool mysql_query( sql, connection );
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | sql 필수-MySQL 데이터베이스를 만들거나 삭제하기위한 SQL 쿼리 |
2 | connection 선택 사항-지정하지 않으면 mysql_connect에 의해 마지막으로 열린 연결이 사용됩니다. |
예
데이터베이스를 생성하는 다음 예제-
<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>
mysqladmin을 사용하여 데이터베이스 삭제
MySQL 데이터베이스를 생성하거나 삭제하려면 특별한 권한이 필요합니다. 따라서 루트 사용자에 대한 액세스 권한이 있다고 가정하면 mysql을 사용하여 모든 데이터베이스를 만들 수 있습니다.mysqladmin 바이너리.
데이터베이스에서 사용 가능한 모든 데이터를 잃게되므로 데이터베이스를 삭제하는 동안주의하십시오.
다음은 이전 장에서 생성 한 데이터베이스 (TUTORIALS)를 삭제하는 예입니다.
[root@host]# mysqladmin -u root -p drop TUTORIALS
Enter password:******
이것은 당신에게 경고를 줄 것이고 당신이 정말로이 데이터베이스를 삭제할 것인지 아닌지를 확인할 것입니다.
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
PHP 스크립트를 사용하여 데이터베이스 삭제
PHP 사용 mysql_queryMySQL 데이터베이스를 생성하거나 삭제하는 기능. 이 함수는 두 개의 매개 변수를 취하고 성공하면 TRUE를, 실패하면 FALSE를 반환합니다.
통사론
bool mysql_query( sql, connection );
Sr. 아니요 | 매개 변수 및 설명 |
---|---|
1 | sql 필수-MySQL 데이터베이스를 생성하거나 삭제하기위한 SQL 쿼리 |
2 | connection 선택 사항-지정하지 않으면 mysql_connect에 의해 마지막으로 열린 연결이 사용됩니다. |
예
데이터베이스를 삭제하려면 다음 예제를 시도하십시오-
<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− PHP 스크립트를 사용하여 데이터베이스를 삭제하는 동안 확인 메시지가 표시되지 않습니다. 따라서 MySQL 데이터베이스를 삭제하는 동안주의하십시오.
MySQL 서버에 연결되면 작업 할 데이터베이스를 선택해야합니다. 이는 MySQL 서버에서 사용할 수있는 데이터베이스가 둘 이상있을 수 있기 때문입니다.
명령 프롬프트에서 MySQL 데이터베이스 선택
mysql> 프롬프트에서 데이터베이스를 선택하는 것은 매우 간단합니다. SQL 명령을 사용할 수 있습니다.use 데이터베이스를 선택합니다.
예
다음은라는 데이터베이스를 선택하는 예입니다. TUTORIALS −
[root@host]# mysql -u root -p
Enter password:******
mysql> use TUTORIALS;
Database changed
mysql>
이제 TUTORIALS 데이터베이스를 선택했으며 모든 후속 작업이 TUTORIALS 데이터베이스에서 수행됩니다.
NOTE− 모든 데이터베이스 이름, 테이블 이름, 테이블 필드 이름은 대소 문자를 구분합니다. 따라서 SQL 명령을 제공하는 동안 적절한 이름을 사용해야합니다.
PHP 스크립트를 사용하여 MySQL 데이터베이스 선택
PHP는 기능을 제공합니다 mysql_select_db데이터베이스를 선택합니다. 성공하면 TRUE를, 실패하면 FALSE를 반환합니다.
통사론
bool mysql_select_db( db_name, connection );
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | db_name 필수-MySQL 데이터베이스 이름 선택 |
2 | connection 선택 사항-지정하지 않으면 mysql_connect에 의해 마지막으로 열린 연결이 사용됩니다. |
예
다음은 데이터베이스를 선택하는 방법을 보여주는 예입니다.
<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>
테이블의 필드를 올바르게 정의하는 것은 데이터베이스의 전반적인 최적화에 중요합니다. 실제로 사용해야하는 필드의 유형과 크기 만 사용해야합니다. 예를 들어 2 자만 사용할 것이라는 것을 알고 있다면 10 자 너비의 필드를 정의하지 마십시오. 이러한 유형의 필드 (또는 열)는 데이터 유형이라고도합니다.type of data 당신은 그 분야에 저장할 것입니다.
MySQL은 세 가지 범주로 분류 된 다양한 데이터 유형을 사용합니다.
- Numeric
- 날짜와 시간
- 문자열 유형.
이제 자세히 살펴 보겠습니다.
숫자 데이터 유형
MySQL은 모든 표준 ANSI SQL 숫자 데이터 유형을 사용하므로 다른 데이터베이스 시스템에서 MySQL을 사용하는 경우 이러한 정의가 익숙해 보일 것입니다.
다음 목록은 일반적인 숫자 데이터 유형과 설명을 보여줍니다-
INT− 부호가 있거나 부호가 없을 수있는 보통 크기의 정수. 서명 된 경우 허용 범위는 -2147483648에서 2147483647입니다. 서명되지 않은 경우 허용 범위는 0에서 4294967295입니다. 너비는 최대 11 자리까지 지정할 수 있습니다.
TINYINT− 부호가 있거나 부호가 없을 수있는 매우 작은 정수. 부호가있는 경우 허용 범위는 -128에서 127까지입니다. 부호가없는 경우 허용 범위는 0에서 255까지입니다. 너비는 최대 4 자리까지 지정할 수 있습니다.
SMALLINT− 부호가 있거나 부호가 없을 수있는 작은 정수. 부호있는 경우 허용 범위는 -32768 ~ 32767입니다. 부호없는 경우 허용 범위는 0 ~ 65535입니다. 너비는 최대 5 자리까지 지정할 수 있습니다.
MEDIUMINT− 부호가 있거나 부호가 없을 수있는 중간 크기의 정수. 서명 된 경우 허용 범위는 -8388608에서 8388607까지입니다. 서명되지 않은 경우 허용 범위는 0에서 16777215까지입니다. 너비는 최대 9 자리까지 지정할 수 있습니다.
BIGINT− 부호가 있거나 부호가 없을 수있는 큰 정수. 서명 된 경우 허용 범위는 -9223372036854775808에서 9223372036854775807까지입니다. 서명되지 않은 경우 허용 범위는 0에서 18446744073709551615까지입니다. 너비는 최대 20 자리까지 지정할 수 있습니다.
FLOAT(M,D)− 부호가없는 부동 소수점 숫자. 디스플레이 길이 (M)와 소수 자릿수 (D)를 정의 할 수 있습니다. 필수 사항은 아니며 기본값은 10,2입니다. 여기서 2는 소수 자릿수이고 10은 총 자릿수 (소수 포함)입니다. 소수 정밀도는 FLOAT의 경우 24 자리까지 이동할 수 있습니다.
DOUBLE(M,D)− 부호를 지정할 수없는 배정 밀도 부동 소수점 숫자. 디스플레이 길이 (M)와 소수 자릿수 (D)를 정의 할 수 있습니다. 이것은 필수가 아니며 기본값은 16,4이며 여기서 4는 소수 자릿수입니다. 소수점 정밀도는 DOUBLE에 대해 53 자리까지 갈 수 있습니다. REAL은 DOUBLE의 동의어입니다.
DECIMAL(M,D)− 서명을 해제 할 수없는 압축 해제 된 부동 소수점 숫자. 압축을 푼 십진수에서 각 십진수는 1 바이트에 해당합니다. 표시 길이 (M)와 소수 자릿수 (D)를 정의해야합니다. NUMERIC은 DECIMAL의 동의어입니다.
날짜 및 시간 유형
MySQL 날짜 및 시간 데이터 유형은 다음과 같습니다.
DATE− 1000-01-01에서 9999-12-31 사이의 YYYY-MM-DD 형식의 날짜. 예를 들어, 1973 년 12 월 30 일은 1973-12-30으로 저장됩니다.
DATETIME− YYYY-MM-DD HH : MM : SS 형식의 날짜 및 시간 조합, 1000-01-01 00:00:00에서 9999-12-31 23:59:59 사이. 예를 들어 12 월 30 일 오후 3:30 번째는 , 1973 1973년 12월 30일 15시 30분 0초로 저장된다.
TIMESTAMP− 1970 년 1 월 1 일 자정 과 2037 년 사이의 타임 스탬프. 이것은 숫자 사이에 하이픈이없는 이전 DATETIME 형식과 유사합니다. 년 12 월 30 일에 오후 3:30 일 , 1973 19731230153000 (YYYYMMDDHHMMSS)로 저장된다.
TIME − HH : MM : SS 형식으로 시간을 저장합니다.
YEAR(M)− 연도를 2 자리 또는 4 자리 형식으로 저장합니다. 길이가 2로 지정되면 (예 : YEAR (2)), YEAR는 1970-2069 (70-69) 사이 일 수 있습니다. 길이가 4로 지정되면 YEAR는 1901-2155가 될 수 있습니다. 기본 길이는 4입니다.
문자열 유형
숫자 및 날짜 유형은 재미 있지만 저장할 대부분의 데이터는 문자열 형식입니다. 이 목록은 MySQL의 일반적인 문자열 데이터 유형을 설명합니다.
CHAR(M)− 1 ~ 255 자 길이의 고정 길이 문자열 (예 : CHAR (5)), 저장시 지정된 길이까지 공백으로 오른쪽 채우기. 길이를 정의 할 필요는 없지만 기본값은 1입니다.
VARCHAR(M)− 길이가 1 ~ 255 자 사이의 가변 길이 문자열. 예 : VARCHAR (25). VARCHAR 필드를 만들 때 길이를 정의해야합니다.
BLOB or TEXT− 최대 길이가 65535자인 필드. BLOB는 "Binary Large Objects"이며 이미지 또는 다른 유형의 파일과 같은 많은 양의 이진 데이터를 저장하는 데 사용됩니다. TEXT로 정의 된 필드도 많은 양의 데이터를 보유합니다. 이 둘의 차이점은 저장된 데이터에 대한 정렬 및 비교가case sensitive BLOB에서 not case sensitiveTEXT 필드에서. BLOB 또는 TEXT로 길이를 지정하지 않습니다.
TINYBLOB or TINYTEXT− 최대 길이가 255자인 BLOB 또는 TEXT 열. TINYBLOB 또는 TINYTEXT로 길이를 지정하지 않습니다.
MEDIUMBLOB or MEDIUMTEXT− 최대 길이가 16777215자인 BLOB 또는 TEXT 열. MEDIUMBLOB 또는 MEDIUMTEXT로 길이를 지정하지 않습니다.
LONGBLOB or LONGTEXT− 최대 길이가 4294967295자인 BLOB 또는 TEXT 열. LONGBLOB 또는 LONGTEXT로 길이를 지정하지 않습니다.
ENUM− 열거 형, 목록에 대한 멋진 용어입니다. ENUM을 정의 할 때 값을 선택해야하는 (또는 NULL 일 수있는) 항목 목록을 생성합니다. 예를 들어 필드에 "A", "B"또는 "C"가 포함되도록하려면 ENUM을 ENUM ( 'A', 'B', 'C') 및 해당 값 (또는 NULL)으로 정의합니다. 그 필드를 채울 수 있습니다.
다음 장에서는 MySQL에서 테이블을 만드는 방법에 대해 설명합니다.
우선, 테이블 생성 명령은 다음 세부 정보가 필요합니다-
- 테이블의 이름
- 필드 이름
- 각 필드에 대한 정의
통사론
다음은 MySQL 테이블을 생성하는 일반적인 SQL 구문입니다.
CREATE TABLE table_name (column_name column_type);
이제 다음 테이블을 TUTORIALS 데이터 베이스.
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 )
);
여기에서 몇 가지 항목에 대한 설명이 필요합니다.
필드 속성 NOT NULL이 필드가 NULL이되는 것을 원하지 않기 때문에 사용됩니다. 따라서 사용자가 NULL 값으로 레코드를 만들려고하면 MySQL에서 오류가 발생합니다.
필드 속성 AUTO_INCREMENT MySQL에 계속해서 사용 가능한 다음 번호를 id 필드에 추가하도록 지시합니다.
예어 PRIMARY KEY열을 기본 키로 정의하는 데 사용됩니다. 쉼표로 구분 된 여러 열을 사용하여 기본 키를 정의 할 수 있습니다.
명령 프롬프트에서 테이블 만들기
mysql> 프롬프트에서 MySQL 테이블을 생성하는 것은 쉽습니다. SQL 명령을 사용합니다.CREATE TABLE 테이블을 만듭니다.
예
다음은 생성 할 예입니다. 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은 SQL 명령 끝에 세미콜론 (;)을 줄 때까지 명령을 종료하지 않습니다.
PHP 스크립트를 사용하여 테이블 생성
기존 데이터베이스에 새 테이블을 생성하려면 PHP 기능을 사용해야합니다. mysql_query(). 적절한 SQL 명령으로 두 번째 인수를 전달하여 테이블을 생성합니다.
예
다음 프로그램은 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>
기존 MySQL 테이블을 삭제하는 것은 매우 쉽지만 테이블 삭제 후 손실 된 데이터는 복구되지 않으므로 기존 테이블을 삭제할 때는 매우주의해야합니다.
통사론
다음은 MySQL 테이블을 삭제하는 일반적인 SQL 구문입니다.
DROP TABLE table_name ;
명령 프롬프트에서 테이블 삭제
명령 프롬프트에서 테이블을 삭제하려면 mysql> 프롬프트에서 DROP TABLE SQL 명령을 실행해야합니다.
예
다음 프로그램은 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>
PHP 스크립트를 사용하여 테이블 삭제
데이터베이스에서 기존 테이블을 삭제하려면 PHP 함수를 사용해야합니다. mysql_query(). 적절한 SQL 명령으로 두 번째 인수를 전달하여 테이블을 삭제합니다.
예
<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>
MySQL 테이블에 데이터를 삽입하려면 SQL을 사용해야합니다. INSERT INTO명령. mysql> 프롬프트를 사용하거나 PHP와 같은 스크립트를 사용하여 MySQL 테이블에 데이터를 삽입 할 수 있습니다.
통사론
다음은 MySQL 테이블에 데이터를 삽입하는 INSERT INTO 명령의 일반적인 SQL 구문입니다.
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
문자열 데이터 유형을 삽입하려면 모든 값을 큰 따옴표 또는 작은 따옴표로 유지해야합니다. 예를 들면"value".
명령 프롬프트에서 데이터 삽입
명령 프롬프트에서 데이터를 삽입하려면 SQL INSERT INTO 명령을 사용하여 MySQL 테이블 tutorials_tbl에 데이터를 삽입합니다.
예
다음 예제는 3 개의 레코드를 tutorials_tbl 표 −
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− 모든 화살표 기호 (->)는 SQL 명령의 일부가 아닙니다. 새 줄을 나타내며 명령의 각 줄 끝에 세미콜론을 제공하지 않고 Enter 키를 누르면 MySQL 프롬프트에 의해 자동으로 생성됩니다.
위의 예에서는 테이블 생성시이 필드에 대해 AUTO_INCREMENT 옵션을 제공했기 때문에 tutorial_id를 제공하지 않았습니다. 따라서 MySQL은 이러한 ID를 자동으로 삽입합니다. 여기,NOW() 현재 날짜와 시간을 반환하는 MySQL 함수입니다.
PHP 스크립트를 사용하여 데이터 삽입
PHP 함수에 동일한 SQL INSERT INTO 명령을 사용할 수 있습니다. mysql_query() MySQL 테이블에 데이터를 삽입합니다.
예
이 예제는 사용자로부터 세 개의 매개 변수를 가져 와서 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>
데이터 삽입을 수행하는 동안 함수를 사용하는 것이 가장 좋습니다. get_magic_quotes_gpc()매직 따옴표의 현재 구성이 설정되었는지 확인합니다. 이 함수가 false를 반환하면 함수를 사용합니다.addslashes() 따옴표 앞에 슬래시를 추가합니다.
입력 된 데이터가 올바른지 여부를 확인하기 위해 여러 검증을 수행하고 적절한 조치를 취할 수 있습니다.
SQL SELECT명령은 MySQL 데이터베이스에서 데이터를 가져 오는 데 사용됩니다. mysql> 프롬프트와 PHP와 같은 모든 스크립트에서이 명령을 사용할 수 있습니다.
통사론
다음은 MySQL 테이블에서 데이터를 가져 오는 SELECT 명령의 일반적인 SQL 구문입니다.
SELECT field1, field2,...fieldN
FROM table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]
쉼표로 구분 된 하나 이상의 테이블을 사용하여 WHERE 절을 사용하는 다양한 조건을 포함 할 수 있지만 WHERE 절은 SELECT 명령의 선택적 부분입니다.
단일 SELECT 명령에서 하나 이상의 필드를 가져올 수 있습니다.
필드 대신 별표 (*)를 지정할 수 있습니다. 이 경우 SELECT는 모든 필드를 반환합니다.
WHERE 절을 사용하여 모든 조건을 지정할 수 있습니다.
다음을 사용하여 오프셋을 지정할 수 있습니다. OFFSETSELECT는 레코드 반환을 시작합니다. 기본적으로 오프셋은 0에서 시작합니다.
반품 횟수를 제한 할 수 있습니다. LIMIT 속성.
명령 프롬프트에서 데이터 가져 오기
이것은 SQL SELECT 명령을 사용하여 MySQL 테이블에서 데이터를 가져옵니다. tutorials_tbl.
예
다음 예제는 모든 레코드를 반환합니다. tutorials_tbl 표 −
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>
PHP 스크립트를 사용하여 데이터 가져 오기
동일한 SQL SELECT 명령을 PHP 함수에 사용할 수 있습니다. mysql_query(). 이 함수는 SQL 명령을 실행 한 다음 나중에 다른 PHP 함수를 실행하는 데 사용됩니다.mysql_fetch_array()선택한 모든 데이터를 가져 오는 데 사용할 수 있습니다. 이 함수는 연관 배열, 숫자 배열 또는 둘 모두로 행을 리턴합니다. 이 함수는 행이 더 이상 없으면 FALSE를 반환합니다.
다음 프로그램은 레코드를 가져 오거나 표시하는 방법을 보여주는 간단한 예입니다. tutorials_tbl 표.
예
다음 코드 블록은 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);
?>
행의 내용이 $ row 변수에 할당되고 해당 행의 값이 인쇄됩니다.
NOTE − 배열 값을 문자열에 직접 삽입하려면 항상 중괄호를 넣어야합니다.
위의 예에서 상수 MYSQL_ASSOC PHP 함수의 두 번째 인수로 사용됩니다. mysql_fetch_array(), 행을 연관 배열로 반환합니다. 연관 배열을 사용하면 인덱스를 사용하는 대신 이름을 사용하여 필드에 액세스 할 수 있습니다.
PHP는 mysql_fetch_assoc(), 행을 연관 배열로 반환합니다.
예
다음 예제는 mysql_fetch_assoc () 함수를 사용하여 tutorial_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_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);
?>
상수를 사용할 수도 있습니다. MYSQL_NUMPHP 함수 mysql_fetch_array ()의 두 번째 인수로. 그러면 함수가 숫자 인덱스가있는 배열을 반환합니다.
예
MYSQL_NUM 인수를 사용하여 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_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);
?>
위의 세 가지 예는 모두 동일한 결과를 생성합니다.
메모리 해제
각 SELECT 문의 끝에서 커서 메모리를 해제하는 것이 좋습니다. 이것은 PHP 함수를 사용하여 수행 할 수 있습니다.mysql_free_result(). 다음 프로그램은 사용 방법을 보여주는 예입니다.
예
다음 예제를 시도하십시오-
<?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);
?>
데이터를 가져 오는 동안 원하는대로 복잡한 코드를 작성할 수 있지만 절차는 위에서 언급 한 것과 동일하게 유지됩니다.
우리는 SQL을 보았다 SELECTMySQL 테이블에서 데이터를 가져 오는 명령. 다음과 같은 조건절을 사용할 수 있습니다.WHERE Clause결과를 필터링합니다. 이 WHERE 절을 사용하여 테이블에서 필요한 레코드를 선택하는 선택 기준을 지정할 수 있습니다.
통사론
다음 코드 블록에는 MySQL 테이블에서 데이터를 가져 오는 WHERE 절이있는 SELECT 명령의 일반 SQL 구문이 있습니다.
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
쉼표로 구분 된 하나 이상의 테이블을 사용하여 WHERE 절을 사용하는 다양한 조건을 포함 할 수 있지만 WHERE 절은 SELECT 명령의 선택적 부분입니다.
WHERE 절을 사용하여 모든 조건을 지정할 수 있습니다.
다음을 사용하여 둘 이상의 조건을 지정할 수 있습니다. AND 아니면 그 OR 연산자.
조건을 지정하기 위해 DELETE 또는 UPDATE SQL 명령과 함께 WHERE 절을 사용할 수도 있습니다.
그만큼 WHERE 절은 if condition모든 프로그래밍 언어로. 이 절은 주어진 값을 MySQL 테이블에서 사용할 수있는 필드 값과 비교하는 데 사용됩니다. 외부에서 주어진 값이 MySQL 테이블에서 사용 가능한 필드 값과 같으면 해당 행을 반환합니다.
다음은 다음과 함께 사용할 수있는 연산자 목록입니다. WHERE 절.
필드 A에 10이 있고 필드 B에 20이 있다고 가정하면-
운영자 | 기술 | 예 |
---|---|---|
= | 두 피연산자의 값이 같은지 확인합니다. 그렇다면 조건이 참이됩니다. | (A = B)는 사실이 아닙니다. |
! = | 두 피연산자의 값이 같은지 확인합니다. 값이 같지 않으면 조건이 참이됩니다. | (A! = B)는 사실입니다. |
> | 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 큰지 확인하고, 그렇다면 조건이 참이됩니다. | (A> B)는 사실이 아닙니다. |
< | 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작은 지 확인하고, 그렇다면 조건이 참이됩니다. | (A <B)는 사실입니다. |
> = | 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 크거나 같은지 확인합니다. 그렇다면 조건이 참이됩니다. | (A> = B)는 사실이 아닙니다. |
<= | 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작거나 같은지 확인하고, 그렇다면 조건이 참이됩니다. | (A <= B)는 참입니다. |
WHERE 절은 테이블에서 선택한 행을 가져 오려고 할 때 특히 유용합니다. MySQL Join. 조인은 다른 장에서 설명합니다.
다음을 사용하여 레코드를 검색하는 것이 일반적입니다. Primary Key 더 빠르게 검색 할 수 있습니다.
주어진 조건이 테이블의 어떤 레코드와도 일치하지 않으면 쿼리는 어떤 행도 반환하지 않습니다.
명령 프롬프트에서 데이터 가져 오기
이것은 MySQL 테이블에서 선택된 데이터를 가져 오기 위해 WHERE 절과 함께 SQL SELECT 명령을 사용합니다. tutorials_tbl.
예
다음 예제는 모든 레코드를 반환합니다. tutorials_tbl 저자 이름이있는 테이블 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>
수행하지 않는 한 LIKE문자열 비교는 대소 문자를 구분하지 않습니다. 다음을 사용하여 검색 대소 문자를 구분할 수 있습니다.BINARY 다음과 같이 키워드-
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>
PHP 스크립트를 사용하여 데이터 가져 오기
PHP 함수에 WHERE CLAUSE와 함께 동일한 SQL SELECT 명령을 사용할 수 있습니다. mysql_query(). 이 함수는 SQL 명령을 실행하고 나중에 다른 PHP 함수를 실행하는 데 사용됩니다.mysql_fetch_array()선택한 모든 데이터를 가져 오는 데 사용할 수 있습니다. 이 함수는 연관 배열, 숫자 배열 또는 둘 모두로 행을 리턴합니다. 이 함수는 행이 더 이상 없으면 FALSE를 반환합니다.
예
다음 예제는 모든 레코드를 반환합니다. tutorials_tbl 저자 이름이있는 테이블 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);
?>
MySQL 테이블의 기존 데이터를 수정해야하는 요구 사항이있을 수 있습니다. SQL을 사용하여 수행 할 수 있습니다.UPDATE명령. 이것은 MySQL 테이블의 모든 필드 값을 수정합니다.
통사론
다음 코드 블록에는 MySQL 테이블의 데이터를 수정하는 UPDATE 명령의 일반 SQL 구문이 있습니다.
UPDATE table_name SET field1 = new-value1, field2 = new-value2
[WHERE Clause]
- 하나 이상의 필드를 모두 업데이트 할 수 있습니다.
- WHERE 절을 사용하여 모든 조건을 지정할 수 있습니다.
- 한 번에 단일 테이블의 값을 업데이트 할 수 있습니다.
WHERE 절은 테이블에서 선택한 행을 업데이트하려는 경우 매우 유용합니다.
명령 프롬프트에서 데이터 업데이트
이것은 MySQL 테이블에서 선택된 데이터를 업데이트하기 위해 WHERE 절과 함께 SQL UPDATE 명령을 사용합니다. tutorials_tbl.
예
다음 예제는 tutorial_title tutorial_id가 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>
PHP 스크립트를 사용하여 데이터 업데이트
PHP 함수에 WHERE CLAUSE를 포함하거나 포함하지 않고 SQL UPDATE 명령을 사용할 수 있습니다. mysql_query(). 이 함수는 mysql> 프롬프트에서 실행되는 것과 유사한 방식으로 SQL 명령을 실행합니다.
예
다음 예제는 tutorial_title tutorial_id가 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);
?>
MySQL 테이블에서 레코드를 삭제하려면 SQL 명령을 사용할 수 있습니다. DELETE FROM. mysql> 프롬프트와 PHP와 같은 스크립트에서이 명령을 사용할 수 있습니다.
통사론
다음 코드 블록에는 MySQL 테이블에서 데이터를 삭제하는 DELETE 명령의 일반 SQL 구문이 있습니다.
DELETE FROM table_name [WHERE Clause]
WHERE 절을 지정하지 않으면 주어진 MySQL 테이블에서 모든 레코드가 삭제됩니다.
WHERE 절을 사용하여 모든 조건을 지정할 수 있습니다.
한 번에 단일 테이블의 레코드를 삭제할 수 있습니다.
WHERE 절은 테이블에서 선택한 행을 삭제하려는 경우 매우 유용합니다.
명령 프롬프트에서 데이터 삭제
그러면 WHERE 절과 함께 SQL DELETE 명령을 사용하여 선택한 데이터를 MySQL 테이블로 삭제합니다. tutorials_tbl.
예
다음 예제는 tutorial_id가 3 인 tutorial_tbl에서 레코드를 삭제합니다.
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>
PHP 스크립트를 사용하여 데이터 삭제
PHP 함수에 WHERE CLAUSE를 포함하거나 포함하지 않고 SQL DELETE 명령을 사용할 수 있습니다. mysql_query(). 이 함수는 mysql> 프롬프트에서 실행되는 것과 동일한 방식으로 SQL 명령을 실행합니다.
예
다음 예제를 사용하여 tutorial_id가 3 인 tutorial_tbl에서 레코드를 삭제하십시오.
<?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);
?>
우리는 SQL을 보았다 SELECTMySQL 테이블에서 데이터를 가져 오는 명령. 다음과 같은 조건절을 사용할 수도 있습니다.WHERE 필요한 레코드를 선택하는 절.
'같음'기호 (=)가있는 WHERE 절은 정확히 일치하려는 경우 잘 작동합니다. "tutorial_author = 'Sanjay'"와 같습니다. 그러나 tutorial_author 이름에 "jay"가 포함되어야하는 모든 결과를 필터링하려는 요구 사항이있을 수 있습니다. 이것은 다음을 사용하여 처리 할 수 있습니다.SQL LIKE Clause WHERE 절과 함께.
SQL LIKE 절이 % 문자와 함께 사용되면 UNIX에서와 같이 메타 문자 (*)처럼 작동하고 명령 프롬프트에서 모든 파일 또는 디렉토리를 나열합니다. % 문자가 없으면 LIKE 절은equal to WHERE 절과 함께 서명하십시오.
통사론
다음 코드 블록에는 MySQL 테이블에서 데이터를 가져 오는 LIKE 절과 함께 SELECT 명령의 일반 SQL 구문이 있습니다.
SELECT field1, field2,...fieldN table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
WHERE 절을 사용하여 모든 조건을 지정할 수 있습니다.
LIKE 절을 WHERE 절과 함께 사용할 수 있습니다.
대신 LIKE 절을 사용할 수 있습니다. equals to 기호.
LIKE를 % 기호와 함께 사용하면 메타 문자 검색처럼 작동합니다.
다음을 사용하여 둘 이상의 조건을 지정할 수 있습니다. AND 또는 OR 연산자.
WHERE ... LIKE 절을 DELETE 또는 UPDATE SQL 명령과 함께 사용하여 조건을 지정할 수도 있습니다.
명령 프롬프트에서 LIKE 절 사용
이것은 MySQL 테이블에서 선택한 데이터를 가져 오기 위해 WHERE ... LIKE 절과 함께 SQL SELECT 명령을 사용합니다. tutorials_tbl.
예
다음 예제는 모든 레코드를 반환합니다. tutorials_tbl 저자 이름이 끝나는 테이블 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>
PHP 스크립트 내에서 LIKE 절 사용
WHERE ... LIKE 절의 유사한 구문을 PHP 함수에 사용할 수 있습니다. mysql_query(). 이 함수는 SQL 명령을 실행하고 나중에 다른 PHP 함수를 실행하는 데 사용됩니다.mysql_fetch_array() WHERE ... LIKE 절이 SELECT 명령과 함께 사용되는 경우 선택한 모든 데이터를 가져 오는 데 사용할 수 있습니다.
그러나 WHERE ... LIKE 절이 DELETE 또는 UPDATE 명령과 함께 사용되는 경우 추가 PHP 함수 호출이 필요하지 않습니다.
예
다음 예제를 시도하여 모든 레코드를 반환하십시오. tutorials_tbl 작성자 이름에 포함 된 테이블 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);
?>
우리는 SQL을 보았다 SELECTMySQL 테이블에서 데이터를 가져 오는 명령. 행을 선택하면 MySQL 서버는 결과를 정렬하는 방법을 말하여 달리 지시하지 않는 한 임의의 순서로 자유롭게 반환 할 수 있습니다. 그러나 다음을 추가하여 결과 집합을 정렬합니다.ORDER BY 정렬하려는 열의 이름을 지정하는 절입니다.
통사론
다음 코드 블록은 MySQL 테이블에서 데이터를 정렬하기위한 ORDER BY 절과 함께 SELECT 명령의 일반 SQL 구문입니다.
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
해당 필드가 나열되는 경우 모든 필드에서 반환 된 결과를 정렬 할 수 있습니다.
둘 이상의 필드에서 결과를 정렬 할 수 있습니다.
키워드 ASC 또는 DESC를 사용하여 오름차순 또는 내림차순으로 결과를 얻을 수 있습니다. 기본적으로 오름차순입니다.
일반적인 방법으로 WHERE ... LIKE 절을 사용하여 조건을 입력 할 수 있습니다.
명령 프롬프트에서 ORDER BY 절 사용
이것은 SQL SELECT 명령을 ORDER BY MySQL 테이블에서 데이터를 가져 오는 절 – tutorials_tbl.
예
결과를 오름차순으로 반환하는 다음 예제를 사용해보십시오.
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>
오름차순으로 나열된 모든 저자 이름을 확인하십시오.
PHP 스크립트 내에서 ORDER BY 절 사용
PHP 함수에 ORDER BY 절의 유사한 구문을 사용할 수 있습니다. mysql_query(). 이 함수는 SQL 명령을 실행하고 나중에 다른 PHP 함수를 실행하는 데 사용됩니다.mysql_fetch_array() 선택한 모든 데이터를 가져 오는 데 사용할 수 있습니다.
예
튜토리얼 작성자의 내림차순으로 결과를 반환하는 다음 예제를 사용해보십시오.
<?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);
?>
이전 장에서 우리는 한 번에 하나의 테이블에서 데이터를 가져 왔습니다. 이것은 간단한 테이크에 충분하지만 대부분의 실제 MySQL 사용에서는 단일 쿼리로 여러 테이블에서 데이터를 가져와야하는 경우가 많습니다.
단일 SQL 쿼리에서 여러 테이블을 사용할 수 있습니다. MySQL에서 조인하는 행위는 두 개 이상의 테이블을 단일 테이블로 분할하는 것을 의미합니다.
SELECT, UPDATE 및 DELETE 문에서 JOINS를 사용하여 MySQL 테이블을 조인 할 수 있습니다. 간단한 MySQL JOIN과 다른 LEFT JOIN의 예도 볼 수 있습니다.
명령 프롬프트에서 조인 사용
두 개의 테이블이 있다고 가정합니다. tcount_tbl 과 tutorials_tbl, 튜토리얼에서. 이제 아래에 주어진 예를 살펴보십시오.
예
다음 예-
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>
이제이 두 테이블을 조인하는 SQL 쿼리를 작성할 수 있습니다. 이 쿼리는 테이블에서 모든 작성자를 선택합니다.tutorials_tbl 에서 해당하는 수의 자습서를 선택합니다. 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>
PHP 스크립트에서 조인 사용
PHP 스크립트에서 위에서 언급 한 SQL 쿼리를 사용할 수 있습니다. SQL 쿼리를 PHP 함수로 전달하기 만하면됩니다.mysql_query() 그런 다음 일반적인 방법으로 결과를 가져옵니다.
예
다음 예-
<?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 LEFT JOIN
MySQL 레프트 조인은 단순 조인과 다릅니다. MySQL LEFT JOIN은 왼쪽에있는 테이블을 추가로 고려합니다.
내가 할 경우 LEFT JOIN, 동일한 방식으로 일치하는 모든 레코드를 가져오고 조인의 왼쪽 테이블에서 일치하지 않는 각 레코드에 대한 추가 레코드를 얻습니다. 따라서 모든 AUTHOR가 멘션을 얻도록 보장합니다.
예
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)
JOINS에 익숙해 지려면 더 많은 연습이 필요합니다. 이것은 MySQL / SQL에서 약간 복잡한 개념이며 실제 예제를 수행하는 동안 더 명확해질 것입니다.
우리는 SQL을 보았다 SELECT 명령과 함께 WHERE MySQL 테이블에서 데이터를 가져 오기위한 절이지만 필드 또는 열 값을 비교하는 조건을 제공하려고 할 때 NULL, 제대로 작동하지 않습니다.
이러한 상황을 처리하기 위해 MySQL은 세 가지 연산자를 제공합니다.
IS NULL −이 연산자는 열 값이 NULL 인 경우 true를 반환합니다.
IS NOT NULL −이 연산자는 열 값이 NULL이 아닌 경우 true를 반환합니다.
<=> −이 연산자는 = 연산자와는 달리 두 개의 NULL 값에 대해서도 참인 값을 비교합니다.
NULL과 관련된 조건은 특별합니다. = 사용할 수 없습니다NULL 또는! = NULL열에서 NULL 값을 찾습니다. 그러한 비교는 그것이 사실인지 아닌지를 알 수 없기 때문에 항상 실패합니다. 때로는 NULL = NULL도 실패합니다.
NULL이거나 NULL이 아닌 열을 찾으려면 다음을 사용하십시오. IS NULL 또는 IS NOT NULL.
명령 프롬프트에서 NULL 값 사용
라는 테이블이 있다고 가정합니다. tcount_tbl TUTORIALS 데이터베이스에 있으며 두 개의 열 즉 tutorial_author 과 tutorial_count여기서 NULL tutorial_count는 값을 알 수 없음을 나타냅니다.
예
다음 예제를 시도하십시오-
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>
= 및 != 다음과 같이 NULL 값으로 작동하지 마십시오-
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)
tutorial_count 열이 NULL이거나 NULL이 아닌 레코드를 찾으려면 다음 프로그램과 같이 쿼리를 작성해야합니다.
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)
PHP 스크립트에서 NULL 값 처리
사용할 수 있습니다 if...else NULL 값을 기반으로 쿼리를 준비하는 조건입니다.
예
다음 예제는 tutorial_count 외부에서 가져온 다음 표에서 사용 가능한 값과 비교합니다.
<?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);
?>
MySQL 패턴이 다음과 일치하는 것을 보았습니다. LIKE ...%. MySQL은 정규 표현식과 다음을 기반으로 다른 유형의 패턴 일치 작업을 지원합니다.REGEXP운영자. PHP 또는 PERL을 알고 있다면이 매칭이 정규 표현식을 스크립팅하는 것과 동일하기 때문에 이해하기가 매우 간단합니다.
다음은 패턴 테이블입니다. REGEXP 운영자.
무늬 | 패턴이 일치하는 것 |
---|---|
^ | 문자열의 시작 |
$ | 문자열 끝 |
. | 단일 문자 |
[...] | 대괄호 사이에 나열된 모든 문자 |
[^ ...] | 대괄호 사이에 나열되지 않은 모든 문자 |
p1 | p2 | p3 | 교대; p1, p2 또는 p3 패턴과 일치합니다. |
* | 0 개 이상의 선행 요소 인스턴스 |
+ | 하나 이상의 선행 요소 인스턴스 |
{엔} | 선행 요소의 n 인스턴스 |
{m, n} | 이전 요소의 m-n 인스턴스 |
예
이제 위의 표를 기반으로 다양한 유형의 SQL 쿼리를 장치하여 요구 사항을 충족 할 수 있습니다. 여기에 이해를 돕기 위해 몇 가지를 나열했습니다.
다음과 같은 테이블이 있다고 가정합니다. person_tbl 그리고 그것은 name −
로 시작하는 모든 이름을 찾기위한 쿼리 'st' −
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
로 끝나는 모든 이름을 찾기위한 쿼리 'ok' −
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
다음을 포함하는 모든 이름을 찾기위한 쿼리 'mar' −
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
모음으로 시작하고 다음으로 끝나는 모든 이름을 찾기위한 쿼리 'ok' −
mysql> SELECT FirstName FROM intque.person_tbl WHERE FirstName REGEXP '^[aeiou].*ok$';
트랜잭션은 하나의 단일 작업 단위 인 것처럼 수행되는 데이터베이스 조작 작업의 순차적 그룹입니다. 즉, 그룹 내의 각 개별 작업이 성공하지 않으면 트랜잭션이 완료되지 않습니다. 트랜잭션 내의 작업이 실패하면 전체 트랜잭션이 실패합니다.
실제로 많은 SQL 쿼리를 그룹으로 묶고 트랜잭션의 일부로 모두 함께 실행합니다.
거래의 속성
트랜잭션에는 일반적으로 약어로 참조되는 다음 네 가지 표준 속성이 있습니다. ACID −
Atomicity−이를 통해 작업 단위 내의 모든 작업이 성공적으로 완료됩니다. 그렇지 않으면 트랜잭션이 실패 지점에서 중단되고 이전 작업이 이전 상태로 롤백됩니다.
Consistency − 이것은 성공적으로 커밋 된 트랜잭션에서 데이터베이스가 상태를 적절하게 변경하도록합니다.
Isolation −이를 통해 트랜잭션이 독립적으로 작동하고 서로에게 투명하게 작동 할 수 있습니다.
Durability −이를 통해 시스템 장애시 커밋 된 트랜잭션의 결과 또는 효과가 지속됩니다.
MySQL에서 트랜잭션은 다음 문으로 시작합니다. BEGIN WORK 다음 중 하나로 끝납니다. COMMIT 또는 ROLLBACK성명서. 시작 및 종료 문 사이의 SQL 명령은 트랜잭션의 대부분을 구성합니다.
커밋 및 롤백
이 두 키워드 Commit 과 Rollback 주로 MySQL 트랜잭션에 사용됩니다.
성공적인 트랜잭션이 완료되면 관련된 모든 테이블에 대한 변경 사항이 적용되도록 COMMIT 명령을 발행해야합니다.
실패하면 ROLLBACK 명령을 실행하여 트랜잭션에서 참조 된 모든 테이블을 이전 상태로 되돌려 야합니다.
세션 변수를 설정하여 트랜잭션의 동작을 제어 할 수 있습니다. AUTOCOMMIT. AUTOCOMMIT가 1 (기본값)로 설정된 경우 각 SQL 문 (트랜잭션 내 여부)은 완전한 트랜잭션으로 간주되고 완료 될 때 기본적으로 커밋됩니다.
AUTOCOMMIT가 0으로 설정되면 SET AUTOCOMMIT = 0 명령을 사용하는 경우 후속 명령문은 트랜잭션처럼 작동하며 명시 적 COMMIT 명령문이 발행 될 때까지 활동이 커미트되지 않습니다.
다음을 사용하여 PHP에서 이러한 SQL 명령을 실행할 수 있습니다. mysql_query() 함수.
거래에 대한 일반적인 예
이 이벤트 시퀀스는 사용되는 프로그래밍 언어와 무관합니다. 논리 경로는 응용 프로그램을 만드는 데 사용하는 언어로 만들 수 있습니다.
다음을 사용하여 PHP에서 이러한 SQL 명령을 실행할 수 있습니다. mysql_query() 함수.
SQL 명령을 실행하여 트랜잭션 시작 BEGIN WORK.
SELECT, INSERT, UPDATE 또는 DELETE와 같은 하나 이상의 SQL 명령을 실행하십시오.
오류가없고 모든 것이 귀하의 요구 사항에 맞는지 확인하십시오.
오류가 있으면 ROLLBACK 명령을 발행하고 그렇지 않으면 COMMIT 명령을 발행하십시오.
MySQL의 트랜잭션 안전 테이블 유형
트랜잭션을 직접 사용할 수는 없지만 특정 예외의 경우 사용할 수 있습니다. 그러나 안전하지 않으며 보장되지 않습니다. MySQL 프로그래밍에서 트랜잭션을 사용하려는 경우 특별한 방법으로 테이블을 만들어야합니다. 트랜잭션을 지원하는 많은 유형의 테이블이 있지만 가장 많이 사용되는 테이블은InnoDB.
InnoDB 테이블을 지원하려면 소스에서 MySQL을 컴파일 할 때 특정 컴파일 매개 변수가 필요합니다. MySQL 버전에 InnoDB가 지원되지 않는 경우 인터넷 서비스 공급자에게 InnoDB 테이블 유형을 지원하는 MySQL 버전을 빌드하도록 요청하거나MySQL-Max Binary Distribution Windows 또는 Linux / UNIX의 경우 개발 환경에서 테이블 유형으로 작업합니다.
MySQL 설치가 InnoDB 테이블을 지원하는 경우 간단히 TYPE = InnoDB 테이블 생성 문에 대한 정의.
예를 들어 다음 코드는 다음과 같은 InnoDB 테이블을 생성합니다. 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)
이노에 대한 자세한 내용은 다음 링크를 클릭 할 수 있습니다 - 이노을
다음과 같은 다른 테이블 유형을 사용할 수 있습니다. GEMINI 또는 BDB하지만이 두 테이블 유형을 지원하는지 여부는 설치에 따라 다릅니다.
MySQL ALTER 명령은 테이블, 테이블 필드의 이름을 변경하거나 테이블의 기존 열을 추가 또는 삭제하려는 경우 매우 유용합니다.
테이블 생성부터 시작하겠습니다. 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)
열 삭제, 추가 또는 재배치
위의 MySQL 테이블에서 기존 열 i를 삭제하려면 다음을 사용합니다. DROP 절과 함께 ALTER 아래와 같이 명령-
mysql> ALTER TABLE testalter_tbl DROP i;
ㅏ DROP 열이 테이블에 남아있는 유일한 경우 절이 작동하지 않습니다.
열을 추가하려면 ADD를 사용하고 열 정의를 지정하십시오. 다음 문은i testalter_tbl에 열-
mysql> ALTER TABLE testalter_tbl ADD i INT;
이 명령문을 발행 한 후 testalter는 테이블을 처음 작성할 때와 동일한 두 개의 컬럼을 포함하지만 동일한 구조를 갖지 않습니다. 기본적으로 테이블 끝에 추가되는 새 열이 있기 때문입니다. 그래서 비록i 원래 mytbl의 첫 번째 열 이었지만 이제는 마지막 열입니다.
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)
테이블 내의 특정 위치에 열을 원함을 나타내려면 FIRST를 사용하여 첫 번째 열로 만들거나 AFTER col_name 새 열이 col_name 뒤에 위치해야 함을 나타냅니다.
다음을 시도하십시오 ALTER TABLE 문, 사용 SHOW COLUMNS 각각의 효과를 확인하려면
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;
FIRST 및 AFTER 지정자는 ADD 절에서만 작동합니다. 즉, 테이블 내에서 기존 열의 위치를 변경하려면 먼저DROP 그 다음 ADD 새로운 위치에 있습니다.
열 정의 또는 이름 변경 (변경)
열 정의를 변경하려면 다음을 사용하십시오. MODIFY 또는 CHANGE ALTER 명령과 함께 절.
예를 들어, 열을 변경하려면 c CHAR (1)에서 CHAR (10)까지 다음 명령을 사용할 수 있습니다.
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
와 CHANGE, 구문이 약간 다릅니다. CHANGE 키워드 뒤에 변경할 열의 이름을 지정한 다음 새 이름을 포함하는 새 정의를 지정합니다.
다음 예제를 시도하십시오-
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
이제 CHANGE를 사용하여 변환하는 경우 j ...에서 BIGINT 돌아가다 INT 열 이름을 변경하지 않고 다음과 같은 명령문이됩니다.
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
The Effect of ALTER TABLE on Null and Default Value Attributes− 열을 수정하거나 변경할 때 열에 NULL 값을 포함 할 수 있는지 여부와 기본값을 지정할 수도 있습니다. 실제로 이렇게하지 않으면 MySQL은 이러한 속성에 대한 값을 자동으로 할당합니다.
다음 코드 블록은 예입니다. NOT NULL 열의 기본 값은 100입니다.
mysql> ALTER TABLE testalter_tbl
-> MODIFY j BIGINT NOT NULL DEFAULT 100;
위의 명령을 사용하지 않으면 MySQL은 모든 열에서 NULL 값을 채 웁니다.
열의 기본값 변경 (변경)
다음을 사용하여 모든 열의 기본값을 변경할 수 있습니다. ALTER 명령.
다음 예제를 시도해보십시오.
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)
DROP 절을 사용하여 모든 열에서 기본 제약 조건을 제거 할 수 있습니다. ALTER 명령.
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)
테이블 유형 변경 (변경)
다음을 사용하여 테이블 유형을 사용할 수 있습니다. TYPEALTER 명령과 함께 절. 다음 예제를 사용하여testalter_tbl ...에 MYISAM 테이블 유형.
현재 테이블 유형을 찾으려면 SHOW TABLE STATUS 성명서.
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)
테이블 이름 바꾸기 (변경)
테이블의 이름을 바꾸려면 RENAME 의 옵션 ALTER TABLE 성명서.
이름을 바꾸려면 다음 예제를 시도하십시오. testalter_tbl ...에 alter_tbl.
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
ALTER 명령을 사용하여 MySQL 파일에 INDEX 명령을 생성하고 삭제할 수 있습니다. 다음 장에서이 명령에 대해 자세히 설명합니다.
데이터베이스 인덱스는 테이블의 작업 속도를 향상시키는 데이터 구조입니다. 인덱스는 하나 이상의 열을 사용하여 생성 할 수 있으며, 빠른 임의 조회와 레코드 액세스의 효율적인 순서를위한 기반을 제공합니다.
인덱스를 만드는 동안 SQL 쿼리를 만들고 해당 열에 하나 이상의 인덱스를 만드는 데 사용할 모든 열을 고려해야합니다.
실제로 인덱스는 기본 키 또는 인덱스 필드와 실제 테이블에 대한 각 레코드에 대한 포인터를 유지하는 테이블 유형이기도합니다.
사용자는 인덱스를 볼 수 없으며 쿼리 속도를 높이기 위해 사용되며 데이터베이스 검색 엔진에서 매우 빠르게 레코드를 찾는 데 사용됩니다.
INSERT 및 UPDATE 문은 인덱스가있는 테이블에서 더 많은 시간이 걸리는 반면 SELECT 문은 이러한 테이블에서 빨라집니다. 그 이유는 삽입 또는 업데이트를 수행하는 동안 데이터베이스도 인덱스 값을 삽입하거나 업데이트해야하기 때문입니다.
단순하고 고유 한 색인
테이블에 고유 인덱스를 만들 수 있습니다. 고유 인덱스는 두 행이 동일한 인덱스 값을 가질 수 없음을 의미합니다. 다음은 테이블에 인덱스를 만드는 구문입니다.
CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);
하나 이상의 열을 사용하여 인덱스를 만들 수 있습니다.
예를 들어, 우리는 tutorials_tbl 사용 tutorial_author.
CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author)
테이블에 간단한 인덱스를 만들 수 있습니다. 그냥 생략UNIQUE쿼리에서 키워드를 사용하여 간단한 색인을 만듭니다. 단순 인덱스는 테이블에서 중복 값을 허용합니다.
열의 값을 내림차순으로 인덱싱하려는 경우 열 이름 뒤에 예약어 DESC를 추가 할 수 있습니다.
mysql> CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author DESC)
INDEX를 추가 및 삭제하는 ALTER 명령
테이블에 인덱스를 추가하기위한 네 가지 유형의 명령문이 있습니다.
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list) −이 문장은 PRIMARY KEY이는 인덱싱 된 값이 고유해야하며 NULL 일 수 없음을 의미합니다.
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list) −이 문은 값이 고유해야하는 인덱스를 생성합니다 (여러 번 나타날 수있는 NULL 값 제외).
ALTER TABLE tbl_name ADD INDEX index_name (column_list) − 이것은 어떤 값이 두 번 이상 나타날 수있는 일반 인덱스를 추가합니다.
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list) − 이것은 텍스트 검색 목적으로 사용되는 특별한 FULLTEXT 인덱스를 생성합니다.
다음 코드 블록은 기존 테이블에 인덱스를 추가하는 예제입니다.
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
다음을 사용하여 INDEX를 삭제할 수 있습니다. DROP ALTER 명령과 함께 절.
위에서 만든 인덱스를 삭제하려면 다음 예제를 시도하십시오.
mysql> ALTER TABLE testalter_tbl DROP INDEX (c);
ALTER 명령과 함께 DROP 절을 사용하여 INDEX를 삭제할 수 있습니다.
PRIMARY KEY를 추가 및 삭제하는 ALTER 명령
동일한 방법으로 기본 키를 추가 할 수도 있습니다. 그러나 기본 키가 NULL이 아닌 열에서 작동하는지 확인하십시오.
다음 코드 블록은 기존 테이블에 기본 키를 추가하는 예입니다. 이렇게하면 먼저 열이 NOT NULL이 된 다음 기본 키로 추가됩니다.
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
ALTER 명령을 사용하여 다음과 같이 기본 키를 삭제할 수 있습니다.
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
PRIMARY KEY가 아닌 인덱스를 삭제하려면 인덱스 이름을 지정해야합니다.
INDEX 정보 표시
사용할 수 있습니다 SHOW INDEX명령은 테이블과 관련된 모든 인덱스를 나열합니다. 세로 형식 출력 (\ G로 지정됨)은 종종이 명령문과 함께 유용하여 긴 줄을 둘러싸는 것을 방지합니다.
다음 예제를 시도하십시오-
mysql> SHOW INDEX FROM table_name\G
........
임시 테이블은 경우에 따라 임시 데이터를 유지하는 데 매우 유용 할 수 있습니다. 임시 테이블에 대해 알아야 할 가장 중요한 점은 현재 클라이언트 세션이 종료 될 때 삭제된다는 것입니다.
임시 테이블이란 무엇입니까?
임시 테이블은 MySQL 버전 3.23에 추가되었습니다. 3.23 이전 버전의 MySQL을 사용하는 경우 임시 테이블을 사용할 수 없지만 사용할 수 있습니다.Heap Tables.
앞서 언급했듯이 임시 테이블은 세션이 살아있는 동안 만 지속됩니다. PHP 스크립트에서 코드를 실행하면 스크립트 실행이 완료되면 임시 테이블이 자동으로 삭제됩니다. MySQL 클라이언트 프로그램을 통해 MySQL 데이터베이스 서버에 연결 한 경우 클라이언트를 닫거나 테이블을 수동으로 삭제할 때까지 임시 테이블이 존재합니다.
예
다음 프로그램은 임시 테이블의 사용법을 보여주는 예입니다. PHP 스크립트에서 동일한 코드를 사용할 수 있습니다.mysql_query() 함수.
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)
당신이 발행 할 때 SHOW TABLES명령을 사용하면 임시 테이블이 목록에 나열되지 않습니다. 이제 MySQL 세션에서 로그 아웃 한 다음SELECT명령을 실행하면 데이터베이스에서 사용 가능한 데이터를 찾을 수 없습니다. 임시 테이블조차도 존재하지 않습니다.
임시 테이블 삭제
기본적으로 모든 임시 테이블은 데이터베이스 연결이 종료 될 때 MySQL에 의해 삭제됩니다. 그래도 중간에 삭제하려면 다음을 발행하여 삭제합니다.DROP TABLE 명령.
다음 프로그램은 임시 테이블 삭제에 대한 예입니다.
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
테이블의 정확한 사본이 필요한 상황이있을 수 있습니다. CREATE TABLE ... SELECT 복사본에 동일한 인덱스, 기본값 등이 포함되어야하므로 용도에 적합하지 않습니다.
아래 단계에 따라이 상황을 처리 할 수 있습니다.
SHOW CREATE TABLE을 사용하여 소스 테이블의 구조, 인덱스 및 모두를 지정하는 CREATE TABLE 문을 가져옵니다.
문을 수정하여 테이블 이름을 복제 테이블의 이름으로 변경하고 문을 실행합니다. 이렇게하면 정확한 복제 테이블을 갖게됩니다.
선택적으로 테이블 내용도 복사해야하는 경우 INSERT INTO ... SELECT 문도 실행하십시오.
예
다음 예제를 사용하여 복제 테이블을 만듭니다. tutorials_tbl.
Step 1 − 테이블에 대한 완전한 구조를 얻습니다.
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 −이 테이블의 이름을 변경하고 다른 테이블을 생성하십시오.
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− 2 단계를 실행 한 후 데이터베이스에 복제 테이블을 생성합니다. 기존 테이블에서 데이터를 복사하려면 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
마지막으로, 원하는대로 정확한 복제 테이블을 갖게됩니다.
MySQL 메타 데이터 얻기 및 사용
MySQL에서 갖고 싶은 정보에는 세 가지 유형이 있습니다.
Information about the result of queries − 여기에는 SELECT, UPDATE 또는 DELETE 문에 의해 영향을받는 레코드 수가 포함됩니다.
Information about the tables and databases − 여기에는 테이블 및 데이터베이스의 구조와 관련된 정보가 포함됩니다.
Information about the MySQL server − 여기에는 데이터베이스 서버의 상태, 버전 번호 등이 포함됩니다.
MySQL 프롬프트에서이 모든 정보를 얻는 것은 매우 쉽지만 PERL 또는 PHP API를 사용하는 동안이 모든 정보를 얻으려면 명시 적으로 다양한 API를 호출해야합니다.
쿼리의 영향을받는 행 수 얻기
이제이 정보를 얻는 방법을 살펴 보겠습니다.
PERL 예
DBI 스크립트에서 영향을받은 행 수는 do( ) 또는 execute( ) 명령을 실행하는 방법에 따라 다릅니다.
# 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);
PHP 예
PHP에서 mysql_affected_rows( ) 쿼리가 변경된 행 수를 알아내는 함수입니다.
$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");
테이블 및 데이터베이스 나열
데이터베이스 서버에서 사용할 수있는 모든 데이터베이스와 테이블을 나열하는 것은 매우 쉽습니다. 결과는null 충분한 권한이없는 경우.
다음 코드 블록에 표시된 방법 외에도 사용할 수 있습니다. SHOW TABLES 또는 SHOW DATABASES 쿼리를 사용하여 PHP 또는 PERL에서 테이블 또는 데이터베이스 목록을 가져옵니다.
PERL 예
# Get all the tables available in current database.
my @tables = $dbh->tables ( );
foreach $table (@tables ){ print "Table Name $table\n";
}
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);
?>
서버 메타 데이터 가져 오기
MySQL 프롬프트에서 실행하거나 PHP와 같은 스크립트를 사용하여 데이터베이스 서버에 대한 다양한 중요 정보를 얻을 수있는 몇 가지 중요한 명령이 MySQL에 있습니다.
Sr. 아니. | 명령 및 설명 |
---|---|
1 | SELECT VERSION( ) 서버 버전 문자열 |
2 | SELECT DATABASE( ) 현재 데이터베이스 이름 (없으면 비어 있음) |
삼 | SELECT USER( ) 현재 사용자 이름 |
4 | SHOW STATUS 서버 상태 표시기 |
5 | SHOW VARIABLES 서버 구성 변수 |
시퀀스는 특정 요구에 따라 순서대로 생성되는 정수 1, 2, 3, ...의 집합입니다. 많은 애플리케이션이 고유 한 값을 포함하기 위해 테이블의 각 행을 요구하고 시퀀스를 생성하는 쉬운 방법을 제공하므로 시퀀스는 데이터베이스에서 자주 사용됩니다.
이 장에서는 MySQL에서 시퀀스를 사용하는 방법에 대해 설명합니다.
AUTO_INCREMENT 컬럼 사용
MySQL에서 Sequences를 사용하는 가장 간단한 방법은 열을 다음과 같이 정의하는 것입니다. AUTO_INCREMENT 나머지는 MySQL에 맡기십시오.
예
다음 예제를 시도해보십시오. 이것은 테이블을 생성하고 그 후에는 MySQL에 의해 자동 증분되기 때문에 레코드 ID를 제공 할 필요가없는이 테이블에 몇 개의 행을 삽입합니다.
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)
AUTO_INCREMENT 값 얻기
그만큼 LAST_INSERT_ID( )SQL 함수이므로 SQL 문을 실행하는 방법을 이해하는 모든 클라이언트 내에서 사용할 수 있습니다. 그렇지 않으면 PERL 및 PHP 스크립트는 마지막 레코드의 자동 증가 값을 검색하는 독점 기능을 제공합니다.
PERL 예
사용 mysql_insertid 얻기위한 속성 AUTO_INCREMENT쿼리에 의해 생성 된 값입니다. 이 속성은 쿼리를 실행하는 방법에 따라 데이터베이스 핸들 또는 명령문 핸들을 통해 액세스됩니다.
다음 예제는 데이터베이스 핸들을 통해이를 참조합니다.
$dbh->do ("INSERT INTO insect (name,date,origin) VALUES('moth','2001-09-14','windowsill')"); my $seq = $dbh->{mysql_insertid};
PHP 예
AUTO_INCREMENT 값을 생성하는 쿼리를 실행 한 후 다음을 호출하여 값을 검색합니다. mysql_insert_id( ) 명령.
mysql_query ("INSERT INTO insect (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id);
$seq = mysql_insert_id ($conn_id);
기존 시퀀스 번호 다시 매기기
테이블에서 많은 레코드를 삭제하고 모든 레코드의 순서를 다시 지정하려는 경우가있을 수 있습니다. 이것은 간단한 트릭을 사용하여 수행 할 수 있지만 테이블이 다른 테이블과 조인하는 경우 매우주의해야합니다.
AUTO_INCREMENT 컬럼의 재 시퀀싱이 불가피하다고 판단되는 경우이를 수행하는 방법은 테이블에서 컬럼을 삭제 한 다음 다시 추가하는 것입니다.
다음 예는 번호를 다시 매기는 방법을 보여줍니다. id values 이 기술을 사용하여 표에서.
mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
특정 값에서 시퀀스 시작
기본적으로 MySQL은 1부터 시퀀스를 시작하지만 테이블 생성시 다른 숫자도 지정할 수 있습니다.
다음 프로그램은 MySQL이 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
);
또는 테이블을 생성 한 다음 다음을 사용하여 초기 시퀀스 값을 설정할 수 있습니다. ALTER TABLE 명령.
mysql> ALTER TABLE t AUTO_INCREMENT = 100;
일반적으로 테이블 또는 결과 집합에 중복 레코드가 포함되는 경우가 있습니다. 대부분의 경우 허용되지만 중복 레코드를 중지해야하는 경우도 있습니다. 중복 레코드를 식별하고 테이블에서 제거해야합니다. 이 장에서는 테이블에서 중복 레코드 발생을 방지하는 방법과 기존 중복 레코드를 제거하는 방법에 대해 설명합니다.
테이블에서 중복 발생 방지
사용할 수 있습니다 PRIMARY KEY 또는 UNIQUE 중복 레코드를 중지하기 위해 적절한 필드가있는 테이블에 대한 색인화.
예를 들어 보겠습니다. 다음 표에는 이러한 인덱스 또는 기본 키가 포함되어 있지 않으므로 first_name 과 last_name.
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
이름과 성 값이 동일한 여러 레코드가이 테이블에 생성되지 않도록하려면 PRIMARY KEY그 정의에. 이렇게 할 때 인덱싱 된 열을 다음과 같이 선언해야합니다.NOT NULL, 왜냐하면 PRIMARY KEY 허용하지 않습니다 NULL 값-
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)
);
테이블에 고유 인덱스가 있으면 일반적으로 인덱스를 정의하는 열의 기존 레코드를 복제하는 테이블에 레코드를 삽입하면 오류가 발생합니다.
사용 INSERT IGNORE 대신 명령 INSERT명령. 레코드가 기존 레코드를 복제하지 않으면 MySQL은 평소와 같이 삽입합니다. 레코드가 중복 된 경우IGNORE 키워드는 MySQL에 오류를 생성하지 않고 자동으로 삭제하도록 지시합니다.
다음 예제는 오류가 발생하지 않으며 동시에 중복 레코드도 삽입하지 않습니다.
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)
사용 REPLACEINSERT 명령이 아닌 명령입니다. 새 레코드 인 경우 INSERT와 마찬가지로 삽입됩니다. 중복 된 경우 새 레코드가 이전 레코드를 대체합니다.
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)
INSERT IGNORE 및 REPLACE 명령은 적용하려는 중복 처리 동작에 따라 선택해야합니다. INSERT IGNORE 명령은 중복 된 레코드의 첫 번째 세트를 유지하고 나머지는 버립니다. REPLACE 명령은 마지막 중복 세트를 유지하고 이전 항목을 지 웁니다.
고유성을 강화하는 또 다른 방법은 UNIQUE 테이블에 대한 PRIMARY KEY가 아닌 인덱스.
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
중복 계산 및 식별
다음은 테이블에서 first_name 및 last_name이있는 중복 레코드를 계산하는 쿼리입니다.
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
이 쿼리는 person_tbl 테이블의 모든 중복 레코드 목록을 반환합니다. 일반적으로 중복되는 값 세트를 식별하려면 아래 단계를 따르십시오.
중복 될 수있는 값이 포함 된 열을 판별하십시오.
열 선택 목록에 해당 열을 COUNT(*).
열 나열 GROUP BY 절도 있습니다.
추가하다 HAVING 그룹 수가 1보다 커야 함을 요구하여 고유 한 값을 제거하는 절입니다.
쿼리 결과에서 중복 제거
사용할 수 있습니다 DISTINCT 명령을 SELECT 문과 함께 사용하여 테이블에서 사용할 수있는 고유 한 레코드를 찾습니다.
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl
-> ORDER BY last_name;
DISTINCT 명령에 대한 대안은 선택한 열의 이름을 지정하는 GROUP BY 절을 추가하는 것입니다. 이렇게하면 중복을 제거하고 지정된 열에서 고유 한 값 조합 만 선택하는 효과가 있습니다.
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
테이블 교체를 사용하여 중복 제거
테이블에 중복 레코드가 있고 해당 테이블에서 모든 중복 레코드를 제거하려면 아래 제공된 절차를 따르십시오.
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;
테이블에서 중복 레코드를 제거하는 쉬운 방법은 해당 테이블에 INDEX 또는 PRIMARY KEY를 추가하는 것입니다. 이 테이블을 이미 사용할 수있는 경우에도이 기술을 사용하여 중복 레코드를 제거 할 수 있으며 앞으로도 안전 할 것입니다.
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);
웹 페이지를 통해 사용자 입력을 가져 와서 MySQL 데이터베이스에 삽입하면 다음과 같은 보안 문제로 인해 자신을 활짝 열어 놓을 가능성이 있습니다. SQL Injection. 이 장에서는 이런 일이 발생하지 않도록하는 방법과 스크립트 및 MySQL 문을 보호하는 방법을 설명합니다.
SQL 주입은 일반적으로 사용자에게 이름과 같은 입력을 요청할 때 발생하며 이름 대신 데이터베이스에서 무의식적으로 실행할 MySQL 문을 제공합니다.
사용자가 제공 한 데이터를 신뢰하지 말고 유효성 검사 후에 만이 데이터를 처리하십시오. 일반적으로 이것은 패턴 일치에 의해 수행됩니다. 다음 예에서 사용자 이름은 영숫자 문자와 밑줄 및 8-20 자 사이의 길이로 제한됩니다. 필요에 따라 이러한 규칙을 수정하십시오.
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysql_query("SELECT * FROM users WHERE username = $matches[0]");
} else {
echo "username not accepted";
}
이 문제를 설명하기 위해 다음 발췌를 고려하십시오.
// supposed input
$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name = '{$name}'");
함수 호출은 사용자 테이블에서 레코드를 검색해야합니다. 여기서 이름 열은 사용자가 지정한 이름과 일치합니다. 정상적인 상황에서 $ name에는 영숫자 문자와 공백 만 포함됩니다. 하지만 여기에 완전히 새로운 쿼리를 추가하여$name, 데이터베이스 호출이 재앙으로 바뀝니다. 삽입 된 DELETE 쿼리는 사용자의 모든 레코드를 제거합니다.
다행히도 MySQL을 사용하는 경우 mysql_query()함수는 단일 함수 호출에서 쿼리 스택 또는 여러 쿼리 실행을 허용하지 않습니다. 쿼리를 스택하려고하면 호출이 실패합니다.
그러나 다음과 같은 다른 PHP 데이터베이스 확장은 SQLite 과 PostgreSQL, 스택 쿼리를 즐겁게 수행하고 하나의 문자열로 제공된 모든 쿼리를 실행하고 심각한 보안 문제를 만듭니다.
SQL 주입 방지
PERL 및 PHP와 같은 스크립팅 언어에서 모든 이스케이프 문자를 현명하게 처리 할 수 있습니다. PHP 용 MySQL 확장은 다음 기능을 제공합니다.mysql_real_escape_string() 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
LIKE 문제를 해결하려면 사용자 지정 이스케이프 메커니즘이 사용자가 제공 한 % 및 _ 문자를 리터럴로 변환해야합니다. 사용하다addcslashes(), 이스케이프 할 문자 범위를 지정할 수있는 함수입니다.
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_"); // $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
테이블 데이터를 텍스트 파일로 내보내는 가장 간단한 방법은 SELECT...INTO OUTFILE 쿼리 결과를 서버 호스트의 파일로 직접 내보내는 문입니다.
SELECT ... INTO OUTFILE 문을 사용하여 데이터 내보내기
이 명령문의 구문은 일반 SELECT 명령 INTO OUTFILE filename끝에. 기본 출력 형식은 LOAD DATA 명령과 동일합니다. 따라서 다음 문은tutorials_tbl 테이블에 /tmp/tutorials.txt 탭으로 구분 된 줄 바꿈으로 끝나는 파일로.
mysql> SELECT * FROM tutorials_tbl
-> INTO OUTFILE '/tmp/tutorials.txt';
열과 레코드를 인용하고 구분하는 방법을 나타내는 다양한 옵션을 사용하여 출력 형식을 변경할 수 있습니다. CRLF로 끝나는 행이있는 CSV 형식으로 tutorial_tbl 테이블을 내보내려면 다음 코드를 사용하십시오.
mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/tutorials.txt'
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
-> LINES TERMINATED BY '\r\n';
그만큼 SELECT ... INTO OUTFILE 다음과 같은 속성이 있습니다-
출력 파일은 MySQL 서버에서 직접 생성하므로 파일 이름은 서버 호스트에서 파일을 기록 할 위치를 나타내야합니다. 다음과 유사한 명령문의 LOCAL 버전은 없습니다.LOCAL 버전 LOAD DATA.
당신은 MySQL FILE 실행 권한 SELECT ... INTO 성명서.
출력 파일이 이미 존재하지 않아야합니다. 이것은 MySQL이 중요한 파일을 막는 것을 방지합니다.
서버 호스트에 로그인 계정이 있거나 해당 호스트에서 파일을 검색 할 수있는 방법이 있어야합니다. 그렇지 않으면SELECT ... INTO OUTFILE 명령은 당신에게 가치가 없을 것입니다.
UNIX에서는 파일이 생성됩니다. world readableMySQL 서버가 소유하고 있습니다. 즉, 파일을 읽을 수는 있지만 삭제할 수는 없습니다.
원시 데이터로 테이블 내보내기
그만큼 mysqldump프로그램은 테이블과 데이터베이스를 복사하거나 백업하는 데 사용됩니다. 테이블 출력을 다음 중 하나로 쓸 수 있습니다.Raw Datafile 또는 세트로 INSERT 테이블의 레코드를 다시 만드는 문.
테이블을 데이터 파일로 덤프하려면 다음을 지정해야합니다. --tab MySQL 서버가 파일을 작성할 디렉토리를 나타내는 옵션입니다.
예를 들어, tutorials_tbl 테이블에서 TUTORIALS 데이터베이스를 파일에 /tmp 다음과 같은 명령을 사용하십시오.
$ mysqldump -u root -p --no-create-info \
--tab=/tmp tutorials tutorials_tbl
password ******
SQL 형식으로 테이블 내용 또는 정의 내보내기
SQL 형식의 테이블을 파일로 내보내려면 아래 표시된 명령을 사용하십시오.
$ mysqldump -u root -p TUTORIALS tutorials_tbl > dump.txt
password ******
아래와 같은 내용이 담긴 파일이 생성됩니다.
-- 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');
여러 테이블을 덤프하려면 모두 이름을 지정한 다음 데이터베이스 이름 인수를 지정하십시오. 전체 데이터베이스를 덤프하려면 다음 코드 블록과 같이 데이터베이스 뒤에 테이블 이름을 지정하지 마십시오.
$ mysqldump -u root -p TUTORIALS > database_dump.txt
password ******
호스트에서 사용 가능한 모든 데이터베이스를 백업하려면 다음 코드를 사용하십시오.
$ mysqldump -u root -p --all-databases > database_dump.txt
password ******
--all-databases 옵션은 MySQL 3.23.12 버전에서 사용할 수 있습니다. 이 방법은 데이터베이스 백업 전략을 구현하는 데 사용할 수 있습니다.
테이블 또는 데이터베이스를 다른 호스트로 복사
한 MySQL 서버에서 다른 서버로 테이블 또는 데이터베이스를 복사하려면 mysqldump 데이터베이스 이름과 테이블 이름으로.
소스 호스트에서 다음 명령을 실행합니다. 이렇게하면 전체 데이터베이스가dump.txt 파일.
$ mysqldump -u root -p database_name table_name > dump.txt
password *****
위에서 설명한대로 특정 테이블 이름을 사용하지 않고 전체 데이터베이스를 복사 할 수 있습니다.
이제 다른 호스트에 ftp dump.txt 파일을 설치하고 다음 명령을 사용합니다. 이 명령을 실행하기 전에 대상 서버에 database_name을 작성했는지 확인하십시오.
$ mysql -u root -p database_name < dump.txt
password *****
중간 파일을 사용하지 않고이를 수행하는 또 다른 방법은 mysqldump의 출력을 네트워크를 통해 원격 MySQL 서버로 직접 보내는 것입니다. 소스 데이터베이스가있는 호스트에서 두 서버에 모두 연결할 수있는 경우 다음 명령을 사용하십시오 (두 서버 모두에 대한 액세스 권한이 있는지 확인하십시오).
$ mysqldump -u root -p database_name \
| mysql -h other-host.com database_name
mysqldump에서 명령의 절반은 로컬 서버에 연결하고 덤프 출력을 파이프에 씁니다. 명령의 나머지 절반은 other-host.com의 원격 MySQL 서버에 연결됩니다. 입력을 위해 파이프를 읽고 각 문을 other-host.com 서버로 보냅니다.
MySQL에는 이전에 백업 한 파일에서 MySQL 데이터베이스로 데이터를로드하는 두 가지 간단한 방법이 있습니다.
LOAD DATA로 데이터 가져 오기
MySQL은 대량 데이터 로더 역할을하는 LOAD DATA 문을 제공합니다. 다음은 파일을 읽는 문 예입니다.dump.txt 현재 디렉토리에서 테이블에로드합니다. mytbl 현재 데이터베이스에서.
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
만약 LOCAL 키워드가 없으면 MySQL은 다음을 사용하여 서버 호스트에서 데이터 파일을 찾습니다. looking into absolute pathname, 파일 시스템의 루트에서 시작하여 파일의 위치를 완전히 지정합니다. MySQL은 주어진 위치에서 파일을 읽습니다.
기본적으로, LOAD DATA 데이터 파일에 줄 바꿈 (줄 바꿈)으로 끝나는 줄이 포함되어 있고 한 줄 내의 데이터 값이 탭으로 구분된다고 가정합니다.
파일 형식을 명시 적으로 지정하려면 FIELDS 라인 내의 필드 특성을 설명하는 절 및 LINES줄 끝 시퀀스를 지정하는 절. 다음과 같은LOAD DATA 문은 데이터 파일이 콜론으로 구분 된 값과 캐리지 리턴 및 줄 바꾸기 문자로 끝나는 줄을 포함하도록 지정합니다.
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
-> FIELDS TERMINATED BY ':'
-> LINES TERMINATED BY '\r\n';
LOAD DATA 명령은 데이터 파일의 열이 테이블의 열과 순서가 같다고 가정합니다. 그렇지 않은 경우 데이터 파일 열을로드해야하는 테이블 열을 나타내는 목록을 지정할 수 있습니다. 테이블에 a, b 및 c 열이 있지만 데이터 파일의 연속 열이 b, c 및 a 열에 해당한다고 가정합니다.
다음 코드 블록과 같이 파일을로드 할 수 있습니다.
mysql> LOAD DATA LOCAL INFILE 'dump.txt'
-> INTO TABLE mytbl (b, c, a);
mysqlimport로 데이터 가져 오기
MySQL에는 또한 다음과 같은 유틸리티 프로그램이 포함되어 있습니다. mysqlimport 이는 LOAD DATA 주변의 래퍼 역할을하므로 명령 줄에서 직접 입력 파일을로드 할 수 있습니다.
데이터를로드하려면 dump.txt 으로 mytbl, UNIX 프롬프트에서 다음 명령을 사용하십시오.
$ mysqlimport -u root -p --local database_name dump.txt
password *****
사용하는 경우 mysqlimport, 명령 줄 옵션은 형식 지정자를 제공합니다. 그만큼mysqlimport 앞의 두 가지에 해당하는 명령 LOAD DATA 문은 다음 코드 블록과 같습니다.
$ mysqlimport -u root -p --local --fields-terminated-by = ":" \
--lines-terminated-by = "\r\n" database_name dump.txt
password *****
옵션을 지정하는 순서는 모두 데이터베이스 이름 앞에 와야한다는 점을 제외하면 mysqlimport에는 중요하지 않습니다.
그만큼 mysqlimport 문은 --columns 열 순서를 지정하는 옵션-
$ mysqlimport -u root -p --local --columns=b,c,a \
database_name dump.txt
password *****
따옴표 및 특수 문자 처리
FIELDS 절은 다음과 같은 다른 형식 옵션을 지정할 수 있습니다. TERMINATED BY. 기본적으로 LOAD DATA는 값이 인용되지 않은 것으로 가정하고 백 슬래시 (\)를 특수 문자의 이스케이프 문자로 해석합니다. 값 인용 문자를 명시 적으로 나타내려면ENCLOSED BY명령. MySQL은 입력 처리 중에 데이터 값 끝에서 해당 문자를 제거합니다. 기본 이스케이프 문자를 변경하려면ESCAPED BY.
ENCLOSED BY를 지정하여 따옴표 문자가 데이터 값에서 제거되어야 함을 나타내면 따옴표 문자를 두 배로 늘리거나 앞에 이스케이프 문자를 추가하여 데이터 값 내에 문자 그대로 포함시킬 수 있습니다.
예를 들어 따옴표 및 이스케이프 문자가 "및 \ 인 경우 입력 값 "a""b\"c" 다음과 같이 해석됩니다. a"b"c.
에 대한 mysqlimport, 따옴표 및 이스케이프 값을 지정하기위한 해당 명령 줄 옵션은 다음과 같습니다. --fields-enclosed-by 과 --fields-escaped-by.