>  기사  >  데이터 베이스  >  이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

WBOY
WBOY앞으로
2021-12-20 16:56:042044검색

이 기사는 MySQL에 대한 기본 지식을 정리하고 공유합니다. 지식 포인트는 간단하지만 앞으로는 모든 사람에게 더 쉽게 검색할 수 있을 것입니다.

이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

1. SQL에 대한 간략한 설명

1. SQL 개요

구조적 쿼리 언어(Structured Query Language)는 미국 표준 협회(ANSI)에서 정의한 SQL입니다. 관계형 데이터베이스 언어는 나중에 국제표준화기구(ISO)에서 관계형 데이터베이스 언어의 국제 표준으로 채택되었습니다. 데이터베이스 관리 시스템은 SQL을 통해 데이터베이스를 관리하고 데이터를 정의 및 운영하며 데이터 무결성과 보안을 유지할 수 있습니다.

2. SQL의 장점

1. 강력한 조작성으로 배우기 쉽습니다
2. 가장 중요한 데이터베이스 관리 시스템은 SQL을 지원합니다. 3. SQL을 사용하여 데이터베이스를 운영할 때 대부분의 DBMS

3. SQL의 분류

1. 데이터베이스, 테이블, 컬럼 등을 조작하는 데 사용되는 DDL(데이터 정의 언어) 데이터 정의 언어: CREATE, ALTER, DROP

2 . DML(Data Manipulation Language) 데이터 조작 언어, 데이터베이스의 테이블에 있는 데이터를 조작하는 데 사용됩니다. 일반적으로 사용되는 문: INSERT, UPDATE, DELETE
3. DCL(Data Control Language) 데이터 제어 언어, 액세스 권한 및 보안을 조작하는 데 사용됩니다. 레벨; 일반적으로 사용되는 문: GRANT, DENY
4. DQL(Data Query Language) 데이터 쿼리 언어, 데이터 쿼리에 일반적으로 사용되는 문: SELECT

2. 데이터베이스의 세 가지 주요 패러다임

1. 첫 번째 정규형( 1NF)는 데이터베이스 테이블의 각 열을 나타냅니다. 이는 모두 분할할 수 없는 기본 데이터 라인입니다. 즉, 각 열의 값은 원자적이며 더 이상 나눌 수 없습니다.

2. 첫 번째 정규형(1NF)을 기반으로 두 번째 정규형(2NF)이 성립됩니다. 두 번째 정규형(2NF)을 만족하려면 먼저 첫 번째 정규형(1NF)을 충족해야 합니다. 테이블에 단일 기본 키가 있으면 기본 키 이외의 열은 기본 키에 완전히 종속되어야 합니다. 테이블이 복합 기본 키이면 기본 키 이외의 열은 기본 키에 완전히 종속되어야 합니다. 키이며 기본 키의 일부에만 의존할 수 없습니다.
3. 제2정규형(3NF)은 제2정규형을 기반으로 성립되는데, 즉 제3정규형을 만족하려면 제2정규형을 먼저 만족해야 한다. 3NF(제3정규형)에서는 테이블의 기본 키가 아닌 열이 기본 키와 직접 관련되어야 하지만 간접적으로 관련되어서는 안 됩니다. 즉, 기본 키가 아닌 열은 서로 관련될 수 없습니다.

3. 데이터베이스 데이터 유형

MySQL 데이터베이스를 사용하여 데이터를 저장할 때 다양한 데이터 유형에 따라 MySQL이 데이터를 저장하는 방식이 결정됩니다. 이를 위해 MySQL 데이터베이스는 정수 유형, 부동 소수점 유형, 고정 소수점 유형, 날짜 및 시간 유형, 문자열 유형, 바이너리... 및 기타 데이터 유형을 포함한 다양한 데이터 유형을 제공합니다.

1. 정수 유형

다양한 값 범위에 따라 MySQL의 정수 유형은 TINYINT, SMALUNT, MEDIUMINT, INT 및 BIGINT의 5가지 유형으로 나눌 수 있습니다. 아래 그림에는 다양한 MySQL 정수 유형에 해당하는 바이트 크기와 값 범위가 나열되어 있습니다. 가장 일반적으로 사용되는 것은 INT 유형,

데이터 유형바이트 수부호 없는 숫자의 값 범위 값입니다. 부호 있는 숫자의 범위TINYINT10~255-128~127SMALLINT20~65535-3 2768~32768미디엄민트30~16777215-8388608~8388608INT40~4294967295-2147483 648~ 2147483 648BIGINT80~18446744073709551615 -9223372036854775808 ~9223372036854775808
2. 부동 소수점 및 고정 소수점 유형

MySQL 데이터베이스에 소수점을 저장하려면 부동 소수점 및 고정 소수점 숫자를 사용하세요. 부동 소수점 숫자에는 단정밀도 부동 소수점 숫자 유형(FLOAT)과 배정밀도 부동 소수점 숫자 유형(DOUBLE)의 두 가지 유형이 있습니다. 고정 소수점 유형은 DECIMAL 유형 하나만 있습니다. 다음 그림에는 MySQL의 부동 소수점 및 고정 소수점 유형에 해당하는 바이트 크기와 값 범위가 나열되어 있습니다.

데이터 유형바이트 수부호 있는 값 범위부호 없는 값 범위FLOAT4-3.402823466E+38~-1.175494351E-380 및 1.175494351E-38~3.402823466E+38 DOUBLE 8-1.7976931348623157 E+308~2.2250738585072014E- 3080 및 2.2250738585072014E-308~1.7976931348623157E+308DECIMAL (M,D)M+2 -1.7976931348623 157E+308~2.2250738585072014E-308 0 및 2.2250738585072014E-308~ 1.7976931348623157E+308

