批改状态:合格
老师批语:
| 整形 | 占用字节数 | 范围 |
|---|---|---|
| tinyint | 1 | -128~127 |
| smallint | 2 | -32768~32767 |
| mediumint | 3 | -8388608~8388607 |
| int | 4 | -2147483648~2147483647 |
| bigint | 8 | -9223372036854775808~9223372036854775807 |
选择的范围尽可能小,范围越小占用资源越少
可选参数有
无符号整形(unsigned) 无符号整形就是没有负数,无符号整数是整数的两倍
整形支持显示宽度,显示宽带是最小的显示位数,如int(11)表示整形最少用11位表示,如果不够位数用0填充。显示宽度默认不起作用,必须结合zerofill才起作用。
num int(5) zerofill # 添加前导0,int(5)显示宽带是5
1、范围要尽可能小,范围越小,占用空间越少
2、无符号整数是整数的两倍
3、整形支持显示宽度,显示宽带是最小的显示位数,必须结合zerofill才起作用
浮点型的声明:float(M,D) double(M,D)
M:总位数 D:小数位数
1、浮点数有单精度和双精度
2、浮点数支持科学计数法
3、浮点数精度会丢失
小数(定点数
原理:将整数部分和小数部分分开存储
语法:
decimal(M,D)
1、decimal是变长的,大致是每9个数字用4个字节存储,整数和小数分开计算。M最大是65,D最大是30,默认是(10,2)。
2、定点和浮点都支持无符号、显示宽度0填充。
字符型
在数据库中没有字符串概念,只有字符,所以数据库中只能用单引号
| 数据类型 | 描述 |
|---|---|
| char | 定长字符,最大可以到255 |
| varchar | 可变长度字符,最大可以到65535 |
| tinytext | 2**8–1 =255 |
| text | 2**16–1 =65535 |
| mediumtext | 2**24–1 |
| longtext | 2**32–1 |
1、char是定长,varchar是变长
2、char最大值是255,varchar最大值是65535,具体要看字符编码
3、text系列在表中存储的是地址
4、一条记录的总长度不能超过65535
| 数据类型 | 描述 |
|---|---|
| datetime | 日期时间,占用8个字节 |
| date | 日期 占用3个字节 |
| time | 时间 占用3个字节 |
| year | 年份,占用1个字节 |
| timestamp | 时间戳,占用4个字节 |
1、datetime和date
datetime格式:年-月-日 小时:分钟:秒。支持的范围是’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。
2、timestamp(时间戳)
datetime类型和timestamp类型表现上是一样的,他们的区别在于:
datetime从1000到9999,而timestamp从1970年~2038年(原因在于timestamp占用4个字节,和整形的范围一样,2038年01月19日11:14:07以后的秒数就超过了4个字节的长度)
3、year
只能表示1901~2155之间的年份,因为只占用1个字节,只能表示255个数
4、time
可以表示时间,也可以表示时间间隔。范围是:-838:59:59~838:59:59
枚举(enum)
从集合中选择一个值作为数据(单选)
枚举值是通过整形数字来管理的,第一个值是1,第二个值是2,以此类推,枚举值在数据库存储的是整形数字。
枚举优点:
(1)、限制值
(2)、节省空间
(3)、运行速度快(整形比字符串运行速度快)
枚举占用两个字节,2字节=16位,216=65536,范围是(0-65535),由于枚举从1开始,所以枚举值最多有65535个
集合(set)
从集合中选择一些值作为数据(多选)
集合和枚举一样,也为每个集合元素分配一个固定值,分配方式是从前往后按2的0、1、2、…次方,转换成二进制后只有一位是1,其他都是0。
集合类型占8个字节,集合中最多有64个选项.
表名(字段名 数据类型 [null|not null] [default] [auto_increment] [primary key] [comment],| null not null | 是否为空 |
| default: | 默认值 |
| auto_increment | 自动增长,默认从1开始,每次递增1 |
| primary key | 主键,主键的值不能重复,不能为空,每个表必须只能有一个主键 |
| comment: | 备注 |
| engine | 引擎决定了数据的存储和查找 myisam、innodb |
表名和字段名如果用了关键字,要用反引号引起来。
CREATE TABLE `users` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '帐号',`sex` enum('先生','女士') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '先生' COMMENT '性别',`age` tinyint(3) unsigned NOT NULL COMMENT '年龄',`created_at` timestamp NULL DEFAULT NULL,`updated_at` timestamp NULL DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
alter table student rename to php74.stu;
插入数据
语法:insert into 表名 (字段名, 字段名,…) values (值1, 值1,…),(值2, 值2,…)
1、插入字段名的顺序和数据表中字段名的顺序可以不一致
2、插入值的个数、顺序必须和插入字段名的个数、顺序要一致。
3、如果插入的值的顺序和个数与表字段的顺序个数一致,插入字段可以省略。
default关键字用来插入默认值,null用来插入空值.
更新数据
语法:update 表名 set 字段=值 [where 条件]
删除数据
语法:delete from 表名 [where 条件]
delete from 表和truncate table 表区别?
1、delete from 表:遍历表记录,一条一条的删除
2、truncate table:将原表销毁,再创建一个同结构的新表。就清空表而言,这种方法效率高。
查询数据
语法:select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制]
1 字段表达式
通过as给字段取别名 as可以省略
2 from子句
from:来自,from后面跟的是数据源。数据源可以有多个。返回笛卡尔积。
3 dual表
dual表是一个伪表。在有些特定情况下,没有具体的表的参与,但是为了保证select语句的完整又必须要一个表名,这时候就使用伪表。
4 where子句
where后面跟的是条件,在数据源中进行筛选。返回条件为真记录
MySQL支持的运算符
— 比较运算符
> 大于
< 小于
>= 大于等于
<= 小于等于
= 等于
!= 不等于
— 逻辑运算符
and 与
or 或
not 非
— 其他
in | not in 字段的值在枚举范围内
between…and|not between…and 字段的值在数字范围内
is null | is not null 字段的值不为空
5 group by 【分组查询】
将查询的结果分组,分组查询目的在于统计数据。
查询字段是普通字段,只取第一个值
通过group_concat()函数将同一组的值连接起来显示
1、 如果是分组查询,查询字段是分组字段和聚合函数。
2、 查询字段是普通字段,只取第一个值
3、 group_concat()将同一组的数据连接起来
6 order by排序
asc:升序【默认】
desc:降序
7 having条件
having:是在结果集上进行条件筛选
小结:having和where的区别:
where是对原始数据进行筛选,having是对记录集进行筛选。
8 limit
语法:limit [起始位置],显示长度
起始位置可以省略,默认是从0开始
9 查询语句中的选项
查询语句中的选项有两个:
1、 all:显示所有数据 【默认】
2、 distinct:去除结果集中重复的数据
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=user';$username = 'root';$password = 'root123';$db = new PDO($dsn, $username, $password);var_dump($db); //输出 object(PDO)#1 (0) { }
query($sql)
// 1. 执行查询语句$stmt = $db->query('select * from users');//var_dump($stmt); //输出 object(PDOStatement)#2 (1) { ["queryString"]=> string(19) "select * from users" }
2 获取数据
2.1 获取二维数组fetchAll()
// 获取二维数组$rs = $stmt->fetchAll(); //默认返回关联和索引数组$rs=$stmt->fetchAll(PDO::FETCH_BOTH); //返回关联和索引数组$rs = $stmt->fetchAll(PDO::FETCH_NUM); //返回索引数组$rs = $stmt->fetchAll(PDO::FETCH_ASSOC); //返回关联数组$rs = $stmt->fetchAll(PDO::FETCH_OBJ); //返回对象数组
2.2 获得一维数组fetch()
// 获得一维数组$rs = $stmt->fetch(); // 匹配完成后指针下移一条 数据1var_dump($rs);$rs = $stmt->fetch(PDO::FETCH_NUM); // 数据2var_dump($rs);//通过while循环获取所有数据$rs = [];while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {$rs[] = $row;}echo '<pre>';var_dump($rs);
3 匹配列:fetchColumn()匹配当前行的第n列,列的编号从0开始,匹配完毕后指针下移一条
//获取当前数据行的第0列值echo $stmt->fetchColumn(); //输出 1//获取当前数据行的第1列值echo $stmt->fetchColumn(1); //输出 user2 下移了
4 总行数,总列数rowCount() columnCount()
echo '总行数:'.$stmt->rowCount(),'<br>'; // 总行数:100echo '总列数:'.$stmt->columnCount(); // 总列数:6
>exec($sql(insert update delete)
$res = $db->exec("insert into `users` values (null,'users101','先生',20,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)");echo $res; //输出 1
$res = $db->exec("update `users` set username='王五' where id=101");echo $res; //输出 1
$res = $db->exec("DELETE FROM `users` WHERE id=101;");echo $res; //输出 1
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号