MySQL 시작하기 튜토리얼 5 - 데이터 테이블에서 정보 검색

黄舟
풀어 주다: 2017-02-23 11:39:40
원래의
1245명이 탐색했습니다.



SELECT 문은 데이터 테이블에서 정보를 검색하는 데 사용됩니다. 명령문의 일반적인 형식은 다음과 같습니다.

SELECT what_to_select FROM which_table WHERE conditions_to_satisfy;
로그인 후 복사

what_to_select는 보고 싶은 항목을 지정합니다. 열 테이블일 수도 있고, *는 "모든 열"을 의미할 수도 있습니다. which_table은 데이터를 검색하려는 테이블을 나타냅니다. WHERE 절은 선택 사항입니다. 이 항목을 선택하면 Conditions_to_satisfy는 행이 충족해야 하는 검색 조건을 지정합니다.

1. 모든 데이터 선택

SELECT의 가장 간단한 형태는 테이블에서 모든 레코드를 검색하는 것입니다.

mysql> SELECT * FROM pet; +----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
| Bowser   | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
+----------+--------+---------+------+------------+------------+
로그인 후 복사

전체 테이블을 탐색하려면 다음을 사용할 수 있습니다. 예를 들어 초기 데이터 세트를 로드한 직후에 이러한 형태의 SELECT가 수행됩니다. 아니면 Bowser의 생일이 옳지 않다고 생각하고 있을 수도 있습니다. 원래 가계도를 확인해 보니 정확한 출생 연도가 1979년이 아니라 1989년이라는 것을 알게 되었습니다.

수정하는 방법은 최소한 두 가지가 있습니다.

· "pet.txt" 파일을 편집하여 오류를 수정한 다음 DELETE 및 LOAD DATA를 사용하여 테이블을 지우고 다시 로드합니다.

아아아아

그런데 이렇게 하면 퍼프볼 기록을 다시 입력해야 합니다.

·잘못된 레코드만 수정하려면 UPDATE 문을 사용하세요.

 mysql> DELETE FROM pet; mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;
로그인 후 복사

UPDATE는 문제가 있는 레코드만 변경하고 데이터베이스 테이블을 다시 로드할 필요가 없습니다.

2. 특수 행 선택

위와 같이 전체 테이블을 검색하는 것은 쉽습니다. SELECT 문에서 WHERE 절을 제거하면 됩니다. 그러나 일반적으로 전체 테이블을 보고 싶지는 않습니다. 특히 테이블이 매우 커질 경우에는 더욱 그렇습니다. 대신, 일반적으로 특정 질문에 답변하는 데 더 관심이 있으며, 이 경우 원하는 정보에 몇 가지 제한 사항이 적용됩니다. 애완동물에 관한 질문에 대해 그들이 대답하는 몇 가지 선별된 질문을 살펴보겠습니다. 테이블에서 특정 행만 선택할 수 있습니다. 예를 들어 Bowser의 생일에 대한 변경 사항을 확인하려면 다음과 같이 Bowser의 기록을 선택합니다.

mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
로그인 후 복사

출력에서는 올바른 연도 기록이 1979년이 아니라 1989년임을 확인합니다.

문자열 비교는 일반적으로 크기에 덜 민감하므로 이름을 "bowser", "BOWSER" 등으로 지정할 수 있으며 쿼리 결과는 동일합니다.

이름뿐 아니라 모든 열에 조건을 지정할 수 있습니다. 예를 들어, 1998년 이후에 태어난 동물이 무엇인지 알고 싶다면 출생 열을 테스트하세요.

mysql> SELECT * FROM pet WHERE name = 'Bowser'; +--------+-------+---------+------+------------+------------+
| name   | owner | species | sex  | birth      | death      |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
로그인 후 복사

조건을 결합하여 암컷 개를 찾을 수 있습니다.

mysql> SELECT * FROM pet WHERE birth > '1998-1-1'; +----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |
+----------+-------+---------+------+------------+-------+
로그인 후 복사
mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
로그인 후 복사

위 쿼리는 AND 논리 연산자를 사용하며 OR 연산자도 있습니다:

+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+
로그인 후 복사

AND와 OR은 혼합될 수 있지만 AND는 OR보다 우선순위가 높습니다. 두 개의 연산자를 사용하는 경우 괄호를 사용하여 조건을 그룹화하는 방법을 나타내는 것이 좋습니다.

mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird'; +----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |
| Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
+----------+-------+---------+------+------------+-------+
로그인 후 복사

3. 모든 행을 표시하지 않으려면 특수 열

을 선택하세요. 테이블에서 관심 있는 열의 이름을 쉼표로 구분하여 지정하면 됩니다. 예를 들어, 동물이 언제 태어났는지 알고 싶다면 이름과 출생 열을 선택하세요.

mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')     -> OR (species = 'dog' AND sex = 'f'); +-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+
로그인 후 복사

애완동물의 주인이 누구인지 알아보려면 다음 쿼리를 사용하세요.

mysql> SELECT name, birth FROM pet; +----------+------------+
| name     | birth      |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
로그인 후 복사

이 쿼리는 단순히 각 레코드의 소유자 열을 검색하는 것이며 그 중 일부는 여러 번 나타납니다. 출력을 최소화하려면 DISTINCT 키워드를 추가하여 각 고유 출력 레코드를 검색하세요.

mysql> SELECT owner FROM pet; +--------+
| owner  |
+--------+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+
로그인 후 복사

WHERE 절을 사용하여 행 선택과 열 선택을 결합할 수 있습니다. 예를 들어, 개와 고양이의 생년월일을 쿼리하려면 다음 쿼리를 사용합니다.

mysql> SELECT DISTINCT owner FROM pet; +--------+
| owner  |
+--------+
| Benny  |
| Diane  |
| Gwen   |
| Harold |
+--------+
로그인 후 복사

4. 범주 행

이전 예에서 결과 행이 표시되지 않음을 알 수 있습니다. 특정 주문. 그러나 행이 특정 방식으로 정렬되면 쿼리 출력을 검사하는 것이 더 쉬운 경우가 많습니다. 결과를 정렬하려면 ORDER BY 절을 사용하세요. 날짜별로 정렬된 동물 생일은 다음과 같습니다.

mysql> SELECT name, species, birth FROM pet     -> WHERE species = 'dog' OR species = 'cat'; +--------+---------+------------+
| name   | species | birth      |
+--------+---------+------------+
| Fluffy | cat     | 1993-02-04 |
| Claws  | cat     | 1994-03-17 |
| Buffy  | dog     | 1989-05-13 |
| Fang   | dog     | 1990-08-27 |
| Bowser | dog     | 1989-08-31 |
+--------+---------+------------+
로그인 후 복사

문자 유형 열에서 다른 모든 비교 작업과 마찬가지로 정렬 기능은 일반적으로 대소문자를 구분하여 수행됩니다. 이는 동일한 열의 대소문자가 다른 순서가 정의되지 않음을 의미합니다. 특정 열의 경우 BINARY를 사용하여 다음과 같이 대소문자 구분 분류를 적용할 수 있습니다. ORDER BY BINARY col_name.

기본 정렬은 오름차순이며 가장 작은 값이 먼저 표시됩니다. 내림차순으로 정렬하려면 정렬하려는 열 이름에 DESC(내림차순) 키워드를 추가하세요.

mysql> SELECT name, birth FROM pet ORDER BY birth; +----------+------------+
| name     | birth      |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
로그인 후 복사

여러 열을 정렬할 수 있으며, 여러 열을 서로 다른 방향으로 정렬할 수 있습니다. 예를 들어, 동물 종을 오름차순으로 정렬한 다음 각 동물 종을 생년월일 기준으로 내림차순(가장 어린 동물부터)으로 정렬하려면 다음 쿼리를 사용합니다.

mysql> SELECT name, birth FROM pet ORDER BY birth DESC; +----------+------------+
| name     | birth      |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+
로그인 후 복사

DESC 키워드는 The 그 앞에 있는 열 이름(출생)은 종 열의 정렬 순서에 영향을 주지 않습니다.

5. 날짜 계산

MySQL은 나이 계산, 날짜 부분 추출 등 날짜를 계산하는 데 사용할 수 있는 여러 기능을 제공합니다.

각 애완동물의 나이를 확인하려면 현재 날짜의 연도와 태어난 날짜의 차이를 계산하세요. 현재 날짜의 연도가 생일보다 빠른 경우에는 1년을 뺍니다. 다음 쿼리는 각 애완동물의 생년월일, 현재 날짜 및 연령 값에 대한 연도를 표시합니다.