위 그림에서 알 수 있듯이 DECIMAL 유형의 값 범위는 DOUBLE 유형과 동일합니다. 그러나 DECIMAL 유형의 유효한 값 범위는 M과 D에 의해 결정됩니다. 그 중 M은 데이터의 길이를 나타내고, D는 소수점 이하의 길이를 나타낸다. 예를 들어, 데이터 유형 DECIMAL(6,2)을 갖는 데이터 6.5243을 데이터베이스에 삽입한 후 표시되는 결과는 6.52

3입니다. 문자열 유형

CHAR 및 VARCHAR은 MySQL에서 문자열을 나타내는 데 일반적으로 사용됩니다. 둘 사이의 차이점은 VARCHAR이 가변 길이 문자열을 저장한다는 것입니다.
데이터 유형이 CHAR(M)인 경우 삽입된 값의 실제 길이에 관계없이 차지하는 저장 공간은 M 바이트인 반면, VARCHAR(M)에 해당하는 데이터가 차지하는 바이트 수는 실제 길이에 1

삽입된 값 CHAR(3) 저장소 요구사항 VARCHAR(3) 저장소 요구사항
'' '' 3바이트 '' 1바이트
'a' 'a' 3바이트 'a' 2바이트
'ab' 'ab ' 3바이트 ' ab' 3바이트
'abc' 'ab' 3바이트 'abc' 4바이트
'abcd' 'ab' 3바이트 ' abc' 4바이트

4. 문자열 유형

텍스트 유형은 기사 내용, 댓글, 세부 정보 등과 같은 대규모 텍스트 데이터를 나타내는 데 사용되며 유형은 다음 4가지 유형으로 나뉩니다.

데이터 유형 저장 범위
TINYTEXT 0~255바이트
TEXT 0~65535바이트
MEDIUMTEXT 0~16777215바이트
LONGTEXT 0~4294967295바이트

5. 날짜 및 시간 유형

MySQL에서 제공하는 표현 날짜 및 시간의 데이터 유형은 각각 YEAR, DATE, TIME, DATETIME 및 TIMESTAMP입니다. 다음 그림에는 날짜 및 시간 데이터 유형에 해당하는 바이트 수, 값 범위, 날짜 형식 및 0 값이 나열되어 있습니다.

데이터 유형 바이트 수 값 범위 날짜 형식 제로 값
YEAR 1 1901~2155 YYYY 0000
DATE 4 1000-01-01 ~ 9999-12-31 YYYY-MM-DD 0000-00-00
TIME 3 -838:59:59~ 838:59:59 HH:MM:SS 00:00:00
날짜 시간 8 1000-01-01 00:00:00~9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 0000-00-00 00:00:00
TIMESTAMP 4 1970-01-01 00:00:01~2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 0000-00-00 00: 00:00

5.1 YEAR 유형

YEAR 유형은 연도를 나타내는 데 사용됩니다. MySQL에서는 다음 세 가지 형식을 사용하여 YEAR 유형의 값을 지정할 수 있습니다.
1. '1901'~'2155' 또는 1901~2155 범위의 4자리 문자열 또는 숫자를 사용하세요. 예를 들어 '2019' 또는 2019를 입력하면 데이터베이스에 삽입되는 값은 2019가 됩니다.
2. '00'부터 '99'까지의 두 자리 문자열 표현을 사용합니다. 그 중 '00'~'69' 범위의 값은 2000~2069 범위의 YEAR 값으로 변환되고, '70'~'99' 범위의 값은 YEAR 값으로 변환된다. 1970~1999년 범위의 YEAR 값으로 변환됩니다. 예를 들어 '19'를 입력하면 데이터베이스에 삽입된 값은 2019입니다.
3. 1부터 99까지의 두 자리 숫자를 사용하세요. 그 중 1~69 범위의 값은 2001~2069 범위의 YEAR 값으로 변환되며, 70~99 범위의 값은 2001~2069 범위의 YEAR 값으로 변환됩니다. 1970~1999년 범위. 예를 들어, 사람이 19를 입력하면 데이터베이스에 삽입된 값은 2019입니다.
참고: YEAR 유형을 사용할 때 '0'과 0을 구분해야 합니다. 왜냐하면 문자열 형식에서 '0'으로 표현되는 YEAR 값은 2000이고, 숫자 형식에서 0으로 표현되는 YEAR 값은 0000이기 때문입니다.

5.2 TIME 유형

TIME 유형은 시간 값을 표시하는 데 사용됩니다. 표시 형식은 일반적으로 HH:MM:SS이며, 여기서 HH는 시간, MM은 분, SS는 초를 나타냅니다. MySQL에서는 다음 3가지 형식을 사용하여 TIME 유형의 값을 지정할 수 있습니다.
1. 'D HH:MM:SS' 문자열 형식으로 표현됩니다. 그 중 D는 일을 나타내며 0부터 34까지의 값을 가질 수 있습니다. 데이터 삽입 시 시 값은 (DX24+HH)와 같습니다. 예를 들어, '2 11:30:50'을 입력하면 날짜가 데이터베이스에 59:30:50으로 삽입됩니다.
2. 'HHMMSS' 문자열 형식이나 HHMMSS 숫자 형식으로 표현됩니다. 예를 들어 '115454' 또는 115454를 입력하면 데이터베이스에 삽입된 날짜는 11:54:54
입니다. 3. CURRENT_TIME 또는 NOW()를 사용하여 현재 시스템 시간을 입력합니다.

5.3 DATETIME 유형

