有人说,做安卓开发久了,数据库SQL和前端知识比较薄弱(也有例外哈,不绝对),我就对数据库SQL这方面知识比较薄弱。本篇是根据慕课网与MySQL的零距离接触学习而写的笔记,感谢老师录制的视频,讲得很清楚。
MySQL中的数据类型
整形
| 数据类型 | 字节 |
|---|---|
| TINYINT | 1 |
| SMALLINT | 2 |
| MEDIUMINT | 3 |
| INT | 4 |
| BIGINT | 8 |
浮点型
| 数据类型 | 解释 |
|---|---|
| FLOAT[(M,D)] | 单精度浮点数,M是数字总位数,D是小数点后的位数,根据硬件允许的限制来保存值,单精度浮点数精确到大于7位小数位 |
| DOUBLE[(M,D)] | 双精度浮点数 |
日期时间型
| 数据类型 | 存储字节 | 解释 |
|---|---|---|
| YEAR | 1 | 4位数年份:例如1996 |
| TIME | 3 | 时间:00:00:00~23:59:59 |
| DATE | 3 | 年月日,不包括时间,1000-1-1~9999-12-31 |
| DATATIME | 8 | 1000-1-1零点~9999-12-31二十三点59-59 |
| TIMESTAMP | 4 | 时间戳,1970-1-1零点~2037 |
字符型
| 数据类型 | 解释 |
|---|---|
| CHAR(M) | 定长,不足时自动补空格,M个字节,0 <= M <= 255 |
| VARCHAR(M) | 不定长 |
| TINYTEXT | |
| TEXT | |
| MEDIUMTEXT | |
| LONGTEXT | |
| ENUM | 1或2个字节,取决于枚举值 的个数(最多65,535个值) |
| SET | 1,2,3,4或8个字节,取决于set成员的数量(最多64个成员) |
数据表操作
使用数据表,必须先打开某个数据库才能进行操作
- USE 打开数据库
//1、先看看有哪些数据库
SHOW DATABASES;
//输出
+--------------------+
| Database |
+--------------------+
| information_schema |
| exercises |
| mysql |
| performance_schema |
| sys |
| t2 |
| test |
//2、打开t2数据库
USE t2;
//输出
Database changed
//3、检验,显示当前选择的数据库名
SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| t2 |
+------------+
创建数据表
- 格式
CREATE TABLE [IF NOT EXISTS] table_name {
colume_name data_type,
...
}
- 新建用户表
CREATE TABLE tb1(
username VARCHAR(20),
age TINYINT UNSIGNED,
salary FLOAT(8,2) UNSIGNED
);
查看数据表
- 格式
SHOW TABLES [FROM db_name] [LIKE `pattern` | WHERE expr]
- 显示当前数据库中所有的数据表
SHOW TABLES;
//输出
+--------------+
| Tables_in_t2 |
+--------------+
| tb1 |
+--------------+
- 使用可选参数,查看另外的数据库中的所有表
//FROM关键字后跟查询的数据库名,例如我们查询MySQL自带的mysql数据库。
SHOW TABLES FROM mysql;
//输出mysql数据库中的24张表
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
查看数据表结构
- 格式
SHOW COLUMNS FROM tab_name
- 查询tb1表的结构
SHOW COLUMNS FROM tb1;
//输出
+----------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| username | varchar(20) | YES | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| salary | float(8,2) unsigned | YES | | NULL | |
+----------+---------------------+------+-----+---------+-------+
记录的插入与查找
-
插入
- 格式,字段可以省略,但是省略就必须全部字段都有值,如果想局部字段有值,那么就需要写明哪些字段需要插入。
INSERT [INTO] tab_name [(col_name)] VALUES(val, ...)- 插入一条数据(全字段)
//插入用户,用户名Tom,年龄25,工资7863.5 INSERT tb1 VALUES('Tom', 25, 7863.5);- 插入一条数据(局部字段)
//局部字段插入,用户名john,工资4500.69 //年龄没有插入,所以为NULL INSERT tb1(username, salary) VALUES('John', 4500.69); -
查找(最简单的,复杂的后面再讲)
- 格式
SELECT expre,... FROM tb_name- 查询指定表的所有记录
//*表示所有字段 SELECT * FROM tb1; //输出 +----------+------+---------+ | username | age | salary | +----------+------+---------+ | Tom | 25 | 7863.50 | | John | NULL | 4500.69 | +----------+------+---------+
MySQL空值与非空
-
NULL,字段可以为空
-
NOT NULL,字段不可以为空
-
演示
- 新建一张表
CREATE TABLE tb2( username VARCHAR(20) NOT NULL, age TINYINT UNSIGNED NULL );- 查询数据表结构
SHOW COLUMNS FROM tb2; //输出 +----------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+---------------------+------+-----+---------+-------+ | username | varchar(20) | NO | | NULL | | | age | tinyint(3) unsigned | YES | | NULL | | +----------+---------------------+------+-----+---------+-------+- (测试可空)故意age值设置为NULL
INSERT tb2 VALUES('Wally', NULL); //输出,插入成功 Query OK, 1 row affected (0.01 sec) //查询所有字段 SELECT * FROM tb2; //输出 +----------+------+ | username | age | +----------+------+ | Wally | NULL | +----------+------+- (测试非空)故意给username赋值为NULL
//username为null INSERT tb2 VALUES(NULL, 26); //报错输出,提示username不能为null ERROR 1048 (23000): Column 'username' cannot be null
MySQL自动编号和主键约束
-
自动编号
- 自动编号,且必须与主键组合使用
- 默认情况下,起始值为1,每次的增量1
-
主键约束
- 每张数据表只能存在一个主键
- 主键保证记录的唯一性
- 主键自动为NOT NULL
- AUTO_INCREMENT必须和主键一起使用,但是主键不一定要和AUTO_INCREMENT一起使用
-
示例1(主键和自动编码)
- 创建一张表,声明id主键和自动编码
CREATE TABLE tb3( id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL );- 查看数据表结构(可见id为主键,并且自动设置为非空)
SHOW COLUMNS FROM tb3; +----------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+----------------------+------+-----+---------+----------------+ | id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(30) | NO | | NULL | | +----------+----------------------+------+-----+---------+----------------+- 插入4条记录(id主键不用插入值,会自动编号并插入)
INSERT tb3(username) VALUES('Tom'); INSERT tb3(username) VALUES('John'); INSERT tb3(username) VALUES('Rose'); INSERT tb3(username) VALUES('Dimitar');- 查看记录
SELECT * FROM tb3; //输出 +----+----------+ | id | username | +----+----------+ | 1 | Tom | | 2 | John | | 3 | Rose | | 4 | Dimitar | +----+----------+ -
示例2(只有主键),主键不能重复
- 不设置自动编号
CREATE TABLE tb4( id SMALLINT UNSIGNED PRIMARY KEY, username VARCHAR(20) NOT NULL );- 插入2条数据,需要手动指定id
INSERT tb4 VALUE(4, 'Tom'); INSERT tb4 VALUE(22, 'John');- 查看表记录
SELECT * FROM tb4; //输出 +----+----------+ | id | username | +----+----------+ | 4 | Tom | | 22 | John | +----+----------+- 插入重复记录
INSERT tb4 VALUE(22, 'Rose'); //输出报错信息,插入了重复主键 ERROR 1062 (23000): Duplicate entry '22' for key 'PRIMARY'
唯一约束
- 唯一约束可以保证记录的唯一性
- 唯一约束的字段可以为NULL值
- 每张数据表可以存在多个唯一约束
-
实例
- 创建一张新表(主键+自动编号,另外一个字段设置唯一约束)
CREATE TABLE tb5( id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) NOT NULL UNIQUE KEY, age TINYINTUNSIGNED );- 查看数据表结构(用户名唯一)
SHOW COLUMNS FROM tb5; //输出 +----------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+----------------------+------+-----+---------+----------------+ | id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(20) | NO | UNI | NULL | | | age | tinyint(3) unsigned | YES | | NULL | | +----------+----------------------+------+-----+---------+----------------+- 插入数据
INSERT tb5(username, age) VALUES('Tom', 22); //输出,插入成功 Query OK, 1 row affected (0.00 sec) //再次插入 INSERT tb5(username, age) VALUES('Tom', 22); //输出报错信息 ERROR 1062 (23000): Duplicate entry 'Tom' for key 'username'
默认约束
-
默认值,当插入记录时,如果没有明确字段赋值,则自动赋予默认值
- 创建一张数据表,性别默认为3,为保密性别
CREATE TABLE tb6( id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) NOT NULL UNIQUE KEY, sex ENUM('1', '2', '3') DEFAULT '3' );- 查看数据表结构(sex字段的Default属性有了默认值)
SHOW COLUMNS FROM tb6; //输出 +----------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+----------------------+------+-----+---------+----------------+ | id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(20) | NO | UNI | NULL | | | sex | enum('1','2','3') | YES | | 3 | | +----------+----------------------+------+-----+---------+----------------+- 插入一条数据(只插入username字段)
INSERT tb6(username) VALUES('Tom'); //输出 Query OK, 1 row affected (0.01 sec)- 查询数据表的所有数据(发现记录中的sex字段我们没有赋值,但被自动赋值为默认值3了)
SELECT * FROM tb6; //输出 +----+----------+------+ | id | username | sex | +----+----------+------+ | 1 | Tom | 3 | +----+----------+------+