mysql> SELECT name, species, birth FROM pet     -> ORDER BY species, birth DESC; +----------+---------+------------+
| name     | species | birth      |
+----------+---------+------------+
| Chirpy   | bird    | 1998-09-11 |
| Whistler | bird    | 1997-12-09 |
| Claws    | cat     | 1994-03-17 |
| Fluffy   | cat     | 1993-02-04 |
| Fang     | dog     | 1990-08-27 |
| Bowser   | dog     | 1989-08-31 |
| Buffy    | dog     | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim     | snake   | 1996-04-29 |
+----------+---------+------------+
로그인 후 복사

여기서 YEAR()는 날짜의 연도 부분을 추출하고, RIGHT()는 날짜의 MM-DD(역년) 부분의 가장 오른쪽 5자를 추출합니다. MM-DD 값을 비교하는 표현식 부분의 값은 일반적으로 1 또는 0이다. CURDATE()의 연도가 태어난 연도보다 빠른 경우 해당 연도에 1을 빼야 한다. 전체 표현식이 약간 혼란스럽습니다. 별칭(age)을 사용하여 출력 열 레이블을 더 의미 있게 만드세요.

尽管查询可行,如果以某个顺序排列行,则能更容易地浏览结果。添加ORDER BY name子句按照名字对输出进行排序则能够实现。

mysql> SELECT name, birth, CURDATE(),    -> (YEAR(CURDATE())-YEAR(birth))    -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))    -> AS age
로그인 후 복사

-> FROM pet ORDER BY name;

+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Bowser   | 1989-08-31 | 2003-08-19 |   13 |
| Buffy    | 1989-05-13 | 2003-08-19 |   14 |
| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
| Claws    | 1994-03-17 | 2003-08-19 |    9 |
| Fang     | 1990-08-27 | 2003-08-19 |   12 |
| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
| Puffball | 1999-03-30 | 2003-08-19 |    4 |
| Slim     | 1996-04-29 | 2003-08-19 |    7 |
| Whistler | 1997-12-09 | 2003-08-19 |    5 |
+----------+------------+------------+------+
로그인 후 복사

为了按age而非name排序输出,只要再使用一个ORDER BY子句:

mysql> SELECT name, birth, CURDATE(),     -> (YEAR(CURDATE())-YEAR(birth))     -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))     -> AS age     -> FROM pet ORDER BY age; +----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
| Puffball | 1999-03-30 | 2003-08-19 |    4 |
| Whistler | 1997-12-09 | 2003-08-19 |    5 |
| Slim     | 1996-04-29 | 2003-08-19 |    7 |
| Claws    | 1994-03-17 | 2003-08-19 |    9 |
| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
| Fang     | 1990-08-27 | 2003-08-19 |   12 |
| Bowser   | 1989-08-31 | 2003-08-19 |   13 |
| Buffy    | 1989-05-13 | 2003-08-19 |   14 |
+----------+------------+------------+------+
로그인 후 복사

可以使用一个类似的查询来确定已经死亡动物的死亡年龄。你通过检查death值是否是NULL来确定是哪些动物,然后,对于那些非NULL值的动物,需要计算出death和birth值之间的差:

mysql> SELECT name, birth, death,     -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))     -> AS age     -> FROM pet WHERE death IS NOT NULL ORDER BY age; +--------+------------+------------+------+
| name   | birth      | death      | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 |    5 |
+--------+------------+------------+------+
로그인 후 복사

查询使用death IS NOT NULL而非death != NULL,因为NULL是特殊的值,不能使用普通比较符来比较,以后会给出解释。

如果你想要知道哪个动物下个月过生日,怎么办?对于这类计算,年和天是无关的,你只需要提取birth列的月份部分。MySQL提供几个日期部分的提取函数,例如YEAR( )、MONTH( )和DAYOFMONTH( )。在这里MONTH()是适合的函数。为了看它怎样工作,运行一个简单的查询,显示birth和MONTH(birth)的值:

mysql> SELECT name, birth, MONTH(birth) FROM pet; +----------+------------+--------------+
| name     | birth      | MONTH(birth) |
+----------+------------+--------------+
| Fluffy   | 1993-02-04 |            2 |
| Claws    | 1994-03-17 |            3 |
| Buffy    | 1989-05-13 |            5 |
| Fang     | 1990-08-27 |            8 |
| Bowser   | 1989-08-31 |            8 |
| Chirpy   | 1998-09-11 |            9 |
| Whistler | 1997-12-09 |           12 |
| Slim     | 1996-04-29 |            4 |
| Puffball | 1999-03-30 |            3 |
+----------+------------+--------------+
로그인 후 복사

找出下个月生日的动物也是容易的。假定当前月是4月,那么月值是4,你可以找在5月出生的动物 (5月),方法是:

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; +-------+------------+
| name  | birth      |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+
로그인 후 복사

如果当前月份是12月,就有点复杂了。你不能只把1加到月份数(12)上并寻找在13月出生的动物,因为没有这样的月份。相反,你应寻找在1月出生的动物(1月) 。

你甚至可以编写查询,不管当前月份是什么它都能工作。采用这种方法不必在查询中使用一个特定的月份,DATE_ADD( )允许在一个给定的日期上加上时间间隔。如果在NOW( )值上加上一个月,然后用MONTH()提取月份,结果产生生日所在月份:

mysql> SELECT name, birth FROM pet     -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
로그인 후 복사

完成该任务的另一个方法是加1以得出当前月份的下一个月(在使用取模函数(MOD)后,如果月份当前值是12,则“回滚”到值0):

mysql> SELECT name, birth FROM pet     -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
로그인 후 복사

注意,MONTH返回在1和12之间的一个数字,且MOD(something,12)返回在0和11之间的一个数字,因此必须在MOD( )以后加1,否则我们将从11月( 11 )跳到1月(1)。

6. NULL值操作

NULL值可能令人感到奇怪直到你习惯它。概念上,NULL意味着“没有值”或“未知值”,且它被看作与众不同的值。为了测试NULL,你不能使用算术比较 操作符例如=、<或!=。为了说明它,试试下列查询:

mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL; +----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+
로그인 후 복사

很显然你不能通过这些比较得到有意义的结果。相反使用IS NULL和IS NOT NULL操作符:

mysql> SELECT 1 IS NULL, 1 IS NOT NULL; +-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+
로그인 후 복사

请注意在MySQL中,0或 NULL意味着假而其它值意味着真。布尔运算的默认真值是1。

对NULL的特殊处理即是在前面的章节中,为了决定哪个动物不再是活着的,使用death IS NOT NULL而不使用death != NULL的原因。

在GROUP BY中,两个NULL值视为相同。

执行ORDER BY时,如果运行 ORDER BY ... ASC,则NULL值出现在最前面,若运行ORDER BY ... DESC,则NULL值出现在最后面。

NULL操作的常见错误是不能在定义为NOT NULL的列内插入0或空字符串,但事实并非如此。在NULL表示"没有数值"的地方有数值。使用IS [NOT] NULL则可以很容易地进行测试,如下所示:

mysql> SELECT 0 IS NULL, 0 IS NOT NULL, &#39;&#39; IS NULL, &#39;&#39; IS NOT NULL; +-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | &#39;&#39; IS NULL | &#39;&#39; IS NOT NULL |
+-----------+---------------+------------+----------------+
|         0 |             1 |          0 |              1 |
+-----------+---------------+------------+----------------+
로그인 후 복사

因此完全可以在定义为NOT NULL的列内插入0或空字符串,实际是NOT NULL。

7. 模式匹配

MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vigrepsed的扩展正则表达式模式匹配的格式。

SQL模式匹配允许你使用

“_”

匹配任何单个字符,而

“%”

匹配任意数目字符(包括零字符)。在 MySQL中,SQL的模式默认是忽略大小写的。下面给出一些例子。注意使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操作符。

要想找出以

“b”

开头的名字:

mysql> SELECT * FROM pet WHERE name LIKE &#39;b%&#39;; +--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
로그인 후 복사

要想找出以

“fy”

结尾的名字:

mysql> SELECT * FROM pet WHERE name LIKE &#39;%fy&#39;; +--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+
로그인 후 복사

要想找出包含

“w”

的名字:

mysql> SELECT * FROM pet WHERE name LIKE &#39;%w%&#39;; +----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+
로그인 후 복사

要想找出正好包含5个字符的名字,使用

“_”

模式字符:

mysql> SELECT * FROM pet WHERE name LIKE &#39;_____&#39;; +-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+
로그인 후 복사