DATETIME 유형은 날짜와 시간을 표시하는 데 사용됩니다. 표시 형식은 'YYYY-MM-DD HH: MM:SS'입니다. 여기서 YYYY는 월, DD는 일을 나타냅니다. HH는 시간, MM은 분, SS는 초를 나타냅니다. MySQL에서는 다음 4가지 형식을 사용하여 DATETIME 유형 값을 지정할 수 있습니다.
'YYYY-MM-DD HH:MM:SS' 또는 'YYYYMMDDHHMMSS' 문자열 형식으로 표현되는 날짜 및 시간, 값 범위는 '1000-01-01 00:00:00'-'9999-12- 3 23 :59:59'. 예를 들어 '2019-01-22 09:01:23' 또는 '20140122_0_90123'을 입력하면 데이터베이스에 삽입되는 DATETIME 값은 2019-01-22 09:01:23이 됩니다.
1. 'YY-MM-DD HH:MM:SS' 또는 'YYMMDDHHMMSS'의 문자열 형식으로 표현되는 날짜 및 시간. 여기서 YY는 연도를 나타내고 값 범위는 '00'-'99'입니다. DATE 형식의 YY와 동일하게 '00'~'69' 범위의 값은 2000~2069 범위의 값으로, '70'~' 범위의 값으로 변환됩니다. 99'는 1970~1999년 범위의 값으로 변환됩니다.
2. YYYYMMDDHHMMSS 또는 YYMMDDHHMMSS 디지털 형식으로 표현된 날짜 및 시간. 예를 들어 20190122090123 또는 190122090123을 삽입하면 데이터베이스에 삽입되는 DATETIME 값은 2019-01-22 09:01:23입니다.
3. NOW를 사용하여 현재 시스템 날짜와 시간을 입력하세요.

5.4 TIMESTAMP 유형

TIMESTAMP 유형은 날짜와 시간을 나타내는 데 사용됩니다. 표시 형식은 DATETIME과 동일하지만 값 범위가 DATETIME보다 작습니다. 여기에서는 TIMESTAMP 유형과 DATATIME 유형의 여러 가지 형태를 소개합니다.
1. CURRENT_TIMESTAMP를 사용하여 시스템의 현재 날짜와 시간을 입력합니다.
2. NULL을 입력하면 시스템은 시스템의 현재 날짜와 시간을 입력합니다.
3. 입력이 없으면 시스템은 시스템의 현재 날짜와 시간을 입력합니다.

6. 바이너리 유형

BLOB는 MySQL에서 그림, PDF 문서 등과 같은 바이너리 유형 데이터를 저장하는 데 일반적으로 사용됩니다. BLOB 유형은 다음 네 가지 유형으로 구분됩니다.

데이터 유형 저장 범위
TINYBLOB 0~255바이트
BLOB 0~65535바이트
MEDIUMBLOB 0~16777215바이트
LONGBLOB 0~4294967295바이트

4. 데이터베이스 및 데이터 테이블의 기본 작업

1. 데이터베이스의 기본 작업

MySQL을 설치한 후 데이터베이스 테이블에 데이터를 저장하려면 먼저 데이터베이스를 생성해야 합니다. 데이터베이스를 생성한다는 것은 데이터베이스 시스템에서 데이터를 저장하기 위한 공간을 분할하는 것입니다. 구문은 다음과 같습니다.

create database 数据库名称;

db1이라는 데이터베이스를 생성합니다. MySQL 명령:

-- 创建一个叫db1的数据库show create database db1;

실행 효과 표시:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
기본 보기 데이터베이스 생성 후 데이터베이스 정보 MySQL 명령:

show create database db1;

실행 효과 표시:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
데이터베이스 삭제 MySQL 명령:

drop database db1;

실행 효과 표시:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
MySQL MySQL의 모든 데이터베이스 쿼리 명령:

show databases;

실행 효과 표시:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
데이터베이스의 문자 집합을 gbk로 변경 MySQL 명령:

alter database db1 character set gbk;

실행 효과 표시:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
데이터베이스 MySQL 전환 명령:

use db1;

실행 효과 표시:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
현재 사용된 데이터베이스 보기 MySQL 명령:

select database();

작동 효과 표시:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

2. 데이터베이스가 성공적으로 생성된 후, 데이터베이스에 데이터 테이블(짧은 테이블이라고 함)을 생성하여 테이블에 대한 데이터를 저장할 수 있습니다. 참고: 데이터 테이블을 작업하기 전에 "USE 데이터베이스 이름"을 사용하여 작업을 먼저 수행할 데이터베이스를 지정해야 합니다. 그렇지 않으면 "선택한 데이터베이스 없음" 오류가 발생합니다.

구문은 다음과 같습니다.

 create table 表名(
         字段1 字段类型,
         字段2 字段类型,
         …
         字段n 字段类型);

2.1 데이터 테이블 만들기

예: 학생 테이블 만들기 MySQL 명령:

 create table student(
 id int,
 name varchar(20),
 gender varchar(10),
 birthday date
 );

실행 효과 표시:


이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
2.2 데이터 테이블 보기

예: 모두 보기 현재 데이터베이스 테이블 MySQL 명령:

show tables;

작업 효과 표시:


이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.예: 테이블의 기본 정보 확인 MySQL 명령:

show create table student;

작업 효과 표시:


이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.예: 확인 테이블의 필드 정보 MySQL 명령:

desc student;

실행 효과 표시:


이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
2.3 데이터 테이블 수정

때때로 다음과 같이 테이블의 일부 정보를 수정하고 싶을 때가 있습니다. 테이블 이름 수정 , 필드 이름 수정, 필드 데이터 유형 수정... 등. 데이터 테이블을 수정하려면 MySQL에서 alter table을 사용하세요.

예: 테이블 이름 수정 MySQL 명령:

alter table student rename to stu;

실행 효과 표시:


이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.예: 필드 이름 수정 MySQL 명령:

alter table stu change name sname varchar(10);

Execution 효과 표시 :


