目录
数据类型
数据类型的属性
为什么建表时,加not null default '' / default 0
答:不想让表中出现null值.
为什么不想要的null的值
答:(1)不好比较,null是一种类型,比较时,只能用专门的is null 和 is not null来比较.
碰到运算符,一律返回null
(2)效率不高,影响提高索引效果
1、整型
-
MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 范围(-8388608~8388607) int(m) 4个字节 范围(-2147483648~2147483647) bigint(m) 8个字节 范围(+-9.22*10的18次方) -
取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。
2、浮点型(float和double)
MySQL数据类型 | 含义 |
---|---|
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
说明:小数类型,也可以加unsigned,但是不会改变数据范围,例如:float(3,2) unsigned仍然只能表示0-9.99的范围。
float和double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。
3、定点数(numeric等价于decimal)
以字符串形式存放,比浮点数更精确。定点类型占M+2个字节
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。
4、字符串(char,varchar,_text)
MySQL数据类型 | 说明 | 典型声明方式 | 范围 |
---|---|---|---|
char | 定长字符串 | gender Char(1) | Char(M) 0<=M<=255 |
varchar | 变长字符串 | email varchar(20) | 约2w--6w 最多65535个字符(受字符集影响) |
text | 可变文本串 | content text | 约2w--6w(受字符集影响) |
tinytext | 可变长度 | 最多255个字符 | |
mediumtext | 可变长度 | 最多2的24次方-1个字符 | |
longtext | 可变长度 | 最多2的32次方-1个字符 |
char和varchar:
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快。
varchar和text:
1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
2.text类型不能有默认值。
3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
哪些情况使用char更好
一,存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。
二,固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。
三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
5.二进制数据(xxxBLOB和xxxBINARY了解就行)
BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符字符串,而是二进制串。所以它们没有字符集,并且排序和比较基于列值字节的数值值。当保存BINARY(M)值时,在它们右边填充0x00(零字节)值以达到指定长度。取值时不删除尾部的字节。比较时所有字节很重要(因为空格和0x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '会变成'a \0'
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。分别与四种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应有相同的最大长度和存储需求。在TEXT或BLOB列的存储或检索过程中,不存在大小写转换。BLOB和TEXT列不能有默认值。BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序
6.日期时间类型
类型 | 说明 | 标准格式 | 范围 |
---|---|---|---|
date | 日期 | YYYY-MM-DD | 1000-01-01到9999-12-31 |
time | 时间 | HH:MM:SS | -838:59:59'和'838:59:59' |
datetime | 日期时间 | YYYY-MM-DD HH:MM:SS | '1000-01-01 00:00:00'到'9999-12-31 23:59:59' |
year | 年份类型 | YYYY和YY(不推荐) | 1901---2155 |
timestamp | (时间戳)自动存储记录修改时间 | YYYY-MM-DD HH:MM:SS | “1970-01-01 00:00:01”到“2038-01-19 03:14:07" |
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
一般存注册时间、商品发布时间等,不建议使用datetime存储,而是使用时间戳,因为datetime虽然直观,但不便于计算。而且timestamp还有一个重要特点,就是和时区有关。
7.位类型(bit)
BIT数据类型可用来保存位字段值。BIT(M)类型允许存储M位值。M范围为1~64,默认为1。
BIT其实就是存入二进制的值,类似010110。如果存入一个BIT类型的值,位数少于M值,则左补0。如果存入一个BIT类型的值,位数多于M值,MySQL的操作取决于此时有效的SQL模式:如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。
对于位字段,直接使用SELECT命令将不会看到结果,可以用bin()或hex()函数进行读取。
8.枚举(enum)
MySql中的ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值:
可以插入空字符串""和NULL(如果运行NULL的话)如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),如果是严格模式,将不能插入,如果是非严格模式,将选用第一个元素代替,并警告 ENUM最多可以有65,535个成员,需要2个字节存储当创建表时,ENUM成员值的尾部空格将自动被删除
值的索引规则如下:
来自列规定的允许的值列中的值从1开始编号
空字符串错误值的索引值是0
NULL值的索引是NULL
9.集合(set)
SET和ENUM类型非常类似,也是一个字符串对象,里面包含0~64个成员
SET和ENUM存储上有所不同,SET是根据成员的个数决定存储的字节数
SET和ENUM最主要的区别在于SET类型一次可以选择多个成员,而ENUM则只能选择一个
10.特殊的NULL类型
Null类型特征:
(1)所有的类型的值都可以是null,包括int、float等数据类型
(2)空字符串””,不等于null,0也不等于null,false也不等于null
(3)任何运算符,判断符碰到NULL,都得NULL
(4)NULL的判断只能用is null,is not null
(5)NULL 影响查询速度,一般避免使值为NULL
基本操作
DDL
数据库管理
create创建数据库
第二种该方式创建的数据库,会指明创建数据库时使用的字符集
同样该方式创建的数据库,在数据库已经存在的情况下再创建该数据库就会报,如下,同样的错误
第三种该方式创建数据库可以指明创建数据库的字符集
该方式创建的数据库,当数据库不存在时,会创建数据库,但数据库已经存在时,不会创建数据库,同时也不会报错,而是默默的退出,并给予警告,如下:
create database firstDB;/*第一种方式*/
CREATE DATABASE + 数据库名 CHARACTER SET '设定的字符集';
/* character set 表示设定的字符集是 */
CREATE DATABASE IF NOT EXISTS +数据库名 CHARACTER SET '设置字符集';
/* if not exists 表示 如果不存在 该数据库 创建,已存在不创建
character set 设置该数据库的字符集*/
show查看数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| firstDB |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
alter 修改数据库
alter 命令修改数据库编码:
默认创建的数据库默认不支持中文字符,如果我们需要它支持中文字符,则将它的编码设置为utf8格式:
mysql> ALTER DATABASE testDB CHARACTER SET UTF8;
Query OK, 1 row affected (0.00 sec)
use 使用数据库
mysql> use firstDB;
Database changed
查看当前使用的数据库
mysql> select database();
+------------+
| database() |
+------------+
| firstdb |
+------------+
1 row in set (0.00 sec)
drop删除数据库
mysql> drop database firstDB;
Query OK, 0 rows affected (0.00 sec)
表管理
create创建表
mysql> create table PEOPLE (
-> ID int AUTO_INCREMENT PRIMARY KEY,
-> NAME varchar(20) not null,
-> AGE int not null,
-> BIRTHDAY datetime);
Query OK, 0 rows affected (0.01 sec)
delete删除表
mysql> alter table PEOPLE DROP column star;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
rename 重命名表名修改表名
mysql> RENAME TABLE PEOPLE TO NEW_PEOPLE;
Query OK, 0 rows affected (0.00 sec)
复制表结构
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
复制表结构和数据
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement #将select的结果来作为字段创建新表的字段,但是可能失去属性定义的。
表列管理
添加列
在创建新表时,可以通过CREATE TABLE
语句定义列。例如:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
position VARCHAR(100),
salary DECIMAL(10, 2)
);
修改列
当需要修改现有表的列时,可以使用ALTER TABLE
语句。这可以包括更改列的数据类型、设置默认值、添加或删除约束等。
更改列的数据类型
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(15, 2);
给列添加默认值
ALTER TABLE employees MODIFY COLUMN position VARCHAR(100) DEFAULT 'Unassigned';
删除列的默认值
ALTER TABLE employees ALTER COLUMN position DROP DEFAULT;
重命名列
注意:MySQL直接不支持重命名列的操作,但可以通过添加一个新列,复制数据,然后删除旧列的方式来实现。
删除列
当某个列不再需要时,可以使用ALTER TABLE
语句来删除它。
ALTER TABLE employees DROP COLUMN department;
DML
插入操作
插入数据是向数据库表中添加新记录的操作。可以使用INSERT INTO语句来插入数据
插入单行
- 表名:指定要插入数据的表名。
- 列1, 列2, 列3, …:指定要插入数据的列名。
- 值1, 值2, 值3, …:指定要插入的数据值。
INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...);
1
批量插入
INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...), (值4, 值5, 值6, ...), ...;
数据更新
单表更新
更新数据是修改数据库表中现有记录的操作。可以使用UPDATE语句来更新数据,语法如下所示:
UPDATE 表名 SET column_name=value[,column_name2=value2,....]
[WHERE condition];
- column_name:要更改的数据列
- value为修改后的数据,可以为变量、具体值、表达式或者嵌套的SELECT结果
- condition为筛选条件,如不指定则修改该表所有的列数据
多表更新
1.使用JOIN(MySQL 8.0+)
从MySQL 8.0开始,UPDATE
语句支持使用JOIN
来同时更新多个表。这使得操作更加直观和高效。
UPDATE table1
JOIN table2 ON table1.id = table2.table1_id
SET table1.column1 = value1, table2.column2 = value2
WHERE condition;
这里,table1
和table2
通过table1.id = table2.table1_id
条件进行连接,并同时更新table1
和table2
中的列。
2. 使用子查询
如果你使用的是MySQL的早期版本,或者出于某种原因需要避免使用JOIN
,你可以使用子查询来更新一个表,而这个子查询基于另一个表的数据。
UPDATE table1
SET column1 = (
SELECT value
FROM table2
WHERE table1.id = table2.table1_id
LIMIT 1
)
WHERE EXISTS (
SELECT 1
FROM table2
WHERE table1.id = table2.table1_id
);
注意:在这个例子中,使用了LIMIT 1
来确保子查询只返回一个值(尽管在连接条件已经确保了一对一关系的情况下这通常是多余的)。同时,EXISTS
子句用于确保只更新那些在table2
中有对应行的table1
中的行。
删除数据(三种删除的区别)
(1)速度上说,drop > truncate > delete
(2) 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view
(3) TRUNCATE 和DELETE只删除数据,而不删除表的结构,而DROP则删除整个表(结构和数据)。
(4) TRUNCATE计数值重置。如果想保留标识计数值,请改用 DELETE。
如果要删除表定义及其数据, 请使用 DROP TABLE 语句。
单表删除
DELETE FROM 表名 [WHERE condition];
condition为筛选条件,如不指定则删除该表的所有列数据
delete from result where StudentID=5;
多表删除(truncate命令)
用于完全清空表数据,但表结构、索引、约束等不变
TRUNCATE [TABLE] table_name
区别于DELETE命令
相同:
都能删除数据,不删除表结构,但TRUNCATE速度更快
不同:
使用TRUNCATE TABLE重新设置AUTO_INCRENENT计数器
标签:varchar,字节,删除,--,数据库,Mysql,操作,NULL,TABLE From: https://www.cnblogs.com/yangcurry/p/18410930