MySQL提供的模式匹配的其它类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。

扩展正则表达式的一些字符是:

· ‘.’匹配任何单个的字符。

· 字符类

“[...]”

匹配在方括号内的任何字符。例如,

“[abc]”

匹配

“a”

“b”

“c”

。为了命名字符的范围,使用一个“-”。

“[a-z]”

匹配任何字母,而

“[0-9]”

匹配任何数字。

·

“ * ”

匹配零个或多个在它前面的字符。例如,

“x*”

匹配任何数量的

“x”

字符,

“[0-9]*”

匹配任何数量的数字,而

“.*”

匹配任何数量的任何字符。

  • 如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。

  • 为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用
    “^”

    在模式的结尾用“$”

为了说明扩展正则表达式如何工作,下面使用REGEXP重写上面所示的LIKE查询:

为了找出以

“b”

开头的名字,使用

“^”

匹配名字的开始:

mysql> SELECT * FROM pet WHERE name REGEXP &#39;^b&#39;; +--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
로그인 후 복사

如果你想强制使REGEXP比较区分大小写,使用BINARY关键字使其中一个字符串变为二进制字符串。该查询只匹配名称首字母的小写‘b’。

mysql> SELECT * FROM pet WHERE name REGEXP BINARY &#39;^b&#39;;
로그인 후 복사

为了找出以

“fy”

结尾的名字,使用

“$”

匹配名字的结尾:

mysql> SELECT * FROM pet WHERE name REGEXP &#39;fy$&#39;; +--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+
로그인 후 복사

为了找出包含一个

“w”

的名字,使用以下查询:

mysql> SELECT * FROM pet WHERE name REGEXP &#39;w&#39;; +----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+
로그인 후 복사

既然如果一个正则表达式出现在值的任何地方,其模式匹配了,就不必在先前的查询中在模式的两侧放置一个通配符以使得它匹配整个值,就像你使用了一个SQL模式那样。

为了找出包含正好5个字符的名字,使用

“^”

“$”

匹配名字的开始和结尾,和5个

“.”

实例在两者之间:

mysql> SELECT * FROM pet WHERE name REGEXP &#39;^.....$&#39;; +-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+
로그인 후 복사

你也可以使用

“{n}”

“重复n次”操作符重写前面的查询:

mysql> SELECT * FROM pet WHERE name REGEXP &#39;^.{5}$&#39;; +-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+
로그인 후 복사

8. 计数行

数据库经常用于回答这个问题,“某个类型的数据在表中出现的频度?”例如,你可能想要知道你有多少宠物,或每位主人有多少宠物,或你可能想要对你的动物进行各种类型的普查。计算你拥有动物的总数目与“在pet表中有多少行?”是同样的问题,因为每个宠物有一个记录。COUNT(*)函数计算行数,所以计算动物数目的查询应为:

mysql> SELECT COUNT(*) FROM pet; +----------+
| COUNT(*) |
+----------+
|        9 |
+----------+
로그인 후 복사

在前面,你检索了拥有宠物的人的名字。如果你想要知道每个主人有多少宠物,你可以使用COUNT( )函数:

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+--------+----------+
로그인 후 복사

注意,使用GROUP BY对每个owner的所有记录分组,没有它,你会得到错误消息:

mysql> SELECT owner, COUNT(*) FROM pet; ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)
with no GROUP columns is illegal if there is no GROUP BY clause
로그인 후 복사

COUNT( )和GROUP BY以各种方式分类你的数据。下列例子显示出进行动物普查操作的不同方式。

每种动物的数量:

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird    |        2 |
| cat     |        2 |
| dog     |        3 |
| hamster |        1 |
| snake   |        1 |
+---------+----------+
로그인 후 복사

每种性别的动物数量:

mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+
| sex  | COUNT(*) |
+------+----------+
| NULL |        1 |
| f    |        4 |
| m    |        4 |
+------+----------+
로그인 후 복사

(在这个输出中,NULL表示“未知性别”。)

按种类和性别组合的动物数量:

mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | NULL |        1 |
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+
로그인 후 복사

若使用COUNT( ),你不必检索整个表。例如, 前面的查询,当只对狗和猫进行时,应为:

mysql> SELECT species, sex, COUNT(*) FROM pet     -> WHERE species = &#39;dog&#39; OR species = &#39;cat&#39;     -> GROUP BY species, sex; +---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
+---------+------+----------+
로그인 후 복사