이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.예: 필드 데이터 유형 수정 MySQL 명령:

alter table stu modify sname int;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
示例:增加字段 MySQL命令:

alter table stu add address varchar(50);

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
示例:删除字段 MySQL命令:

alter table stu drop address;

运效果展示:

이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

2.4 删除数据表

语法:

drop table 表名;

示例:删除数据表 MySQL命令:

drop table stu;

运行效果展示:

이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

五、数据表的约束

为防止错误的数据被插入到数据表,MySQL中定义了一些维护数据库完整性的规则;这些规则常称为表的约束。常见约束如下:

约束条件 说明
PRIMARY KEY 主键约束用于唯一标识对应的记录
FOREIGN KEY 外键约束
NOT NULL 非空约束
UNIQUE 唯一性约束
DEFAULT 默认值约束,用于设置字段的默认值

以上五种约束条件针对表中字段进行限制从而保证数据表中数据的正确性和唯一性。换句话说,表的约束实际上就是表中数据的限制条件。

1.主键约束

主键约束即primary key用于唯一的标识表中的每一行。被标识为主键的数据在表中是唯一的且其值不能为空。这点类似于我们每个人都有一个身份证号,并且这个身份证号是唯一的。
主键约束基本语法:

字段名 数据类型 primary key;

设置主键约束(primary key)的第一种方式
示例:MySQL命令:

create table student(id int primary key,name varchar(20));

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
设置主键约束(primary key)的第二·种方式
示例:MySQL命令:

create table student01(id intname varchar(20),primary key(id));

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

2.非空约束

非空约束即 NOT NULL指的是字段的值不能为空,基本的语法格式如下所示:

字段名 数据类型 NOT NULL;

示例:MySQL命令:

create table student02(id intname varchar(20) not null);

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

3.默认值约束

默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插人默认值;其基本的语法格式如下所示:

字段名 数据类型 DEFAULT 默认值;

示例:MySQL命令:

create table student03(id int,name varchar(20),gender varchar(10) default 'male');

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

5.唯一性约束

唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,其基本的语法格式如下所示:

字段名 数据类型 UNIQUE;

示例:MySQL命令:

create table student04(id int,name varchar(20) unique);

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

6.外键约束

外键约束即FOREIGN KEY常用于多张表之间的约束。基本语法如下:

-- 在创建数据表时语法如下:CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)-- 将创建数据表创号后语法如下:ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);

示例:创建一个学生表 MySQL命令:

create table student05(id int primary key,name varchar(20));

示例:创建一个班级表 MySQL命令:

create table class(classid int primary key,studentid int);

示例:学生表作为主表,班级表作为副表设置外键, MySQL命令:

alter table class add constraint fk_class_studentid foreign key(studentid) references student05(id);

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

6.1 数据一致性概念

大家知道:建立外键是为了保证数据的完整和统一性。但是,如果主表中的数据被删除或修改从表中对应的数据该怎么办呢?很明显,从表中对应的数据也应该被删除,否则数据库中会存在很多无意义的垃圾数据。

6.2 删除外键

语法如下:

alter table 从表名 drop foreign key 外键名;

示例:删除外键 MySQL命令:

alter table class drop foreign key fk_class_studentid;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
外键的那个字段不在了证明删除成功了

6.3 关于外键约束需要注意的细节

1、从表里的外键通常为主表的主键
2、从表里外键的数据类型必须与主表中主键的数据类型一致
3、主表发生变化时应注意主表与从表的数据一致性问题

六、数据表插入数据

在MySQL通过INSERT语句向数据表中插入数据。在此,我们先准备一张学生表,代码如下:

 create table student(
 id int,
 name varchar(30),
 age int,
 gender varchar(30)
 );

1. 为表中所有字段插入数据

每个字段与其值是严格一一对应的。也就是说:每个值、值的顺序、值的类型必须与对应的字段相匹配。但是,各字段也无须与其在表中定义的顺序一致,它们只要与 VALUES中值的顺序一致即可。
语法如下:

INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

示例:向学生表中插入一条学生信息 MySQL命令:

insert into student (id,name,age,gender) values (1,'bob',16,'male');

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

2. 为表中指定字段插入数据

语法如下:

INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

插入数据的方法基本和为表中所有字段插入数据,一样,只是需要插入的字段由你自己指定

3. 同时插入多条记录

语法如下:

INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;

在该方式中:(字段名1,字段名2,…)是可选的,它用于指定插人的字段名;(值 1,值 2,…),(值 1,值 2,…)表示要插人的记录,该记录可有多条并且每条记录之间用逗号隔开。
示例:向学生表中插入多条学生信息 MySQL命令:

insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male');

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

七、更新数据

在MySQL通过UPDATE语句更新数据表中的数据。在此,我们将就用六中的student学生表

1. UPDATE基本语法

UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];

在该语法中:字段名1、字段名2…用于指定要更新的字段名称;值1、值 2…用于表示字段的新数据;WHERE 条件表达式 是可选的,它用于指定更新数据需要满足的条件

2. UPDATE更新部分数据

示例:将name为tom的记录的age设置为20并将其gender设置为female MySQL命令:

update student set age=20,gender='female' where name='tom';

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

3. UPDATE更新全部数据

示例:将所有记录的age设置为18 MySQL命令:

update student set age=18;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

八、删除数据

在MySQL通过DELETE语句删除数据表中的数据。在此,我们先准备一张数据表,代码如下:

-- 创建学生表
 create table student(
 id int,
 name varchar(30),
 age int,
 gender varchar(30)
 );
 -- 插入数据
 insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male'),(5,'sal',19,'female'),(6,'sun',20,'male'),(7,'sad',13,'female'),(8,'sam',14,'male');

1. DELETE基本语法

