diff --git "a/35 \345\274\240\344\277\212\350\261\252/20230218.md" "b/35 \345\274\240\344\277\212\350\261\252/20230218.md" new file mode 100644 index 0000000000000000000000000000000000000000..b48ee0055e4e54de268be8fc8850a04de75498b6 --- /dev/null +++ "b/35 \345\274\240\344\277\212\350\261\252/20230218.md" @@ -0,0 +1,794 @@ +# 第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无关,区分大小写)create database Mxdx.linux show create database mxdx; + +- 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](第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](第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](第4章 SQL语句.assets/image-20211127210547156.png) + +二进制字符串类型: + +![image-20211127210608685](第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](第4章 SQL语句.assets/image-20211127210826463.png) + +**使用场景**: + +- 身份证号、手机号码、QQ号、用户名username、密码password、银行卡号等固定长度的文本字符串适合使用CHAR类型; +- 评论、朋友圈、微博不定长度的文本字符串更适合使用VARCHAR类型。 + +## 5.3 日期时间类型 + +![image-20211127212047635](第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](第4章 SQL语句.assets/image-20211127211743925.png) + +SET类型的字段在赋值时,可从定义的值列表中选择1个或多个值的组合。SET列最多可以有64个成员。SET值在内部也用整数表示,分别是1,2,4,8……,都是2的n次方值,因为这些整数值对应的二进制都是只有1位是1,其余是0。 + +![image-20211127211806889](第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'; + ``` + +# 6.课堂笔记 + +## 6.1建库建表 + +```mysql +#查看以登录用户(有权限)查看所有的数据库 +show DATABASS; +#如何创建数据库 +CREATE DATABASE 数据库的名称 +create database lyxy; +#例如,创建数据库bookstore +create database bookstore +#查看数据库的定义 +show create database mxdx; +#例如,查看bookstore数据库的定义信息 +show create database bookstore; +#修改数据库的编码字符集 +alter DATABASE bookstore CHARACTER SET'gbk'; +alter DATABASE bookstore CHARSET utf8; +#修改bookstore数据库的字符集和校对规则 +#使用数据库 +use 数据名:这里没有写database +#例如:使用bookstore数据库 +use bookstore +#创建表格 +create table 表明( +列1名称 数据类型, +列2名称 数据类型, +列3名称 数据类型, +... +列n名称 数据类型, +); +create table book( +id int, +bookname VARVHAR(20), +price decimal(10,2) +); +#展示一下表的结构,看一下有些列是可以填写的 +desc book; +#添加数据 +insert into 表名 [列名列表]VALUES(值列表) +#例如,添加一本书叫斗破苍穹的书,价格89.5 +insert into book(id,bookname, price) +VALUES (1001,'斗破苍穹',89.5); +#查询数据 +select 列名 列表 from 表名 +select bookname from book; +#如果要查询所有列的值,*代表所有的列 +select * from book +#删除数据库 +drop datebase 数据库名; +drop databese class3; +#创建数据库 +create database class3 charset utf8; +#使用数据库 +use class3; +#创建数据表 +create table student( +id int +name char(4) +); +#添加数据 +insert into student(id,name)ALUES(1,'凯辉'); +insert into student(id,name)ALUES(2,'俊豪'); +insert into student(id,name)ALUES(3,'小强'); +#查询数据 +SELECT * from student; +#修改数据 +update student set id = 1001 where id=1; +#删除数据 +DELETE from student WHERE id=3; +#删除数据库 +drop DATABASE class3; + +``` + +# 6.2 数据类型 + +(”-- “代表注释) + +/* + +多行注释 + +第二行 + +*/ + +```mysql + +#MySQL的数据类型 + +整数的类型int + +create table book_int ( + + id int, +id2 int(2) + +); +``` + diff --git "a/35 \345\274\240\344\277\212\350\261\252/20230219 MYSQL\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260.md" "b/35 \345\274\240\344\277\212\350\261\252/20230219 MYSQL\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..b7bdb3315ba50a8765927aef72839499181ab912 --- /dev/null +++ "b/35 \345\274\240\344\277\212\350\261\252/20230219 MYSQL\344\275\234\344\270\232\345\222\214\347\254\224\350\256\260.md" @@ -0,0 +1,324 @@ +-- 1、创建数据库test01_market + +```MYSQL +CREATE DATABASE test01_market; +USE test01_market +``` + +-- 2、创建表格customers + +| -- | 字段名 | 数据类型 | | +| ---- | --------- | ----------- | ---- | +| -- | c_num | int(11) | | +| -- | c_name | varchar(50) | | +| -- | c_contact | varchar(50) | | +| -- | c_city | varchar(50) | | +| -- | c_birth | date | | +```mysql +CREATE TABLE customers( +c_num INT, +c_name varchar(50), +c_contact varchar(50), +c_city varchar(50), +c_birth DATE +); +``` + +-- **要求3:**将c_contact字段移动到c_birth字段后面 + +```MYSQL +ALTER TABLE customers MODIFY c_contact varchar(50) AFTER c_birth; +``` + +-- **要求4:**将c_name字段数据类型改为 varchar(70) + +```mysql +ALTER TABLE customers MODIFY c_name varchar(70); +``` + +-- **要求5:**将c_contact字段改名为c_phone + +```MYSQL +ALTER TABLE customers CHANGE c_contact c_phone varchar(50); +``` + +-- **要求6:**增加c_gender字段到c_name后面,数据类型为char(1) + +```MYSQL +ALTER TABLE customers ADD COLUMN c_gender char(1) AFTER c_name; +``` + +-- **要求7:**将表名改为customers_info + +```MYSQL +ALTER TABLE customers RENAME TO customers_info; +``` + +-- **要求8:**删除字段c_city + +```MYSQL +ALTER TABLE customers_info DROP c_city; +DESC customers_info; +``` + +作业2 + +-- 1、创建数据库test02_library + +```MYSQL +CREATE DATABASE test02_library; +use test02_library; +``` + +-- 2、创建表格books + +| -- | 字段名 | 字段说明 | 数据类型 | 允许为空 | 唯一 | | +| ---- | ------- | -------- | ------------- | -------- | ---- | ---- | +| -- | b_id | 书编号 | int(11) | 否 | 是 | | +| -- | b_name | 书名 | varchar(50) | 否 | 否 | | +| -- | authors | 作者 | varchar(100) | 否 | 否 | | +| -- | price | 价格 | float | 否 | 否 | | +| -- | pubdate | 出版日期 | year | 否 | 否 | | +| -- | note | 说明 | varchar(100) | 是 | 否 | | +| -- | num | 库存 | int(11) | 否 | 否 | | +```MYSQL +CREATE table books( +b_id int(11) not null UNIQUE COMMENT '书编号', +b_name VARCHAR(50) not null COMMENT '书名', +`authors` VARCHAR(100) not null COMMENT '作者', +price float not null comment '价格', +pubdate year not null COMMENT '出版日期', +note VARCHAR(100) COMMENT '说明' , +num int(11) not null COMMENT '库存'); +show full COLUMNS FROM books; +``` + +-- 3、向books插入记录 +-- +-- 1) 指定所有字段名称插入第一条记录 + +``` +INSERT into books(b_id,b_name,`authors`,price,pubdate,note,num) values(1,'Tal of AAA','Dickes',23,'1995','novel',11); +``` + +(-- 2)不指定字段名称插入第二记录 +INSERT into books VALUES(2,'EmmaT','Jane lura ',35,'1993','joke',22); +(-- 3)同时插入多条记录(剩下的所有记录) + +``` +INSERT INTO books VALUES(3,'Story of Jane','Jane Tim ',40,'2001','novel',0), +(4,'Lovey Day','George Byro',20,'2005','novel',30), +(5,'Old land','Honore Blade',30,'2010','law',0), +(6,'The Battle','Upton Sara',30,'1999','medicine',40), +(7,'Rose Hood','Richard haggard',28,'2008','cartoon',28); +SELECT * from books; +``` + + + +| -- | b_id | b_name | authors | price | pubdate | note | num | | +| ---- | ---- | ------------- | --------------- | ----- | ------- | -------- | ---- | ---- | +| -- | 1 | Tal of AAA | Dickes | 23 | 1995 | novel | 11 | | +| -- | 2 | EmmaT | Jane lura | 35 | 1993 | joke | 22 | | +| -- | 3 | Story of Jane | Jane Tim | 40 | 2001 | novel | 0 | | +| -- | 4 | Lovey Day | George Byron | 20 | 2005 | novel | 30 | | +| -- | 5 | Old land | Honore Blade | 30 | 2010 | law | 0 | | +| -- | 6 | The Battle | Upton Sara | 30 | 1999 | medicine | 40 | | +| -- | 7 | Rose Hood | Richard haggard | 28 | 2008 | cartoon | 28 | | +-- +-- 4、将小说类型(novel)的书的价格都增加5。 + +```MYSQL +update books set price=price+5 where note='novel'; +``` + +-- 5、将名称为EmmaT的书的价格改为40。 + +```MYSQL +UPDATE books set price=40 where b_name='EmmaT'; +``` + +-- 6、删除库存为0的记录 + +```MYSQL +DELETE from books where num=0; +``` + +作业3 + +1、创建数据库test03_bookstore + +```MYSQL +CREATE DATABASE test03_bookstore; +USE test03_bookstore; +``` + + +2、创建book表 + +```MYSQL +CREATE TABLE book( +id int(11) not null PRIMARY key auto_increment, +title VARCHAR(100) not null, +author VARCHAR(100) not null, +price DOUBLE(11,2) not null, +sales int(11) not null, +stock int(11) not null, +img_path VARCHAR(100) not null); +``` + + + +```mysql ++----------+--------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++----------+--------------+------+-----+---------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| title | varchar(100) | NO | | NULL | | +| author | varchar(100) | NO | | NULL | | +| price | double(11,2) | NO | | NULL | | +| sales | int(11) | NO | | NULL | | +| stock | int(11) | NO | | NULL | | +| img_path | varchar(100) | NO | | NULL | | ++----------+--------------+------+-----+---------+----------------+ +``` + +尝试添加部分模拟数据,参考示例如下: + +```MYSQL +INSERT INTO book values(1,'解忧杂货店','东野圭吾',21.20,102,98,'upload/books/解忧杂货店.jpg'),( +2,'边城','沈从文',23.00,102,98,'upload/books/边城.jpg '); +``` + + + + + +```mysql ++----+-------------+------------+-------+-------+-------+----------------------------+ +| id | title | author | price | sales | stock | img_path | ++----+-------------+------------+-------+-------+-------+-----------------------------+ +| 1 | 解忧杂货店 | 东野圭吾 | 27.20 | 102 | 98 | upload/books/解忧杂货店.jpg | +| 2 | 边城 | 沈从文 | 23.00 | 102 | 98 | upload/books/边城.jpg | ++----+---------------+------------+-------+-------+-------+----------------------------+ +``` + +3、创建用户表users,并插入数据 + +```MYSQL +CREATE table users(id int(11) not null PRIMARY KEY auto_increment,username VARCHAR(100) not null unique,`password` VARCHAR(100) not null,email VARCHAR(100)); +``` + + + +```mysql ++----------+--------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++----------+--------------+------+-----+---------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| username | varchar(100) | NO | UNI | NULL | | +| password | varchar(100) | NO | | NULL | | +| email | varchar(100) | YES | | NULL | | ++----------+--------------+------+-----+---------+----------------+ +``` + +尝试添加部分模拟数据,参考示例如下: + +```MYSQL +INSERT into users VALUES(1,'admin',112233,'admin@mxdx.com'); +``` + + + +```mysql ++----+----------+----------------------------------+--------------------+ +| id | username | password | email | ++----+----------+----------------------------------+--------------------+ +| 1 | admin | 112233 | admin@mxdx.com | ++----+----------+----------------------------------+--------------------+ +``` + +4、创建订单表orders + +```mysql ++--------------+--------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------------+--------------+------+-----+---------+-------+ +| id | varchar(100) | NO | PRI | NULL | | +| order_time | datetime | NO | | NULL | | +| total_count | int(11) | NO | | NULL | | +| total_amount | double(11,2) | NO | | NULL | | +| state | int(11) | NO | | NULL | | +| user_id | int(11) | NO | MUL | NULL | | ++--------------+--------------+------+-----+---------+-------+ +``` +```MYSQL +CREATE TABLE orders( +id VARCHAR(100) not null PRIMARY KEY, +order_time datetime not null, +total_count int(11) not null, +total_amount double(11,2) not null, +state int(11) not null, +user_id int(11) not null); +ALTER table orders MODIFY COLUMN user_id int(11) not null, +add key(user_id); +``` + + + + +尝试添加部分模拟数据,参考示例如下: + +```mysql ++----------------+---------------------+-------------+--------------+-------+---------+ +| id | order_time | total_count | total_amount | state | user_id | ++----------------+---------------------+-------------+--------------+-------+---------+ +| 15294258455691 | 2018-06-20 00:30:45 | 2 | 50.20 | 0 | 1 | ++----------------+---------------------+-------------+--------------+-------+---------+ +``` +```MYSQL +INSERT into orders values(15294258455691,'2018-06-20 00:30:45',2,50.20,0,1);5、创建订单明细表order_items +``` + +```mysql ++----------+--------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++----------+--------------+------+-----+---------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| count | int(11) | NO | | NULL | | +| amount | double(11,2) | NO | | NULL | | +| title | varchar(100) | NO | | NULL | | +| author | varchar(100) | NO | | NULL | | +| price | double(11,2) | NO | | NULL | | +| img_path | varchar(100) | NO | | NULL | | +| order_id | varchar(100) | NO | MUL | NULL | | ++----------+--------------+------+-----+---------+----------------+ +``` +```MYSQL +CREATE table order_items( +id int(11) not null PRIMARY KEY auto_increment, +count int(11) not null, +amount double(11,2) not null, +title VARCHAR(100) not null, +author VARCHAR(100) not null, +price double(11,2) not null, +img_path VARCHAR(100) not null, +order_id varchar(100) not null); +``` + + +尝试添加部分模拟数据,参考示例如下: + +```mysql ++----+-------+--------+---------+---------+-------+----------------+----------------+ +| id |count| amount| title | author | price | img_path | order_id | ++----+-------+--------+------------+----------+-------+----------------+----------------+ +| 1 | 1 | 27.20| 解忧杂货店 | 东野圭吾 | 27.20 | static/img/default.jpg|15294258455691 | +| 2 | 1 | 23.00| 边城 | 沈从文 | 23.00 | static/img/default.jpg|15294258455691 | ++----+-------+--------+------------+----------+-------+------------+----------------+ +``` +```MYSQL +INSERT INTO order_items values(1,1,27.20,'解忧杂货店','东野圭吾',27.20,'static/img/default.jpg','15294258455691'),(2,1,23.00,'边城','沈从文',23.00,'static/img/default.jpg','15294258455691'); +SELECT * from order_items; +``` + diff --git "a/35 \345\274\240\344\277\212\350\261\252/MYSQL\350\241\250\346\240\274.jpg" "b/35 \345\274\240\344\277\212\350\261\252/MYSQL\350\241\250\346\240\274.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..26e44ac5761b0e4cf68cbb9eab47e470823688e2 Binary files /dev/null and "b/35 \345\274\240\344\277\212\350\261\252/MYSQL\350\241\250\346\240\274.jpg" differ