或,如果你仅需要知道已知性别的按性别的动物数目:

mysql> SELECT species, sex, COUNT(*) FROM pet     -> WHERE sex IS NOT NULL     -> GROUP BY species, sex; +---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+
로그인 후 복사

9. 使用1个以上的表

pet表追踪你有哪个宠物。如果你想要记录其它相关信息,例如在他们一生中看兽医或何时后代出生,你需要另外的表。这张表应该像什么呢?需要:· 它需要包含宠物名字以便你知道每个事件属于哪个动物。

· 需要一个日期以便你知道事件是什么时候发生的。

· 需要一个描述事件的字段。

· 如果你想要对事件进行分类,则需要一个事件类型字段。

综合上述因素,event表的CREATE TABLE语句应为:

mysql> CREATE TABLE event (name VARCHAR(20), date DATE,     -> type VARCHAR(15), remark VARCHAR(255));
로그인 후 복사

对于pet表,最容易的方法是创建包含信息的用定位符分隔的文本文件来装载初始记录:

namedatetyperemark
Fluffy1995-05-15litter4 kittens, 3 female, 1 male
Buffy1993-06-23litter5 puppies, 2 female, 3 male
Buffy1994-06-19litter3 puppies, 3 female
Chirpy1999-03-21vetneeded beak straightened
Slim1997-08-03vetbroken rib
Bowser1991-10-12kennel
Fang1991-10-12kennel
Fang1998-08-28birthdayGave him a new chew toy
Claws1998-03-17birthdayGave him a new flea collar
Whistler1998-12-09birthdayFirst birthday

采用如下方式装载记录:

mysql> LOAD DATA LOCAL INFILE &#39;event.txt&#39; INTO TABLE event;
로그인 후 복사

根据你从已经运行在pet表上的查询中学到的,你应该能执行对event表中记录的检索;原理是一样的。但是什么时候event表本身不能回答你可能问的问题呢?

当他们有了一窝小动物时,假定你想要找出每只宠物的年龄。我们前面看到了如何通过两个日期计算年龄。event表中有母亲的生产日期,但是为了计算母亲的年龄,你需要她的出生日期,存储在pet表中。说明查询需要两个表:

mysql> SELECT pet.name,     -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,     -> remark     -> FROM pet, event     -> WHERE pet.name = event.name AND event.type = &#39;litter&#39;; +--------+------+-----------------------------+
| name   | age  | remark                      |
+--------+------+-----------------------------+
| Fluffy |    2 | 4 kittens, 3 female, 1 male |
| Buffy  |    4 | 5 puppies, 2 female, 3 male |
| Buffy  |    5 | 3 puppies, 3 female         |
+--------+------+-----------------------------+
로그인 후 복사

关于该查询要注意的几件事情:

  • FROM子句列出两个表,因为查询需要从两个表提取信息。

  • 当从多个表组合(联结)信息时,你需要指定一个表中的记录怎样能匹配其它表的记录。这很简单,因为它们都有一个name列。查询使用WHERE子句基于name值来匹配2个表中的记录。

  • 因为name列出现在两个表中,当引用列时,你一定要指定哪个表。把表名附在列名前即可以实现。

你不必有2个不同的表来进行联结。如果你想要将一个表的记录与同一个表的其它记录进行比较,可以将一个表联结到自身。例如,为了在你的宠物之中繁殖配偶,你可以用pet联结自身来进行相似种类的雄雌配对:

mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species     -> FROM pet AS p1, pet AS p2     -> WHERE p1.species = p2.species AND p1.sex = &#39;f&#39; AND p2.sex = &#39;m&#39;; +--------+------+--------+------+---------+
| name   | sex  | name   | sex  | species |
+--------+------+--------+------+---------+
| Fluffy | f    | Claws  | m    | cat     |
| Buffy  | f    | Fang   | m    | dog     |
| Buffy  | f    | Bowser | m    | dog     |
+--------+------+--------+------+---------+
로그인 후 복사

在这个查询中,我们为表名指定别名以便能引用列并且使得每一个列引用与哪个表实例相关联更直观。

 以上就是MySQL入门教程5 —— 从数据表中检索信息的内容,更多相关内容请关注PHP中文网(www.php.cn)! 


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!