在该语法中:表名用于指定要执行删除操作的表;[WHERE 条件表达式]为可选参数用于指定删除的条件。

DELETE FROM 表名 [WHERE 条件表达式];

2. DELETE删除部分数据

示例:删除age等于14的所有记录 MySQL命令:

delete from student where age=14;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

3. DELETE删除全部数据

示例:删除student表中的所有记录 MySQL命令:

delete from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

4. TRUNCATE和DETELE的区别

TRUNCATE和DETELE都能实现删除表中的所有数据的功能,但两者也是有区别的:
1、DELETE语句后可跟WHERE子句,可通过指定WHERE子句中的条件表达式只删除满足条件的部分记录;但是,TRUNCATE语句只能用于删除表中的所有记录。
2、使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时自动增加字段的默认初始值重新由1开始;使用DELETE语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时该字段的最大值加1
3、DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句

九、MySQL数据表简单查询

1.简单查询概述

简单查询即不含where的select语句。在此,我们讲解简单查询中最常用的两种查询:查询所有字段和查询指定字段。
在此,先准备测试数据,代码如下:

-- 创建数据库DROP DATABASE IF EXISTS mydb;CREATE DATABASE mydb;USE mydb;-- 创建student表CREATE TABLE student (
    sid CHAR(6),
    sname VARCHAR(50),
    age INT,
    gender VARCHAR(50) DEFAULT 'male');-- 向student表插入数据INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

2.查询所有字段(方法不唯一只是举例)

查询所有字段 MySQL命令:

select * from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

3.查询指定字段(sid、sname)

查询指定字段(sid、sname) MySQL命令:

select sid,sname from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

4.常数的查询

在SELECT中除了书写列名,还可以书写常数。可以用于标记
常数的查询日期标记 MySQL命令:

select sid,sname,'2021-03-02' from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

5.从查询结果中过滤重复数据

在使用DISTINCT 时需要注意:
在SELECT查询语句中DISTINCT关键字只能用在第一个所查列名之前。
MySQL命令:

select distinct gender from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

6.算术运算符(举例加运算符)

在SELECT查询语句中还可以使用加减乘除运算符。
查询学生10年后的年龄 MySQL命令:

 select sname,age+10 from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

十、函数

在此,先准备测试数据,代码如下:

-- 创建数据库DROP DATABASE IF EXISTS mydb;CREATE DATABASE mydb;USE mydb;-- 创建student表CREATE TABLE student (
    sid CHAR(6),
    sname VARCHAR(50),
    age INT,
    gender VARCHAR(50) DEFAULT 'male');-- 向student表插入数据INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

1.聚合函数

在开发中,我们常常有类似的需求:统计某个字段的最大值、最小值、 平均值等等。为此,MySQL中提供了聚合函数来实现这些功能。所谓聚合,就是将多行汇总成一行;其实,所有的聚合函数均如此——输入多行,输出一行。聚合函数具有自动滤空的功能,若某一个值为NULL,那么会自动将其过滤使其不参与运算。
聚合函数使用规则:
只有SELECT子句和HAVING子句、ORDER BY子句中能够使用聚合函数。例如,在WHERE子句中使用聚合函数是错误的。
接下来,我们学习常用聚合函数。

1.1、count()

统计表中数据的行数或者统计指定列其值不为NULL的数据个数
查询有多少该表中有多少人
MySQL命令:

select count(*) from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

1.2、max()

计算指定列的最大值,如果指定列是字符串类型则使用字符串排序运算

查询该学生表中年纪最大的学生
MySQL命令:

select max(age) from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

1.3、min()

计算指定列的最小值,如果指定列是字符串类型则使用字符串排序运算

查询该学生表中年纪最小的学生 MySQL命令:

select sname,min(age) from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

1.4、sum()

计算指定列的数值和,如果指定列类型不是数值类型则计算结果为0
查询该学生表中年纪的总和 MySQL命令:

select sum(age) from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

1.5、avg()

计算指定列的平均值,如果指定列类型不是数值类型则计算结果为

查询该学生表中年纪的平均数 MySQL命令:

select avg(age) from student;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

2.其他常用函数

这里我就不一一举例了,基本混个眼熟,以后用到再细说

2.1、时间函数

SELECT NOW();SELECT DAY (NOW());SELECT DATE (NOW());SELECT TIME (NOW());SELECT YEAR (NOW());SELECT MONTH (NOW());SELECT CURRENT_DATE();SELECT CURRENT_TIME();SELECT CURRENT_TIMESTAMP();SELECT ADDTIME('14:23:12','01:02:01');SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);SELECT DATEDIFF('2019-07-22','2019-05-05');

2.2、字符串函数

--连接函数SELECT CONCAT ()--SELECT INSTR ();--统计长度SELECT LENGTH();

2.3、数学函数

-- 绝对值SELECT ABS(-136);-- 向下取整SELECT FLOOR(3.14);-- 向上取整SELECT CEILING(3.14);

十一、条件查询

数据库中存有大量数据,我们可根据需求获取指定的数据。此时,我们可在查询语句中通过WHERE子句指定查询条件对查询结果进行过滤。
在开始学习条件查询之前,我们先准备测试数据,代码如下:

-- 创建数据库DROP DATABASE IF EXISTS mydb;CREATE DATABASE mydb;USE mydb;-- 创建student表CREATE TABLE student (
    sid CHAR(6),
    sname VARCHAR(50),
    age INT,
    gender VARCHAR(50) DEFAULT 'male');-- 向student表插入数据INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1012', 'lili', 14, 'male');INSERT INTO student (sid,sname,age,gender) VALUES ('S_1013', 'wang', 15, 'female');

1.使用关系运算符查询

在WHERE中可使用关系运算符进行条件查询,常用的关系运算符如下所示:

