>  기사  >  데이터 베이스  >  MySQL 시작하기 튜토리얼 7 - 일반적인 데이터베이스 쿼리의 예

MySQL 시작하기 튜토리얼 7 - 일반적인 데이터베이스 쿼리의 예

黄舟
黄舟원래의
2017-02-23 11:44:511119검색

다음은 MySQL을 사용하여 몇 가지 일반적인 문제를 해결하는 방법에 대한 몇 가지 예입니다.

일부 예에서는 데이터베이스 테이블 "shop"이 특정 판매자(딜러)의 각 품목(품목 번호) 가격을 저장하는 데 사용됩니다. 각 판매자가 각 항목에 대해 고정 가격을 갖고 있다고 가정하면 (항목, 판매자)가 레코드의 기본 키입니다.

명령줄 도구 mysql을 시작하고 데이터베이스

shell> mysql your-database-name

를 선택합니다(대부분의 MySQL에서는 테스트 데이터베이스를 사용할 수 있습니다).

다음 문을 사용하여 샘플 테이블을 생성할 수 있습니다.

mysql> CREATE TABLE shop (     -> article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,     -> dealer  CHAR(20)                 DEFAULT ''     NOT NULL,     -> price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,     -> PRIMARY KEY(article, dealer)); mysql> INSERT INTO shop VALUES     -> (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),     -> (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

문을 실행한 후 테이블에는 다음이 포함되어야 합니다.

mysql> SELECT * FROM shop; +---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | A      |  3.45 |
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | B      |  1.45 |
|    0003 | C      |  1.69 |
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

열의 최대값

"가장 큰 품목 번호는 무엇입니까?"

SELECT MAX(article) AS article FROM shop;

+---------+
| article |
+---------+
|       4 |
+---------+

2. 열의 최대값이 있는 행

과제: 품목 번호, 판매자 및 가격 찾기 . 하위 쿼리를 사용하면 쉽게 수행할 수 있습니다.

SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop);

또 다른 해결책은 모든 행을 가격별로 내림차순으로 정렬하고 MySQL특정 LIMIT 절이 있는 첫 번째 행만 가져오는 것입니다.

SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;

참고: 가장 비싼 품목이 여러 개 있는 경우(예: 가격이 개당 19.95인 경우) LIMIT 솔루션은 그 중 하나만 표시합니다!

3. 열의 최대값: 그룹별

작업: 각 항목의 최대 가격은 얼마입니까?

SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article

+---------+-------+
| article | price |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+

4. 그룹 간 특정 필드의 최대값이 있는 행

과제: 각 품목에 대해 가장 비싼 품목의 딜러를 찾습니다.

다음과 같은 하위 쿼리로 이 문제를 해결할 수 있습니다:

SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article);

5. 사용자 변수 사용

MySQL 사용자 변수를 지워서 별도의 작업 없이 결과를 기록할 수 있습니다. 이를 대체하려면 클라이언트 측의 임시 변수에 저장하세요.

예를 들어 가격이 가장 높거나 낮은 항목을 찾는 방법은 다음과 같습니다.

mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop; mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price; +---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

6. 외래 키 사용

MySQL에서는 InnoDB 테이블을 지원합니다. 외부 키워드 제약 조건 확인.

두 테이블을 조인할 때는 외부 키워드가 필요하지 않습니다. InnoDB 유형이 아닌 테이블의 경우 REFERENCES tbl_name(col_name) 절을 사용하여 열을 정의할 때 외부 키워드를 사용할 수 있습니다. 이 절은 실제 효과가 없으며 만 사용됩니다. 현재 정의하고 있는 열이 다른 테이블의 열을 가리킨다는 점을 상기시키기 위한 메모 또는 설명으로 사용됩니다. 이 명령문을 실행할 때 다음을 구현하는 것이 중요합니다.

· MySQL은 tbl_name 테이블에서 작업을 수행하지 않습니다. 즉, 이 구문은 ON DELETE 또는 ON UPDATE 동작을 발생시키지 않습니다(REFERENCES 절에 ON DELETE 또는 ON UPDATE 절을 작성하면 무시됩니다).

· 이 구문은 을 생성하지만 색인이나 키워드는 생성하지 않습니다.

· 이 구문을 사용하여 InnoDB 테이블을 정의하면 오류가 발생합니다.

다음과 같이 조인 열로 생성된 열을 사용할 수 있습니다.

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);

INSERT INTO person VALUES (NULL, 'Antonio Paz');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', @last),
(NULL, 'dress', 'white', @last),
(NULL, 't-shirt', 'blue', @last);

INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', @last),
(NULL, 'polo', 'red', @last),
(NULL, 'dress', 'blue', @last),
(NULL, 't-shirt', 'white', @last);

SELECT * FROM person;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM shirt;
rrree

이 방법을 사용하면 REFERENCES 절은 SHOW CREATE TABLE 또는 DESCRIBE:

