From c76ec2f307e6c2153dff07ae39ce27b4c195ae8d Mon Sep 17 00:00:00 2001 From: unknown <2112572495@qq.com> Date: Thu, 23 Feb 2023 10:39:22 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\346\215\256\347\261\273\345\236\213.md" | 698 ++++++++++++++++++ ...20230221 MySQL\347\272\246\346\235\237.md" | 367 +++++++++ 2 files changed, 1065 insertions(+) create mode 100644 "39 \351\203\255\346\202\246\350\277\216/20230217 SQL\350\257\255\345\217\245\345\222\214\346\225\260\346\215\256\347\261\273\345\236\213.md" create mode 100644 "39 \351\203\255\346\202\246\350\277\216/20230221 MySQL\347\272\246\346\235\237.md" diff --git "a/39 \351\203\255\346\202\246\350\277\216/20230217 SQL\350\257\255\345\217\245\345\222\214\346\225\260\346\215\256\347\261\273\345\236\213.md" "b/39 \351\203\255\346\202\246\350\277\216/20230217 SQL\350\257\255\345\217\245\345\222\214\346\225\260\346\215\256\347\261\273\345\236\213.md" new file mode 100644 index 0000000..acfa257 --- /dev/null +++ "b/39 \351\203\255\346\202\246\350\277\216/20230217 SQL\350\257\255\345\217\245\345\222\214\346\225\260\346\215\256\347\261\273\345\236\213.md" @@ -0,0 +1,698 @@ +# 第4章 SQL语句 + +SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。 + +## 4.1 SQL的分类 + +| 名称 | 解释 | 命令 | +| :-------------------: | :-------------------------------------------: | :----------------------------------------------------------: | +| DDL (数据定义语言) | 定义和管理数据对象结构,如数据库,数据表等 | 创建(create),修改(alter),删除(drop) show(展示)结构 | +| DML (数据操作语言) | 用于操作数据库对象中所包含的数据 | 增(insert),删(delete),改(update) 数据 | +| DQL (数据查询语言) | 用于查询数据库数据 | 查(select) | +| DCL (数据控制语 言) | 用于管理数据库的语言,包括管理权限及数 据更改 | grant(授权),commit(确认),rollback(回滚) | + +其他语句:USE语句,SHOW语句,SET语句等。这类的官方文档中一般称为命令。 + +## 4.2 SQL语法规范 + +(1)mysql的sql语法不区分大小写 + +- A:数据库的表中的数据是否区分大小写。这个的话要看表格的字段的数据类型、编码方式以及校对规则。 + +​ ci(大小写不敏感),cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关,区分大小写) + +- B:sql中的关键字,比如:create,insert等,不区分大小写。但是大家习惯上把关键字都“大写”。 + + +(2)命名时:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号 + +(3)建议不要使用mysql的关键字等来作为**表名、字段名、数据库**名等,如果不小心使用,请在SQL语句中使用`(飘号/反引号)引起来,说明 : 反引号用于区别MySQL保留字与普通字符而引入的 (键盘esc下面的键) + +(4)数据库和表名、字段名等对象名中间不要包含空格 + +```mysql +create database my mxdx; + +ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mxdx' at line 1 +``` + +(5)同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名 + +```mysql +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mxdx | +| mysql | +| performance_schema | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +mysql> create database mxdx; +ERROR 1007 (HY000): Can't create database 'mxdx'; database exists +``` + +```mysql +mysql> show tables; ++---------------------+ +| Tables_in_mxdx | ++---------------------+ +| student | +| temp | ++---------------------+ +2 rows in set (0.00 sec) + +mysql> create table temp(id int); +ERROR 1050 (42S01): Table 'temp' already exists +``` + +``` +mysql> create table tt( + -> id int, + -> id int + -> ); +ERROR 1060 (42S21): Duplicate(重复) column name 'id' +``` + +## 4.3 SQL脚本中如何加注释 + +SQL脚本中如何加注释 + +- 单行注释:#注释内容(mysql特有的) + +- 单行注释:--空格注释内容 其中--后面的空格必须有 + +- 多行注释:/* 注释内容 */ + +```mysql +create table tt( + id int, #编号 + `name` varchar(20), -- 姓名 + gender enum('男','女') + /* + 性别只能从男或女中选择一个, + 不能两个都选,或者选择男和女之外的 + */ +); +``` + +## 4.4 mysql脚本中的标点符号 + +mysql脚本中标点符号的要求如下: + +1. 本身成对的标点符号必须成对,例如:(),'',""。 + +2. 所有标点符号必须英文状态下半角输入方式下输入。 + + +几个特殊的标点符号: + +1. 小括号(): + - 在创建表、添加数据、函数使用、子查询、计算表达式等等会用()表示某个部分是一个整体结构。 + - 思考: 2+3 * 6 =20 和 (2+3) * 6 =30的区别 + +2. 单引号'':**字符串和日期类型的数据值使用单引号''引起来**,数值类型的不需要加标点符号。 +3. “2023-10--10” +4. 双引号"":列的别名可以使用引号"",**给表名取别名不要用引号**。 +5. 在MySQL中双引号通常等价于单引号 + + +```sql +create table tt( + id int + ; + +ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2 +``` + +```mysql +create table temp( + c char +); +insert into temp values('尚) ; #缺一半单引号 + +insert into temp values(‘尚’) ; #标点符号是中文 +``` + +```mysql +mysql> select * from student; ++------+------+ +| id | name | ++------+------+ +| 1 | 张三 | +| 2 | 李四 | ++------+------+ +2 rows in set (0.00 sec) + +mysql> select id "学号",name "姓名" from student; ++------+------+ +| 学号 | 姓名 | ++------+------+ +| 1 | 张三 | +| 2 | 李四 | ++------+------+ +2 rows in set (0.00 sec) +``` + +# 第5章 MySQL支持的数据类型 + +## 5.1 数值类型:包括整数和小数 + +数值类型主要用来存储数字,不同的数值类型提供不同的取值范围,可以存储的值范围越大,所需要的存储空间也越大。 + +对于MySQL中的数值类型,还要做如下说明: + +- 关键字INT是INTEGER的同义词。 +- 关键字DEC和FIXED是DECIMAL的同义词。 + +### 5.1.1 整数类型 + +![image-20211127205706588](C:\Users\Administrator\Desktop\第4章 SQL语句.assets\image-20211127205706588.png) + +**说明:** + +对于整数类型,MySQL还支持在类型名称后面加小括号(M),而小括号中的M表示显示宽度,M的取值范围是(0, 255)。int(M)这个M在字段的属性中指定了unsigned(无符号)和zerofill(零填充)的情况下才有意义。表示当整数值不够M位时,用0填充。如果整数值超过M位但是没有超过当前数据类型的范围时,就按照实际位数存储。当M宽度超过当前数据类型可存储数值范围的最大宽度时,也是以实际存储范围为准。 + +```mysql +#演示整数类型 +#创建一个表格,表格的名称“t_int”, +#包含两个字段i1和i2,分别是int和int(2)类型 +#create table t_int(i1 int,i2 int(2)); +create table t_int( + i1 int, + i2 int(2) #没有unsigned zerofill,(2)没有意义 +); + +#查看当前数据库的所有表格 +show tables; +show tables from 数据库名; + +#查看表结构 +desc 表名称; +desc t_int; + +mysql> desc t_int; ++-------+------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-------+------+------+-----+---------+-------+ +| i1 | int | YES | | NULL | | +| i2 | int | YES | | NULL | | ++-------+------+------+-----+---------+-------+ +2 rows in set (0.01 sec) + +#创建一个表格,表格的名称“t_int2”, +#包含两个字段i1和i2,分别是int和int(2)类型 +create table t_int2( + i1 int, + i2 int(2) unsigned zerofill +); + +mysql> desc t_int2; ++-------+--------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-------+--------------------------+------+-----+---------+-------+ +| i1 | int | YES | | NULL | | +| i2 | int(2) unsigned zerofill | YES | | NULL | | ++-------+--------------------------+------+-----+---------+-------+ +2 rows in set (0.01 sec) + +#添加数据到表格中 +insert into 表名称 values(值列表); +insert into t_int values(1234,1234); +insert into t_int2 values(1234,1234); + +#查询数据 +select * from 表名称; +select * from t_int; +select * from t_int2; + +#添加数据到表格中 +insert into 表名称 values(值列表); +insert into t_int values(1,1); +insert into t_int2 values(1,1); + +insert into t_int values(12222228854225548778455,12222228854225548778455); +mysql> insert into t_int values(12222228854225548778455,12222228854225548778455); +ERROR 1264 (22003): Out of range value for column 'i1' at row + +``` + + + +### 5.1.2 小数类型 + +MySQL中使用浮点数和定点数来表示小数。 + +浮点数有两种类型:单精度浮点数(FLOAT)和双精度浮点数(DOUBLE),定点数只有DECIMAL。浮点数和定点数都可以用(M,D)来表示。 + +- M是精度,表示该值总共显示M位,包括整数位和小数位,对于FLOAT和DOUBLE类型来说,M取值范围为0~255,而对于DECIMAL来说,M取值范围为0~65。 +- D是标度,表示小数的位数,取值范围为0~30,同时必须<=M。 + +DECIMAL实际是以字符串形式存放的,在对精度要求比较高的时候(如货币、科学数据等)使用DECIMAL类型会比较好。浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围,它的缺点是会引起精度问题。 + +![image-20211127210358326](C:\Users\Administrator\Desktop\第4章 SQL语句.assets\image-20211127210358326.png) + +```mysql +#演示小数类型 +#创建表格 +create table t_double( + d1 double, + d2 double(5,2) #-999.99~999.99 +); + +#查看表结构 +desc t_double; + +#添加数据 +insert into t_double values(2.5,2.5); + +#查看数据 +select * from t_double; +mysql> select * from t_double; ++------+------+ +| d1 | d2 | ++------+------+ +| 2.5 | 2.50 |#d2字段小数点后不够2位用0补充 ++------+------+ +1 row in set (0.00 sec) + +#添加数据 +insert into t_double values(2.5526,2.5526); +insert into t_double values(2.5586,2.5586); + +mysql> select * from t_double; ++--------+------+ +| d1 | d2 | ++--------+------+ +| 2.5 | 2.50 | +| 2.5526 | 2.55 |#小数点后有截断现象,并且会四舍五入 +| 2.5586 | 2.56 |#小数点后有截断现象,并且会四舍五入 ++--------+------+ +3 rows in set (0.00 sec) + + +#添加数据 +insert into t_double values(12852.5526,12852.5526); + +#d2字段整数部分超过(5-2=3)位,添加失败 +mysql> insert into t_double values(12852.5526,12852.5526); +ERROR 1264 (22003): Out of range value for column 'd2' at row 1 + + +#创建表格 +create table t_decimal( + d1 decimal, #没有指定(M,D)默认是(10,0) + d2 decimal(5,2) +); + + +#查看表结构 +desc t_decimal; +mysql> desc t_decimal; ++-------+---------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-------+---------------+------+-----+---------+-------+ +| d1 | decimal(10,0) | YES | | NULL | | +| d2 | decimal(5,2) | YES | | NULL | | ++-------+---------------+------+-----+---------+-------+ +2 rows in set (0.01 sec) + +#添加数据 +insert into t_decimal values(2.5,2.5); + +#查看数据 +select * from t_decimal; +mysql> select * from t_decimal; ++------+------+ +| d1 | d2 | ++------+------+ +| 3 | 2.50 | #d1字段小数点后截断 ++------+------+ +1 row in set (0.00 sec) + +insert into t_decimal values(12852.5526,12852.5526); + +-- 把小数赋值给整数类型的字段时,会截断小数部分,考虑四舍五入 +insert into t_int2 values(1.5,1.5); +``` + + + +## 5.2 字符串类型 + +MySQL的字符串类型有CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SET等。MySQL的字符串类型可以用来存储文本字符串数据,还可以存储二进制字符串。 + +文本字符串类型: + +![image-20211127210547156](C:\Users\Administrator\Desktop\第4章 SQL语句.assets\image-20211127210547156.png) + +二进制字符串类型: + +![image-20211127210608685](C:\Users\Administrator\Desktop\第4章 SQL语句.assets\image-20211127210608685.png) + +### 1、CHAR(M)为固定长度的字符串 + +CHAR(M)为固定长度的字符串, M表示最多能存储的字符数,取值范围是0~255个字符,如果未指定(M)表示只能存储1个字符。例如CHAR(4)定义了一个固定长度的字符串列,其包含的字符个数最大为4,如果存储的值少于4个字符,右侧将用空格填充以达到指定的长度,当查询显示CHAR值时,尾部的空格将被删掉。 + +```mysql +create table temp( + c1 char, + c2 char(3) +); +``` + +```mysql +insert into temp values('男','女');#成功 + +insert into temp values('桃花岛','桃花岛');#失败 +ERROR 1406 (22001): Data too long for column 'c1' at row 1 + +insert into temp values('男','桃花岛');#成功 +``` + +### 2、VARCHAR(M)为可变长度的字符串 + +- M表示最多能存储的字符数,最大范围由字符集及M共同决定 +- M不可缺省,必须指定(M),否则报错。 +- 实际长度达不到M值时,以实际长度为准。 +- VARBINARY类型的数据除了存储数据本身外,还需要1或2个字节来存储数据的字节数。 + +```mysql +create table temp( + name varchar #错误 +); +``` + +```mysql +create table temp( + name varchar(3) #最多不超过3个字符 +); +``` + +```mysql +insert into temp values('桃花岛'); + +insert into temp values('桃花岛真好');#ERROR 1406 (22001): Data too long for column 'name' at row 1 + +insert into temp values('好'); +``` + +```mysql +drop table temp; +create table temp( + name varchar(65535) +); +#ERROR 1074 (42000): Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead +因为当前的表是UTF8,一个汉字占3个字节 +``` + +![image-20211127210826463](C:\Users\Administrator\Desktop\第4章 SQL语句.assets\image-20211127210826463.png) + +**使用场景**: + +- 身份证号、手机号码、QQ号、用户名username、密码password、银行卡号等固定长度的文本字符串适合使用CHAR类型; +- 评论、朋友圈、微博不定长度的文本字符串更适合使用VARCHAR类型。 + +## 5.3 日期时间类型 + +![image-20211127212047635](C:\Users\Administrator\Desktop\第4章 SQL语句.assets\image-20211127212047635.png) + +- 如果仅仅是表示年份信息,可以只使用YEAR类型,这样更节省空间,格式为“YYYY”,例如“2022”。YEAR允许的值范围是1901~2155。 +- 如果要表示年月日,可以使用DATE类型,格式为“YYYY-MM-DD”,例如“2022-02-04”。 +- 如果要表示时分秒,可以使用TIME类型,格式为“HH:MM:SS”,例如“10:08:08”。 +- 如果要表示年月日时分秒的完整日期时间,可以使用DATATIME类型,格式为“YYYY-MM-DD HH:MM:SS”,例如“2022-02-04 10:08:08”。 +- 如果需要经常插入或更新日期时间为系统日期时间,则通常使用TIMESTAMP类型,格式为“YYYY-MM-DD HH:MM:SS”,例如“2022-02-04 10:08:08”。TIMESTAMP与DATETIME的区别在于TIMESTAMP的取值范围小,只支持1970-01-01 00:00:01 UTC至2038-01-19 03:14:07 UTC范围的日期时间值,其中UTC是世界标准时间,并且TIMESTAMP类型的日期时间值在存储时会将当前时区的日期时间值转换为时间标准时间值,检索时再转换回当前时区的日期时间值,这会更友好。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的。另外,TIMESTAMP的属性受MySQL版本和服务器SQLMode的影响很大。 + +```mysql +create table temp( + d1 datetime, + d2 timestamp +); +``` + +```mysql +insert into temp values('2021-9-2 14:45:52','2021-9-2 14:45:52'); +``` + +```mysql +#修改当前的时区 +set time_zone = '+9:00'; +``` + +```mysql +insert into temp values('202192144552','202192144552'); +#ERROR 1292 (22007): Incorrect datetime value: '202192144552' for column 'd1' at row 1 +``` + +```mysql +insert into temp values('20210902144552','20210902144552'); +``` + +```mysql +insert into temp values('2021&9&2 14%45%52','2021#9#2 14@45@52'); +``` + +```mysql +create table temp( + d year +); +``` + +```mysql +insert into temp values(2021); +insert into temp values(85); +insert into temp values(22); +insert into temp values(69); +insert into temp values(0); +insert into temp values('0'); +``` + +```mysql +mysql> select * from temp; ++------+ +| d | ++------+ +| 2021 | +| 1985 | +| 2022 | ++------+ +3 rows in set (0.00 sec) +``` + +## 5.4 Enum和Set类型 + +无论是数值类型、日期类型、普通的文本类型,可取值的范围都非常大,但是有时候我们指定在固定的几个值范围内选择一个或多个,那么就需要使用ENUM枚举类型和SET集合类型了。 + +比如性别只有“男”或“女”;上下班交通方式可以有“地铁”、“公交”、“出租车”、“自行车”、“步行”等。 + +枚举和集合类型字段声明的语法格式如下: + +- 字段名ENUM(‘值1’,‘值2’,…‘值n’) + + +- 字段名 SET(‘值1’,‘值2’,…‘值n’) + + +ENUM类型的字段在赋值时,只能在指定的枚举列表中取值,而且一次只能取一个。枚举列表最多可以有65535个成员。ENUM值在内部用整数表示,每个枚举值均有一个索引值, MySQL存储的就是这个索引编号。例如,定义ENUM类型的列(‘first’, ‘second’, ‘third’)。 + +![image-20211127211743925](C:\Users\Administrator\Desktop\第4章 SQL语句.assets\image-20211127211743925.png) + +SET类型的字段在赋值时,可从定义的值列表中选择1个或多个值的组合。SET列最多可以有64个成员。SET值在内部也用整数表示,分别是1,2,4,8……,都是2的n次方值,因为这些整数值对应的二进制都是只有1位是1,其余是0。 + +![image-20211127211806889](C:\Users\Administrator\Desktop\第4章 SQL语句.assets\image-20211127211806889.png) + + **演示枚举类型:** + +```mysql +create table temp( + gender enum('男','女'), + hobby set('睡觉','打游戏','泡妞','写代码') +); +``` + +```mysql +insert into temp values('男','睡觉,打游戏'); #成功 + +insert into temp values('男,女','睡觉,打游戏'); #失败 +#ERROR 1265 (01000): Data truncated for column 'gender' at row 1 + +insert into temp values('妖','睡觉,打游戏');#失败 +#ERROR 1265 (01000): Data truncated for column 'gender' at row 1 + +insert into temp values('男','睡觉,打游戏,吃饭'); +#ERROR 1265 (01000): Data truncated for column 'hobby' at row 1 +``` + +```mysql +#文本类型中的枚举和集合 +#枚举:固定的几个字符串值,从中选择一个 +#集合:固定的几个字符串值,从中选择任意几个 + +create table t_enum_set( + gender enum('男','女'), + hobby set('游戏','睡觉','打代码','运动') +); + +#查看表结构 +desc t_enum_set; + +mysql> desc t_enum_set; ++--------+------------------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------+------------------------------------+------+-----+---------+-------+ +| gender | enum('男','女') | YES | | NULL | | +| hobby | set('游戏','睡觉','打代码','运动') | YES | | NULL | | ++--------+------------------------------------+------+-----+---------+-------+ +2 rows in set (0.01 sec) + + +#添加数据 +insert into t_enum_set +values('男','游戏'); + +#查看数据 +select * from t_enum_set; + +#添加数据 +insert into t_enum_set +values('男,女','游戏,睡觉'); + +mysql> insert into t_enum_set + -> values('男,女','游戏,睡觉'); +ERROR 1265 (01000): Data truncated for column 'gender' at row 1 + +#添加数据 +insert into t_enum_set +values('男','游戏,睡觉'); + +#添加数据 +insert into t_enum_set +values('妖','游戏,睡觉'); +mysql> insert into t_enum_set + -> values('妖','游戏,睡觉'); +ERROR 1265 (01000): Data truncated for column 'gender' at row 1 + +#添加数据 +insert into t_enum_set +values('男','游戏,睡觉,做饭'); +mysql> insert into t_enum_set + -> values('男','游戏,睡觉,做饭'); +ERROR 1265 (01000): Data truncated for column 'hobby' at row 1 + +insert into t_enum_set +values(2, 2); + +mysql> select * from t_enum_set; ++--------+-----------+ +| gender | hobby | ++--------+-----------+ +| 男 | 游戏 | +| 男 | 游戏,睡觉 | +| 女 | 睡觉 | ++--------+-----------+ +3 rows in set (0.00 sec) + +insert into t_enum_set +values(2, 5); +#5 可以看出 1和4的组合,00001 和 0100,0101 + +insert into t_enum_set +values(2, 7); +mysql> select * from t_enum_set; ++--------+------------------+ +| gender | hobby | ++--------+------------------+ +| 男 | 游戏 | +| 男 | 游戏,睡觉 | +| 女 | 睡觉 | +| 女 | 游戏,打代码 | +| 女 | 游戏,睡觉,打代码 | ++--------+------------------+ +5 rows in set (0.00 sec) + +insert into t_enum_set +values(2, 15); +mysql> select * from t_enum_set; ++--------+-----------------------+ +| gender | hobby | ++--------+-----------------------+ +| 男 | 游戏 | +| 男 | 游戏,睡觉 | +| 女 | 睡觉 | +| 女 | 游戏,打代码 | +| 女 | 游戏,睡觉,打代码 | +| 女 | 游戏,睡觉,打代码,运动 | ++--------+-----------------------+ +6 rows in set (0.00 sec) + +insert into t_enum_set +values(2, 25); +mysql> insert into t_enum_set + -> values(2, 25); +ERROR 1265 (01000): Data truncated for column 'hobby' at row 1 +``` + +## 5.5 数据字段属性 + + **unsigned** + +- 无符号的 + +- 声明该数据列不允许负数 + + **ZEROFILL** + +- 0填充的 + +- 不足位数的用0来填充 , 如int(3),5则为005 + +**auto_increment** + +- 自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认) +- 通常用于设置主键 , 且为整数类型 +- 可定义起始值和步长 + - 当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表 + - SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局) + +**NULL 和 NOT NULL** + +- 默认为NULL , 即没有插入该列的数值 +- 如果设置为NOT NULL , 则该列必须有值 + +**DEFAULT** + +- 默认的 + +- 用于设置默认值 + +- 例如,性别字段,默认为"男" , 否则为 "女" ; 若无指定该列的值 , 则默认值为"男"的值 + +- ```mysql + -- 目标 : 创建一个school数据库 + -- 创建学生表(列,字段) + -- 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住 址,email + -- 创建表之前 , 一定要先选择数据库 + CREATE TABLE IF NOT EXISTS `student` ( + `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号', + `name` varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名', + `pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码', + `sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性别', + `birthday` datetime DEFAULT NULL COMMENT '生日', + `address` varchar(100) DEFAULT NULL COMMENT '地址', + `email` varchar(50) DEFAULT NULL COMMENT '邮箱', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 + -- 查看数据库的定义 + SHOW CREATE DATABASE school; + -- 查看数据表的定义 + SHOW CREATE TABLE student; + -- 显示表结构 + DESC student; + -- 设置严格检查模式(不能容错了) + SET sql_mode='STRICT_TRANS_TABLES'; + ``` + + \ No newline at end of file diff --git "a/39 \351\203\255\346\202\246\350\277\216/20230221 MySQL\347\272\246\346\235\237.md" "b/39 \351\203\255\346\202\246\350\277\216/20230221 MySQL\347\272\246\346\235\237.md" new file mode 100644 index 0000000..e1dfb46 --- /dev/null +++ "b/39 \351\203\255\346\202\246\350\277\216/20230221 MySQL\347\272\246\346\235\237.md" @@ -0,0 +1,367 @@ +## MySQL约束 + +约束:主键、唯一、非空、默认、自增、外键 + +#### 主键约束 + +1. 关键字是primary key +2. 特点:每一个表当中只能有一个主键约束 +3. 主键约束的字段值不允许为null值 +4. 不允许重复 + +解决方法.1:单独使用一个id列当主键 + +解决方法2:复合主键 + +```mysql +create table xuanke( + sid int, + cid int, + score int, + primary key(sid,cid) #它俩组合不能为 null ,并且唯一 +); +``` + +建表后增加约束 + +```mysql +alter table 表名称 add primary key(字段列表); +``` + +如果是一个字段,就是一个字段是主键 (字段列表)如果是多个字段,就是复合主键 + +如果想要删除主键约束 + +```mysql +alter table 表名称 drop primary key; +alter table student dtop primary key; +``` + +#### 唯一键约束 + +1. 关键字:unique key +2. 特点:允许为null +3. 不能重复 +4. 一个表可以有多个唯一键约束 + +建表后增加唯一键约束 + +```mysql +alter table 表名称 add unique key (字段列表); +alter table student add unique key (sname); +``` + +如果用语句删除唯一键约束 + +```mysql +alter table 表名称 drop index 索引名; +``` + +#### 非空约束 + +```mysql +not null # 不允许为空 +``` + +#### 默认值约束 + +如果某个字段,在添加数据时未指定值时,希望不要用null处理而是按照一个默认值处理,就可以使用默认值约束 + +```mysql +default +``` + +删除score的非空约束 + +```mysql +alter table student modify score int; +``` + +增加非空约束 + +```mysql +alter table student modify score int not null; +``` + +删除gender的默认值约束 保留非空约束 + +```mysql +alter table student modify gender enum('男','女') not null; +``` + +#### 检查约束 + +MySQL5.7不支持check约束,在MySQL中开始支持check约束 + +#### 外键约束 + +约束俩个表的关系,或者是一个表的俩个字段之间的关系 + +(1)主表(父表)和从表(子表) 主表:被依赖,被参考 从表:依赖别人的,参考别人的 + +例如:学生表、课程表、选课表 选课表中的学号,它的值是依赖于学生表的学号。 选课表是从表, 学生表是主表。 选课表中的课程编号,它的值是依赖于课程表的课程编号。 选课表是从表, 课程表示主表。 + +(2)外键的建立和指定要在从表中定义 (3)关键字 foreign key (4)格式 + +```mysql +foreign key (从表的字段) references 主表(被依赖字段[主键]) +``` + +(5)要求 A:主表必须先存在 B:主表被依赖字段必须有索引,所以通常是主键列或唯一键列等才能作为被依赖字段。 C:删除表时,要么先删除从表,再删除主表,要么先解除外键约束,然后各自删除。 D:从(子)表的依赖字段的数据,必须在主(父)表被依赖字段中选择。 添加和修改都是这样的。 E:主(父)表被依赖字段的数据不能轻易的删除和修改,要看是否被引用 + +```my +外键约束等级为 on update/delete cascade /(set null) +``` + +7、自增属性 维护某个字段的值自动增长的一个属性。 它的要求: (1)一个表最多只能有一个字段是自增的 (2)自增的字段必须是整数类型 (3)自增的字段必须是键约束的字段(通常是主键、唯一键) + +自增字段赋值为null和0的时候,会自增, 如果赋值为其他的值,按照你指定的值来。 + +```mysql +ALTER TABLE 表名称 AUTO_INCREMENT = 起始值; + +``` + +--- + +## 作业 + +### 第一题 + +```mysql +-- 1、创建数据库test01_company +-- +CREATE DATABASE test01_company CHARSET utf8; +use test01_company; +-- 2、创建表格offices + +-- | 字段名 | 数据类型 | +-- | ---------- | ----------- | +-- | officeCode | int | +-- | city | varchar(30) | +-- | address | varchar(50) | +-- | country | varchar(50) | +-- | postalCode | varchar(25) | +CREATE TABLE offices( +officecode int, +city VARCHAR(30), +address varchar(50), +country VARCHAR(50), +postalcode VARCHAR(25)); +-- 3、创建表格employees +-- +-- | 字段名 | 数据类型 | +-- | --------- | ------------- | +-- | empNum | int(11) | +-- | lastName | varchar(50) | +-- | firstName | varchar(50) | +-- | mobile | varchar(25) | +-- | code | int | +-- | jobTitle | varchar(50) | +-- | birth | date | +-- | Note | varchar(255) | +-- | Sex | varchar(5) | +CREATE table employees( +empNum int, +lastName VARCHAR(50), +firstName VARCHAR(50), +mobile VARCHAR(25), +code int, +jobTitle VARCHAR(50), +birth date, +Note VARCHAR(50), +Sex VARCHAR(5)); +-- **要求4:**将表employees的mobile字段修改到code字段后面。 +alter table employees MODIFY mobile VARCHAR(25) after code; +-- **要求5:**将表employees的birth字段改名为birthday; +alter table employees change birth birthday date; +-- **要求6:**修改sex字段,数据类型为char(1)。 +alter table employees MODIFY sex char(1); +-- **要求7:**删除字段note; +alter table employees drop note; +-- **要求8:**增加字段名favoriate_activity,数据类型为varchar(100); +alter table employees add favoriate_activity varchar(100); +-- **要求9:**将表employees的名称修改为 employees_info +alter table employees rename to employees_info; +``` + +### 第二题 + +```mysql +-- 1、创建数据库test02db +CREATE DATABASE test02db; +-- 2、创建表格pet +use test02db; +-- | 字段名 | 字段说明 | 数据类型 | +-- | ------- | -------- | ----------- | +-- | name | 宠物名称 | varchar(20) | +-- | owner | 宠物主人 | varchar(20) | +-- | species | 种类 | varchar(20) | +-- | sex | 性别 | char(1) | +-- | birth | 出生日期 | year | +-- | death | 死亡日期 | year | +CREATE TABLE pet( +name VARCHAR(20), +owner VARCHAR(20), +species VARCHAR(20), +sex char(1), +birth year, +death year); +-- 3、添加记录 +-- +-- | name | owner | species | sex | birth | death | +-- | ------ | ------ | ------- | ---- | ----- | ----- | +-- | Fluffy | harold | Cat | f | 2003 | 2010 | +-- | Claws | gwen | Cat | m | 2004 | | +-- | Buffy | | Dog | f | 2009 | | +-- | Fang | benny | Dog | m | 2000 | | +-- | bowser | diane | Dog | m | 2003 | 2009 | +-- | Chirpy | | Bird | f | 2008 | | +INSERT into pet VALUES('Fluffy','harold','Cat','f',2003,2010),('Claws','gwen','Cat','m',2004,null),('Buffy',null,'Dog','f',2009,null),('Fang','benny','Dog','m',2000,null),('bowser','diane','Dog','m',2003,2009),('Chirpy',null,'Bird','f',2008,null); +SELECT * from pet; +-- 4、 添加字段主人的生日owner_birth。 +alter table pet add owner_birth VARCHAR(10); +-- 5、 将名称为Claws的猫的主人改为kevin +UPDATE pet set owner='kevin' WHERE name='Claws'; +SELECT * from pet; +-- 6、 将没有死的狗的主人改为duck +UPDATE pet set owner='duck' WHERE name='Fang'; +SELECT * from pet; +-- 7、 查询没有主人的宠物的名字; +SELECT * from pet where isnull(owner); +SELECT owner from pet where isnull; +-- 8、 查询已经死了的cat的姓名,主人,以及去世时间; +select name,owner,death from pet where death !='' and species='Cat'; +-- 9、 删除已经死亡的狗 +delete FROM pet where death !=''and species='Dog'; +-- 10、查询所有宠物信息 +SELECT * from pet; +``` + +### 第三题 + +```mysql +-- 1、创建数据库:test03_company +create database test03_company charset utf8; +-- 2、在此数据库下创建如下3表,数据类型,宽度,是否为空根据实际情况自己定义。 +-- A.部门表(department): +-- 部门编号(depid),部门名称(depname),部门简介(deinfo);其中部门编号为主键。 +use test03_company ; +create table department( +depid int primary key auto_increment, +depname char(10) not null unique key, +deinfo varchar(200) +); +-- B.雇员表(employee):雇员编号(empid),姓名(name),性别(sex),职称(title),出生日期(birthday),所在部门编号(depid);其中 +-- * ​ 雇员编号为主键; +-- * ​ 部门编号为外键,外键约束等级为(on update cascade 和on delete set null); +-- * ​ 性别默认为男; +create table employee ( +empid int primary key auto_increment, +name varchar(10) not null, +sex enum('男','女') not null default '男', +title varchar(10), +birthday date, +depid int, +foreign key (depid) references department(depid) +); + +-- C.工资表(salary):雇员编号(empid),基本工资(basesalary),职务工资(titlesalary),扣除(deduction)。其中雇员编号为主键。 + +-- 3、给工资表(salary)的雇员编号(empid)增加外键约束,外键约束等级为(on update cascade 和on delete cascade) +CREATE table salary( +empid int PRIMARY key auto_increment, +basesalary VARCHAR(50), +titlesalary VARCHAR(50), +deduction VARCHAR(50), +FOREIGN key (empid) REFERENCES employee(empid) +); +-- 4、添加数据如下: +-- 部门表: +-- | 部门编号 | 部门名称 | 部门简介 | +-- | -------- | -------- | ------------ | +-- | 111 | 生产部 | Null | +-- | 222 | 销售部 | Null | +-- | 333 | 人事部 | 人力资源管理 | +insert into department VALUES(111,'生产部',null),(222,'销售部',null),(333,'人事部','人力资源管理'); +-- 雇员表: + +-- | 雇员编号 | 姓名 | 性别 | 职称 | 出生日期 | 所在部门编号 | +-- | -------- | ---- | ---- | ---------- | ---------- | ------------ | +-- | 1001 | 张三 | 男 | 高级工程师 | 1975-1-1 | 111 | +-- | 1002 | 李四 | 女 | 助工 | 1985-1-1 | 111 | +-- | 1003 | 王五 | 男 | 工程师 | 1978-11-11 | 222 | +-- | 1004 | 张六 | 男 | 工程师 | 1999-1-1 | 222 | +INSERT into employee VALUES(1001,'张三','男','高级工程师','1975-1-1',111),(1002,'李四','女','助工','1985-1-1',111),(1003,'王五','男','工程师','1978-11-11',222),(1004,'张六','男','工程师','1999-1-1',222); +-- 工资表: + +-- | 雇员编号 | 基本工资 | 职务工资 | 扣除 | +-- | -------- | -------- | -------- | ---- | +-- | 1001 | 2200 | 1100 | 200 | +-- | 1002 | 1200 | 200 | NULL | +-- | 1003 | 2900 | 700 | 200 | +-- | 1004 | 1950 | 700 | 150 | +insert into salary VALUES(1001,2200,1100,200),(1002,1200,200,null),(1003,2900,700,200),(1004,1950,700,150); +``` + +### 第四题 + +```mysql +-- 1、创建一个数据库:test04_school +-- +CREATE DATABASE test04_school CHARSET utf8; +-- 2、创建如下表格 +-- +-- 表1 Department表的定义 +-- +-- | **字段名** | **字段描述** | **数据类型** | **主键** | **外键** | **非空** | **唯一** | +-- | ---------- | ------------ | ------------ | -------- | -------- | -------- | -------- | +-- | DepNo | 部门号 | int(10) | 是 | 否 | 是 | 是 | +-- | DepName | 部门名称 | varchar(20) | 否 | 否 | 是 | 否 | +-- | DepNote | 部门备注 | Varchar(50) | 否 | 否 | 否 | 否 | +use test04_school; +CREATE table department( +DepNo int not null PRIMARY key unique key, +DepName VARCHAR(50) not null, +DepNote varchar(50)); +-- 表2 Teacher表的定义 +-- +-- | **字段名** | **字段描述** | **数据类型** | **主键** | **外键** | **非空** | **唯一** | +-- | ---------- | ------------ | ------------ | -------- | -------- | -------- | -------- | +-- | Number | 教工号 | int | 是 | 否 | 是 | 是 | +-- | Name | 姓名 | varchar(30) | 否 | 否 | 是 | 否 | +-- | Sex | 性别 | varchar(4) | 否 | 否 | 否 | 否 | +-- | Birth | 出生日期 | date | 否 | 否 | 否 | 否 | +-- | DepNo | 部门号 | int | 否 | 是 | 否 | 否 | +-- | Salary | 工资 | float | 否 | 否 | 否 | 否 | +-- | Address | 家庭住址 | varchar(100) | 否 | 否 | 否 | 否 | +CREATE table teacher( +Number int not null primary key unique key, +Name VARCHAR(30)not null, +Sex varchar(4), +Birth date, +DepNo int, +Salary float, +Address varchar(100), +FOREIGN key (DepNo)REFERENCES department(DepNo)); +-- 3、添加记录 +-- +-- | **DepNo** | **DepName** | **DepNote** | +-- | --------- | ----------- | ------------------ | +-- | 601 | 软件技术系 | 软件技术等专业 | +-- | 602 | 网络技术系 | 多媒体技术等专业 | +-- | 603 | 艺术设计系 | 广告艺术设计等专业 | +-- | 604 | 管理工程系 | 连锁经营管理等专业 | +INSERT into department VALUES(601,'软件技术系','软件技术等专业'),(602,'网络技术系','多媒体技术等专业'),(603,'艺术设计系','广告艺术设计等专业'),(604,'管理工程系','连锁经营管理等专业'); +-- | **Number** | **Name** | **Sex** | **Birth** | **DepNo** | **Salary** | **Address** | +-- | ---------- | -------- | ------- | ---------- | --------- | ---------- | ------------ | +-- | 2001 | Tom | 女 | 1970-01-10 | 602 | 4500 | 四川省绵阳市 | +-- | 2002 | Lucy | 男 | 1983-12-18 | 601 | 2500 | 北京市昌平区 | +-- | 2003 | Mike | 男 | 1990-06-01 | 604 | 1500 | 重庆市渝中区 | +-- | 2004 | James | 女 | 1980-10-20 | 602 | 3500 | 四川省成都市 | +-- | 2005 | Jack | 男 | 1975-05-30 | 603 | 1200 | 重庆市南岸区 | +INSERT into teacher VALUES(2001,'Tom','女','1970-01-10',602,4500,'四川省绵阳市'),(2002,'Lucy','男','1983-12-18',601,2500,'北京市昌平区'),(2003,'Mike','男','1990-06-01',604,1500,'重庆市渝中区'),(2004,'James','女','1980-10-20',602,3500,'四川省成都市'),(2005,'Jack','男','1975-05-30',603,1200,'重庆市南岸区'); +-- 4、用SELECT语句查询Teacher表的所有记录。 +SELECT*from teacher; +``` + -- Gitee From 8a08fc6e1879833f183d07586884ba4a83b49189 Mon Sep 17 00:00:00 2001 From: unknown <2112572495@qq.com> Date: Fri, 24 Feb 2023 12:51:13 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\350\277\220\347\256\227\347\254\246.md" | 294 ++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 "39 \351\203\255\346\202\246\350\277\216/20230223 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" diff --git "a/39 \351\203\255\346\202\246\350\277\216/20230223 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" "b/39 \351\203\255\346\202\246\350\277\216/20230223 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" new file mode 100644 index 0000000..daf9a22 --- /dev/null +++ "b/39 \351\203\255\346\202\246\350\277\216/20230223 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" @@ -0,0 +1,294 @@ +# 2.23 查询select语句和运算符 + +### select语句格式: + +```mysql +SELECT 字段列表 FROM 表名称; + +SELECT 字段列表 FROM 表名称 WHERE 条件; +``` + +### 使用别名(临时名称) + +```mysql +select 字段名1 as "别名1", 字段名2 as "别名2" from 表名称 as 别名; +``` + +- 列的别名有空格时,请加双引号。**==列的别名==中没有空格时,双引号可以加也可以不加**。 +- ==**表的别名不能加双引号**==,表的别名中间不能包含空格。 +- as大小写都可以,as也完全可以省略。 + +```mysql +示例: +mysql> select id "学号",name "姓名" from student; ++------+------+ +| 学号 | 姓名 | ++------+------+ +| 1 | 张三 | +| 2 | 李四 | ++------+------+ +2 rows in set (0.00 sec) + +mysql> select id 学号,name 姓名 from student; ++------+------+ +| 学号 | 姓名 | ++------+------+ +| 1 | 张三 | +| 2 | 李四 | ++------+------+ +2 rows in set (0.00 sec) +``` + +### 结果去重 + +mysql可以在查询结果中使用distinct关键字去重。 + +```mysql +select distinct 字段列表 from 表名称 【where 条件】; + +示例: +select distinct did from t_employee; +``` + +### 算术运算符 + +```mysql +加:+ + 在MySQL +就是求和,没有字符串拼接 +减:- +乘:* +除:/ div(只保留整数部分) + div:两个数相除只保留整数部分 + /:数学中的除 +模:% mod + +mysql中没有 +=等运算符 +``` + +### 比较运算符 + +```mysql +大于:> +小于:< +大于等于:>= +小于等于:>= +等于:= 不能用于null判断 +不等于:!= 或 <> 不能用于null判断 +判断是null 用 is null 或 用 <=> null +判断不是null is not null +``` + +### 区间或集合范围比较运算符 + +```mysql +区间范围:between x and y + not between x and y +集合范围:in (x,x,x) + not in(x,x,x) +between ... and ... 结果包含两端的边界 + +示例: +#查询薪资在[10000,15000] +select * from t_employee where salary>=10000 && salary<=15000; +select * from t_employee where salary between 10000 and 15000; + +#查询籍贯在这几个地方的 +select * from t_employee where work_place in ('北京', '浙江', '江西'); + +#查询薪资不在[10000,15000] +select * from t_employee where salary not between 10000 and 15000; + +#查询籍贯不在这几个地方的 +select * from t_employee where work_place not in ('北京', '浙江', '江西'); +``` + +### 模糊匹配比较运算符 + +%:代表任意个字符 + +_:代表一个字符,如果两个下划线代表两个字符 + +```mysql +示例: +#查询名字中包含'冰'字 +select * from t_employee where ename like '%冰%'; + +#查询名字以‘雷'结尾的 +select * from t_employee where ename like '%远'; + +#查询名字以’李'开头 +select * from t_employee where ename like '李%'; + +#查询名字有冰这个字,但是冰的前面只能有1个字 +select * from t_employee where ename like '_冰%'; + +#查询当前mysql数据库的字符集情况 +show variables like '%character%'; +``` + +### 逻辑运算符 + +```mysql +逻辑与:&& 或 and +逻辑或:|| 或 or +逻辑非:! 或 not +逻辑异或: xor + +示例: +#查询薪资高于15000,并且性别是男的员工 +select * from t_employee where salary>15000 and gender='男'; +select * from t_employee where salary>15000 && gender='男'; + +select * from t_employee where salary>15000 & gender='男';#错误得不到值 &按位与 +select * from t_employee where (salary>15000) & (gender='男'); + +#查询薪资高于15000,或者did为1的员工 +select * from t_employee where salary>15000 or did = 1; +select * from t_employee where salary>15000 || did = 1; + +#查询薪资不在[15000,20000]范围的 +select * from t_employee where salary not between 15000 and 20000; +select * from t_employee where !(salary between 15000 and 20000); + +#查询薪资高于15000,或者did为1的员工,两者只能满足其一 +select * from t_employee where salary>15000 xor did = 1; +select * from t_employee where (salary>15000) ^ (did = 1); +``` + +### 关于null值的问题、 + +```mysql +#(1)判断时 +xx is null +xx is not null +xx <=> null + +#(2)计算时 +ifnull(xx,代替值) 当xx是null时,用代替值计算 + +示例: +#查询员工的实发工资,实发工资 = 薪资 + 薪资 * 奖金比例 +select ename , salary + salary * commission_pct "实发工资" from t_employee; #失败,当commission_pct为null,结果都为null + +select ename ,salary , commission_pct, salary + salary * ifnull(commission_pct,0) "实发工资" from t_employee; +``` + +### 位运算符 + +```mysql +左移:<< +右移:>> +按位与:& +按位或:| +按位异或:^ +按位取反:~ +``` + + + +# 作业 + +## 第1题:员工表 +```mysql +drop table if exists `employee`; +#创建employee表 +CREATE TABLE employee( + id INT, + `name` VARCHAR(20), + sex VARCHAR(20), + tel VARCHAR(20), + addr VARCHAR(50), + salary FLOAT +); + +#添加信息 +INSERT INTO employee(id,`name`,sex,tel,addr,salary)VALUES +(10001,'张一一','男','13456789000','广东韶关',10010.58), +(10002,'刘小红','女','13454319000','广东江门',12010.21), +(10003,'李四','男','0751-1234567','广东佛山',10040.11), +(10004,'刘小强','男','0755-5555555','广东深圳',15010.23), +(10005,'王艳','男',NULL,'广东广州',14050.16); + +| -- | **id** | **name** | **sex** | **tel** | **addr** | **salary** | | +| ---- | ------ | -------- | ------- | ------------ | -------- | ---------- | ---- | +| -- | 10001 | 张一一 | 男 | 13456789000 | 广东韶关 | 10010.58 | | +| -- | 10002 | 刘小红 | 女 | 13454319000 | 广东江门 | 12010.21 | | +| -- | 10003 | 李四 | 男 | 0751-1234567 | 广东佛山 | 10040.11 | | +| -- | 10004 | 刘小强 | 男 | 0755-5555555 | 广东深圳 | 15010.23 | | +| -- | 10005 | 王艳 | 女 | NULL | 广东广州 | 14050.16 | | + +-- +-- **要求1:**查询出薪资在12000~13000之间的员工信息。 +select * from employee where salary between 12000 and 13000; +-- **要求2:**查询出姓“刘”的员工的工号,姓名,家庭住址。 +select id,`name`,addr from employee where `name` like '刘%'; +-- **要求3:**将“李四”的家庭住址改为“广东韶关” +UPDATE employee SET addr = '广东韶关' WHERE `name` = '李四'; +-- **要求4:**查询出名字中带“小”的员工 +select * from employee +-- **要求5:**查询出薪资高于11000的男员工信息 +select `name` from employee where salary>11000 and sex='男'; +-- **要求6:**查询没有登记电话号码的员工 +SELECT `name` FROM employee WHERE tel is NULL; +-- **要求7:**查询薪资高于12000或者家是广东深圳、广州的男员工 +SELECT `name` FROM employee WHERE sex = '男' AND salary = 12000 OR addr = '广东深圳' OR addr='广东广州'; +-- **要求8:**查询每个员工的年薪,显示“姓名、年薪” +select `name`,salary from employee; +``` + + + +```mysql +## 第2题:国家信息表 + +-- countries_info表中存储了国家名称、所属大陆、面积、人口和 GDP 值。 +DROP TABLE IF EXISTS `countries_info`; +CREATE TABLE `countries_info`( + `name` VARCHAR(100), + `continent` VARCHAR(100), + `area` INT, + population INT, + gdp BIGINT +); + +INSERT INTO countries_info VALUES +('Afghanistan','Asia',652230,25500100,20343000000), +('Albania','Europe',28748,2831741,12960000000), +('Algeria','Africa',2381741,37100000,188681000000), +('Andorra','Europe',468,78115,3712000000), +('Angola','Africa',1246700,20609294,100990000000); + +-- 表数据样例: +-- +-------------+-----------+---------+------------+--------------+ +-- | name | continent | area | population | gdp | +-- +-------------+-----------+---------+------------+--------------+ +-- | Afghanistan | Asia | 652230 | 25500100 | 20343000000 | +-- | Albania | Europe | 28748 | 2831741 | 12960000000 | +-- | Algeria | Africa | 2381741 | 37100000 | 188681000000 | +-- | Andorra | Europe | 468 | 78115 | 3712000000 | +-- | Angola | Africa | 1246700 | 20609294 | 100990000000 | + +-- +-------------+-----------+---------+------------+--------------+ +-- + +-- **要求1:** 查询大国 的国家名称、人口和面积。 +-- 如果一个国家满足下述两个条件之一,则认为该国是大国 : +-- - 面积至少为 300万平方公里(即,3000000 km2) +-- - 人口至少为 2500 万(即 25000000) +SELECT `name`,area,population FROM countries_info WHERE area>3000000 OR population>=25000000; +-- **要求2:**查询属于亚洲的国家名称、所属大陆、面积、人口和 GDP 值 + SELECT * FROM countries_info WHERE continent = 'Asia'; +-- **要求3:**查询国土面积不足1万平方公里且人口不走10万人的国家信息 +SELECT * FROM countries_info WHERE area<10000 AND population<100000; +-- **要求4:**查询国家名字中包含“o“字母的国家信息 +SELECT * FROM countries_info WHERE `name` LIKE '%o%'; +-- **要求5:**查询GDP值超过10000000000的国家信息 +SELECT * FROM countries_info WHERE gdp>10000000000; +-- 要求6:**查询每个国家的人均贡献GDP值(GDP/人口总数)并显示为“国家名、人口、GDP值、人均贡献GDP值” +SELECT `name` 国家名,population 人口,gdp GDP值,gdp/population AS 人均贡献GDP值 FROM countries_info; +-- 要求7:**查询人均贡献GDP值低于1000的国家信息。 +SELECT * FROM countries_info WHERE gdp/population<1000; +-- 要求8:**查询每个国家的人均国土面积(面积/人口总数)并显示为“国家名、面积、人口、人均国土面积值” +SELECT `name` 国家名,population 人口,gdp GDP值,area/population AS 人均国土面积值 FROM countries_info; +``` + -- Gitee