은(는) 과 같지 않습니다. 보다 작거나 같음 보다 보다 크거나 같음
관계 연산자 Explanation
=
과 같지 않습니다!=
>
>=

查询年龄等于或大于17的学生的信息 MySQL命令:

select * from student where age>=17;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

2.使用IN关键字查询

IN关键字用于判断某个字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,则将字段所在的记录将査询出来。

查询sid为S_1002和S_1003的学生信息 MySQL命令:

select * from student where sid in ('S_1002','S_1003');

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
查询sid为S_1001以外的学生的信息 MySQL命令:

select * from student where sid not in ('S_1001');

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

3.使用BETWEEN AND关键字查询

BETWEEN AND用于判断某个字段的值是否在指定的范围之内。如果字段的值在指定范围内,则将所在的记录将查询出来
查询15到18岁的学生信息 MySQL命令:

select * from student where age between 15 and 18;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
查询不是15到18岁的学生信息 MySQL命令:

select * from student where age not between 15 and 18;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

4.使用空值查询

在MySQL中,使用 IS NULL关键字判断字段的值是否为空值。请注意:空值NULL不同于0,也不同于空字符串
由于student表没有空值就不演示查询空值的了
查询sname不为空值的学生信息 MySQL命令:

select * from student where sname is not null;

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

5.使用AND关键字查询

在MySQL中可使用AND关键字可以连接两个或者多个查询条件。
查询年纪大于15且性别为male的学生信息 MySQL命令:

select * from student where age>15 and gender='male';

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

6.使用OR关键字查询

在使用SELECT语句查询数据时可使用OR关键字连接多个査询条件。在使用OR关键字时,只要记录满足其中任意一个条件就会被查询出来
查询年纪大于15或者性别为male的学生信息 MySQL命令:

select * from student where age>15 or gender='male';

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

7.使用LIKE关键字查询

MySQL中可使用LIKE关键字可以判断两个字符串是否相匹配

7.1 普通字符串

查询sname中与wang匹配的学生信息 MySQL命令:

select * from student where sname like 'wang';

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

7.2 含有%通配的字符串

%用于匹配任意长度的字符串。例如,字符串“a%”匹配以字符a开始任意长度的字符串
查询学生姓名以li开始的记录 MySQL命令:

select * from student where sname like 'li%';

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
查询学生姓名以g结尾的记录 MySQL命令:

select * from student where sname like '%g';

运行效果展示:
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
查询学生姓名包含s的记录 MySQL命令:

select * from student where sname like '%s%';

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

7.3 含有_通配的字符串

下划线通配符只匹配单个字符,如果要匹配多个字符,需要连续使用多个下划线通配符。例如,字符串“ab_”匹配以字符串“ab”开始长度为3的字符串,如abc、abp等等;字符串“a__d”匹配在字符“a”和“d”之间包含两个字符的字符串,如"abcd"、"atud"等等。
查询学生姓名以zx开头且长度为4的记录 MySQL命令:

select * from student where sname like 'zx__';

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

查询学生姓名以g结尾且长度为4的记录 MySQL命令:

select * from student where sname like '___g';

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

8.使用LIMIT限制查询结果的数量

当执行查询数据时可能会返回很多条记录,而用户需要的数据可能只是其中的一条或者几条
查询学生表中年纪最小的3位同学 MySQL命令:

select * from student order by age asc limit 3;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

9.使用GROUP BY进行分组查询

GROUP BY 子句可像切蛋糕一样将表中的数据进行分组,再进行查询等操作。换言之,可通俗地理解为:通过GROUP BY将原来的表拆分成了几张小表。
接下来,我们通过一个例子开始学习GROUP BY,代码如下

-- 创建数据库DROP DATABASE IF EXISTS mydb;CREATE DATABASE mydb;USE mydb;-- 创建员工表CREATE TABLE employee (
    id int,
    name varchar(50),
    salary int,
    departmentnumber int);-- 向员工表中插入数据INSERT INTO employee values(1,'tome',2000,1001); INSERT INTO employee values(2,'lucy',9000,1002); INSERT INTO employee values(3,'joke',5000,1003); INSERT INTO employee values(4,'wang',3000,1004); INSERT INTO employee values(5,'chen',3000,1001); INSERT INTO employee values(6,'yukt',7000,1002); INSERT INTO employee values(7,'rett',6000,1003); INSERT INTO employee values(8,'mujk',4000,1004); INSERT INTO employee values(9,'poik',3000,1001);

9.1 GROUP BY和聚合函数一起使用

统计各部门员工个数 MySQL命令:

select count(*), departmentnumber from employee group by departmentnumber;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
统计部门编号大于1001的各部门员工个数 MySQL命令:

select count(*), departmentnumber from employee where departmentnumber>1001 group by departmentnumber;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

9.2 GROUP BY和聚合函数以及HAVING一起使用

统计工资总和大于8000的部门 MySQL命令:

select sum(salary),departmentnumber from employee group by departmentnumber having sum(salary)>8000;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

10.使用ORDER BY对查询结果排序

从表中査询出来的数据可能是无序的或者其排列顺序不是我们期望的。为此,我们可以使用ORDER BY对查询结果进行排序
其语法格式如下所示:

SELECT 字段名1,字段名2,…FROM 表名ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC];

在该语法中:字段名1、字段名2是查询结果排序的依据;参数 ASC表示按照升序排序,DESC表示按照降序排序;默认情况下,按照ASC方式排序。通常情况下,ORDER BY子句位于整个SELECT语句的末尾。
查询所有学生并按照年纪大小升序排列 MySQL命令:

select * from student order by age asc;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
查询所有学生并按照年纪大小降序排列 MySQL命令:

select * from student order by age desc;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

十二、别名设置