+----+---------+--------+-------+| id | style   | color  | owner |+----+---------+--------+-------+|  1 | polo    | blue   |     1 ||  2 | dress   | white  |     1 ||  3 | t-shirt | blue   |     1 ||  4 | dress   | orange |     2 ||  5 | polo    | red    |     2 ||  6 | dress   | blue   |     2 ||  7 | t-shirt | white  |     2 |+----+---------+--------+-------+
SELECT s.* FROM person p, shirt sWHERE p.name LIKE &#39;Lilliana%&#39;AND s.owner = p.idAND s.color <> &#39;white&#39;;
+----+-------+--------+-------+| id | style | color  | owner |+----+-------+--------+-------+|  4 | dress | orange |     2 ||  5 | polo  | red    |     2 ||  6 | dress | blue   |     2 |+----+-------+--------+-------+
의 출력에 표시되지 않습니다. 🎜>이러한 방식으로 열 정의에서 REFERENCES를 주석 또는 "힌트"로 사용하는 것은 MyISAM 및 BerkeleyDB 테이블에 적용됩니다.

7. 두 개의 키를 기준으로 검색하는

은 AND와 마찬가지로 단일 키워드를 사용하여 OR 절을 최대한 활용할 수 있습니다.

더 유연한 예는 OR로 결합된 두 개의 키워드를 찾는 것입니다:

SHOW CREATE TABLE shirt\G
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum(&#39;t-shirt&#39;,&#39;polo&#39;,&#39;dress&#39;) NOT NULL,
`color` enum(&#39;red&#39;,&#39;blue&#39;,&#39;orange&#39;,&#39;white&#39;,&#39;black&#39;) NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

이 상황은 최적화되었습니다.

UNION을 사용하여 두 개의 개별 SELECT 문의 출력을 결합하여 이 문제를 보다 효과적으로 해결할 수도 있습니다.

각 SELECT는 최적화할 수 있는 하나의 키워드만 검색합니다:

SELECT field1_index, field2_index FROM test_table
WHERE field1_index = &#39;1&#39; OR  field2_index = &#39;1&#39;

8. 일수를 기준으로 방문수를 계산합니다.

다음 예는 비트 배열 기능을 사용하는 방법을 보여줍니다. 매월 사용자가 웹페이지를 방문하는 일수를 계산합니다.

SELECT field1_index, field2_index
    FROM test_table WHERE field1_index = &#39;1&#39;
UNION
SELECT field1_index, field2_index
    FROM test_table WHERE field2_index = &#39;1&#39;;

샘플 테이블에는 사용자가 방문한 웹페이지를 나타내는 연월일 값이 포함되어 있습니다. 다음 쿼리를 사용하여 월별 방문 일수를 확인할 수 있습니다.

CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
             day INT(2) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
            (2000,2,23),(2000,2,23);

는 다음을 반환합니다.

SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
       GROUP BY year,month;

이 쿼리는 테이블에서 연/월별로 결합된 고유 일 수를 계산하고 중복 문의를 자동으로 제거할 수 있습니다.

9. AUTO_INCREMENT

를 사용하여 AUTO_INCREMENT 속성을 통해 새 행에 대한 고유 식별자를 생성합니다.

+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 |    01 |    3 |
| 2000 |    02 |    2 |
+------+-------+------+

는 다음을 반환합니다.

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
 );

INSERT INTO animals (name) VALUES
    (&#39;dog&#39;),(&#39;cat&#39;),(&#39;penguin&#39;),
    (&#39;lax&#39;),(&#39;whale&#39;),(&#39;ostrich&#39;);

SELECT * FROM animals;

LAST_INSERT_ID ()SQL 함수 또는 mysql_insert_id() C API 함수를 사용하여 최신 AUTO_INCREMENT 값을 쿼리합니다. 이러한 함수는 연결별로 다르므로 해당 반환 값은 삽입 기능을 수행하는 다른 연결의 영향을 받지 않습니다.

참고: 다중 행 삽입의 경우 LAST_INSERT_ID() 및 mysql_insert_id()는 실제로 삽입된 첫 번째 행에서 AUTO_INCREMENT 키워드를 반환합니다. 복제 설정에서 이 기능을 사용하면 다중 행 삽입이 다른 서버에서 올바르게 복제될 수 있습니다.

MyISAM 및 BDB 테이블의 경우 두 번째 열에 AUTO_INCREMENT 및 다중 열 인덱스를 지정할 수 있습니다. 이때 AUTO_INCREMENT 컬럼에 의해 생성된 값의 계산 방법은 MAX(

auto_increment_column) + 1 WHERE prefix=given-prefix입니다. 데이터를 정렬된 그룹에 넣으려면 이 방법을 사용하십시오.

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

는 다음을 반환합니다:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

请注意在这种情况下(AUTO_INCREMENT列是多列索引的一部分),如果你在任何组中删除有最大AUTO_INCREMENT值的行,将会重新用到AUTO_INCREMENT值。对于MyISAM表也如此,对于该表一般不重复使用AUTO_INCREMENT值。

如果AUTO_INCREMENT列是多索引的一部分,MySQL将使用该索引生成以AUTO_INCREMENT列开始的序列值。。例如,如果animals表含有索引PRIMARY KEY (grp, id)和INDEX(id),MySQL生成序列值时将忽略PRIMARY KEY。结果是,该表包含一个单个的序列,而不是符合grp值的序列。

要想以AUTO_INCREMENT值开始而不是1,你可以通过CREATE TABLE或ALTER TABLE来设置该值,如下所示:

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

 以上就是MySQL入门教程7 —— 常用数据库查询的示例的内容,更多相关内容请关注PHP中文网(www.php.cn)! 




성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.