在査询数据时可为表和字段取別名,该别名代替表和字段的原名参与查询操作。
操作的表事先已准备

1.为表取别名

在查询操作时,假若表名很长使用起来就不太方便,此时可为表取一个別名,用该别名来代替表的名称。语法格式如下所示:

SELECT * FROM 表名 [AS] 表的别名 WHERE .... ;

将student改为stu查询整表 MySQL命令:

select * from student as stu;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

2.为字段取别名

在查询操作时,假若字段名很长使用起来就不太方便,此时可该字段取一个別名,用该别名来代替字段的名称。语法格式如下所示:

SELECT 字段名1 [AS] 别名1 , 字段名2 [AS] 别名2 , ... FROM 表名 WHERE ... ;

将student中的name取别名为“姓名” 查询整表 MySQL命令:

select name as '姓名',id from student;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

十三、表的关联关系

在实际开发中数据表之间存在着各种关联关系。在此,介绍MySQL中数据表的三种关联关系。
多对一
多对一(亦称为一对多)是数据表中最常见的一种关系。例如:员工与部门之间的关系,一个部门可以有多个员工;而一个员工不能属于多个部门只属于某个部门。在多对一的表关系 中,应将外键建在多的一方否则会造成数据的冗余。
多对多
多对多是数据表中常见的一种关系。例如:学生与老师之间的关系,一个学生可以有多个老师而且一个老师有多个学生。通常情况下,为了实现这种关系需要定义一张中间表(亦称为连接表)该表会存在两个外键分别参照老师表和学生表。
一对一
在开发过程中,一对一的关联关系在数据库中并不常见;因为以这种方式存储的信息通常会放在同一张表中。
接下来,我们来学习在一对多的关联关系中如果添加和删除数据。先准备一些测试数据,代码如下:

DROP TABLE IF EXISTS student;DROP TABLE IF EXISTS class;-- 创建班级表CREATE TABLE class(
    cid int(4) NOT NULL PRIMARY KEY,
    cname varchar(30) );-- 创建学生表CREATE TABLE student(
    sid int(8) NOT NULL PRIMARY KEY,
    sname varchar(30),
    classid int(8) NOT NULL);-- 为学生表添加外键约束ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid);-- 向班级表插入数据INSERT INTO class(cid,cname)VALUES(1,'Java');INSERT INTO class(cid,cname)VALUES(2,'Python');-- 向学生表插入数据INSERT INTO student(sid,sname,classid)VALUES(1,'tome',1);INSERT INTO student(sid,sname,classid)VALUES(2,'lucy',1);INSERT INTO student(sid,sname,classid)VALUES(3,'lili',2);INSERT INTO student(sid,sname,classid)VALUES(4,'domi',2);

1.关联查询

查询Java班的所有学生 MySQL命令:

select * from student where classid=(select cid from class where cname='Java');

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

2.关于关联关系的删除数据

请从班级表中删除Java班级。在此,请注意:班级表和学生表之间存在关联关系;要删除Java班级,应该先删除学生表中与该班相关联的学生。否则,假若先删除Java班那么学生表中的cid就失去了关联
删除Java班 MySQL命令:

delete from student where classid=(select cid from class where cname='Java');delete from class where cname='Java';

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

十四、多表连接查询

1.交叉连接查询

交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积;比如:集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉连接也被称为笛卡尔连接,其语法格式如下:

SELECT * FROM 表1 CROSS JOIN 表2;

在该语法中:CROSS JOIN用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合。
由于这个交叉连接查询在实际运用中没有任何意义,所以只做为了解即可

2.内连接查询

内连接(Inner Join)又称简单连接或自然连接,是一种非常常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较并列出与连接条件匹配的数据行,组合成新的 记录。也就是说在内连接查询中只有满足条件的记录才能出现在查询结果中。其语法格式如下:

SELECT 查询字段1,查询字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表2.关系字段

在该语法中:INNER JOIN用于连接两个表,ON来指定连接条件;其中INNER可以省略。

准备数据,代码如下:

-- 若存在数据库mydb则删除DROP DATABASE IF EXISTS mydb;-- 创建数据库mydbCREATE DATABASE mydb;-- 选择数据库mydbUSE mydb;-- 创建部门表CREATE TABLE department(
  did int (4) NOT NULL PRIMARY KEY, 
  dname varchar(20));-- 创建员工表CREATE TABLE employee (
  eid int (4) NOT NULL PRIMARY KEY, 
  ename varchar (20), 
  eage int (2), 
  departmentid int (4) NOT NULL);-- 向部门表插入数据INSERT INTO department VALUES(1001,'财务部');INSERT INTO department VALUES(1002,'技术部');INSERT INTO department VALUES(1003,'行政部');INSERT INTO department VALUES(1004,'生活部');-- 向员工表插入数据INSERT INTO employee VALUES(1,'张三',19,1003);INSERT INTO employee VALUES(2,'李四',18,1002);INSERT INTO employee VALUES(3,'王五',20,1001);INSERT INTO employee VALUES(4,'赵六',20,1004);

查询员工姓名及其所属部门名称 MySQL命令:

select employee.ename,department.dname from department inner join employee on department.did=employee.departmentid;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

3.外连接查询

在使用内连接查询时我们发现:返回的结果只包含符合查询条件和连接条件的数据。但是,有时还需要在返回查询结果中不仅包含符合条件的数据,而且还包括左表、右表或两个表中的所有数据,此时我们就需要使用外连接查询。外连接又分为左(外)连接和右(外)连接。其语法格式如下:

SELECT 查询字段1,查询字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件

由此可见,外连接的语法格式和内连接非常相似,只不过使用的是LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN关键字。其中,关键字左边的表被称为左表,关键字右边的表被称为右表;OUTER可以省略。
在使用左(外)连接和右(外)连接查询时,查询结果是不一致的,具体如下:
1、LEFT [OUTER] JOIN 左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录。
2、RIGHT [OUTER] JOIN 右(外)连接:返回包括右表中的所有记录和左表中符合连接条件的记录。

先准备数据,代码如下:

-- 若存在数据库mydb则删除DROP DATABASE IF EXISTS mydb;-- 创建数据库mydbCREATE DATABASE mydb;-- 选择数据库mydbUSE mydb;-- 创建班级表CREATE TABLE class(
  cid int (4) NOT NULL PRIMARY KEY, 
  cname varchar(20));-- 创建学生表CREATE TABLE student (
  sid int (4) NOT NULL PRIMARY KEY, 
  sname varchar (20), 
  sage int (2), 
  classid int (4) NOT NULL);-- 向班级表插入数据INSERT INTO class VALUES(1001,'Java');INSERT INTO class VALUES(1002,'C++');INSERT INTO class VALUES(1003,'Python');INSERT INTO class VALUES(1004,'PHP');-- 向学生表插入数据INSERT INTO student VALUES(1,'张三',20,1001);INSERT INTO student VALUES(2,'李四',21,1002);INSERT INTO student VALUES(3,'王五',24,1002);INSERT INTO student VALUES(4,'赵六',23,1003);INSERT INTO student VALUES(5,'Jack',22,1009);

准备这组数据有一定的特点,为的是让大家直观的看出左连接与右连接的不同之处
1、班级编号为1004的PHP班级没有学生
2、学号为5的学生王跃跃班级编号为1009,该班级编号并不在班级表中

3.1 左(外)连接查询

左(外)连接的结果包括LEFT JOIN子句中指定的左表的所有记录,以及所有满足连接条件的记录。如果左表的某条记录在右表中不存在则在右表中显示为空。
查询每个班的班级ID、班级名称及该班的所有学生的名字 MySQL命令:

select class.cid,class.cname,student.sname from class left outer join student on class.cid=student.classid;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
展示结果分析:
1、分别找出Java班、C++班、Python班的学生
2、右表的王跃跃不满足查询条件故其没有出现在查询结果中
3、虽然左表的PHP班没有学生,但是任然显示了PHP的信息;但是,它对应的学生名字为NULL

3.2 右(外)连接查询

右(外)连接的结果包括RIGHT JOIN子句中指定的右表的所有记录,以及所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。
查询每个班的班级ID、班级名称及该班的所有学生的名字 MySQL命令:

select class.cid,class.cname,student.sname from class right outer join student on class.cid=student.classid;

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
展示结果分析:
1、分别找出Java班、C++班、Python班的学生
2、左表的PHP班不满足查询条件故其没有出现在查询结果中
3、虽然右表的jack没有对应班级,但是任然显示王跃跃的信息;但是,它对应的班级以及班级编号均为NULL

十五、子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询;该查询语句可以嵌套在一个 SELECT、SELECT…INTO、INSERT…INTO等语句中。在执行查询时,首先会执行子查询中的语句,再将返回的结果作为外层查询的过滤条件。在子査询中通常可以使用比较运算符和IN、EXISTS、ANY、ALL等关键字。

准备数据,代码如下:

DROP TABLE IF EXISTS student;DROP TABLE IF EXISTS class;-- 创建班级表CREATE TABLE class(
  cid int (4) NOT NULL PRIMARY KEY, 
  cname varchar(20));-- 创建学生表CREATE TABLE student (
  sid int (4) NOT NULL PRIMARY KEY, 
  sname varchar (20), 
  sage int (2), 
  classid int (4) NOT NULL);-- 向班级表插入数据INSERT INTO class VALUES(1001,'Java');INSERT INTO class VALUES(1002,'C++');INSERT INTO class VALUES(1003,'Python');INSERT INTO class VALUES(1004,'PHP');INSERT INTO class VALUES(1005,'Android');-- 向学生表插入数据INSERT INTO student VALUES(1,'张三',20,1001);INSERT INTO student VALUES(2,'李四',21,1002);INSERT INTO student VALUES(3,'王五',24,1003);INSERT INTO student VALUES(4,'赵六',23,1004);INSERT INTO student VALUES(5,'小明',21,1001);INSERT INTO student VALUES(6,'小红',26,1001);INSERT INTO student VALUES(7,'小亮',27,1002);

1.带比较运算符的子查询

比较运算符前面我们提到过得,就是>、=、查询张三同学所在班级的信息 MySQL命令:

select * from class where cid=(select classid from student where sname='张三');

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.
查询比张三同学所在班级编号还大的班级的信息 MySQL命令:

select * from class where cid>(select classid from student where sname='张三');

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

2.带EXISTS关键字的子查询

EXISTS关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会 执行
假如王五同学在学生表中则从班级表查询所有班级信息 MySQL命令:

select * from class where exists (select * from student where sname='王五');

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

3.带ANY关键字的子查询

ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。

查询比任一学生所属班级号还大的班级编号 MySQL命令:

select * from class where cid > any (select classid from student);

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

4.带ALL关键字的子查询

ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。

查询比所有学生所属班级号还大的班级编号 MySQL命令:

select * from class where cid > all (select classid from student);

运行效果展示
이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.

요약

중요(키워드 분석 중):
쿼리문의 작성 순서 및 실행 순서
select ===> from ===> ; ===> 제한이 있음
쿼리문 실행 순서 ===> ===> ===> 주문 ===> limi
리뷰를 바탕으로 공유하게 되어 이 글을 갖게 되었습니다! ! !


이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.【추천:

mysql 비디오 튜토리얼

위 내용은 이 글은 MySQL 기초 37,000 단어를 정리(정리 및 공유)하기에 충분합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제