数据库相关的表操作,准备做大项目。

创建数据表

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
gender VARCHAR(10),
birthdate DATE,
age INT,
school VARCHAR(50),
phone VARCHAR(20),
education VARCHAR(20)
);

d:自增长的主键列
username:用户名
gender:性别
birthdate:出生日期
age:年龄
school:学校
phone:电话号码
education:学历

或者

用户名,电话号码,邮箱,密码
CREATE TABLE users {
id INT AUTO_INCREMENT PRIMARY KEY;
username VARCHAR(50),
phone VARCHAR(20),
email VARCHAR(100),
password VARCHAR(50)
}

表连接

表联立,连接俩数据表

MySQL中的表连接分为以下几种:

内连接(Inner Join):返回两个表中的匹配行,只有在两个表中都存在匹配时才返回数据。(两者都存在)
SELECT * FROM table1,table2 where table1.id=table2.id;

外连接(Outer Join):左外连接(Left Outer Join)和右外连接(Right Outer Join),其中左外连接返回左表中所有行以及右表中匹配的行,而右外连接则返回右表中所有行以及左表中匹配的行。
左外连接:
以左表为准,右表没有符合左表的数据则返回NULL
简单理解:左表显示全部,右表仅显示匹配项。

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;

自连接(Self Join):在同一张表中进行连接,可以将一张表看作两张表。

交叉连接(Cross Join):返回两个表中所有可能的组合,也称为笛卡尔积。

举例

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name = table2.column_name
JOIN table3
ON table2.column_name = table3.column_name;

column_name(s): 要查询的字段
table1,table2,table3: 数据表123
table1.column_name,
table2.column_name,
table3.column_name: 用来将数据库表两两互相连接的语句,前提是两数据表有相同的字段。

子查询

1.借用第二表,对第二表进行筛选
两表的列:
table1 : id,username,sal
table2 : id,age,home_addr

查询语句:
SELECT table1.username as name,table2.age as age FROM table1 join (
SELECT id,age FROM table2
) as table3 on table1.id=table3.id;

2.子查询关键字
in , ont in , exists , not exists

exists(select 语句)
EXISTS:如果子查询返回任何行,则返回真值。
存在记录:true (包括null
不存在录:false => 记录
NOT EXISTS:如果子查询没有返回任何行,则返回真值

exists举例:
这个查询中,子查询从customers表中检索与当前订单相应的客户记录。如果客户存在,则主查询从orders表中返回相应的订单记录。如果不存在,则不返回。
SELECT *
FROM orders o
WHERE EXISTS (
SELECT *
FROM customers c
WHERE c.customer_id = o.customer_id
);

记录联合

UNION: 合并两个或多个 SELECT 语句的结果集时,删除重复的行。

UNION 操作符只会选出不同的值,不会返回重复的值。

UNION ALL: 合并两个或多个 SELECT 语句的结果集时,保留所有行,包括重复的行。

UNION ALL 操作符会选出所有的值,包括重复的值。

SELECT Name FROM Table1
UNION
SELECT Name FROM Table2;

MYSQL支持的数据类型

数值类型:
整型(TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT)
浮点型(FLOAT, DOUBLE, DECIMAL)。

日期和时间类型:DATE, TIME, DATETIME, TIMESTAMP, YEAR。
字符串类型:CHAR, VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, BINARY, VARBINARY, TINYBLOB, MEDIUMBLOB, BLOB, LONGBLOB, ENUM, SET。
其他类型:BIT, BOOLEAN, JSON, GEOMETRY, POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION。

数值类型

TINYINT: 
有符号的范围为-128127
无符号的范围为0255
占用1个字节。

SMALLINT:
有符号的范围为-3276832767
无符号的范围为065535
占用2个字节。

MEDIUMINT:
有符号的范围为-83886088388607
无符号的范围为016777215
占用3个字节。

INTINTEGER:
有符号的范围为-21474836482147483647
无符号的范围为04294967295
占用4个字节。

BIGINT:
有符号的范围为-92233720368547758089223372036854775807
无符号的范围为018446744073709551615
占用8个字节。

FLOAT:
单精度浮点数,精度为大约7位小数。
占用4个字节。

DOUBLE:
双精度浮点数,精度为大约15位小数。
占用8个字节。

DECIMAL:
高精度小数,支持存储大数值并保持精度,适用于财务计算等场景。
DECIMAL(M,D) 表示一个有符号的精度为 M,小数位数为 D 的小数。M 和 D 的最大值为65

无符号化-UNSIGNED

CREATE TABLE example (
id INT UNSIGNED, -- UNSIGNED:无符号化
value INT -- 正负数都可以。
);

填充

CREATE TABLE example (
id INT(5) ZEROFILL PRIMARY KEY, -- ZEROFILL:在整数面前填充数字
name VARCHAR(20)
);

INSERT INTO example (id, name) VALUES (1, 'John'), (10, 'Jane'), (100, 'Bob');
SELECT * FROM example;


输出如下:
+--------+------+
| id | name |
+--------+------+
| 00001 | John |
| 00010 | Jane |
| 00100 | Bob |
+--------+------+

自动递增和主键约束

AUTO_INCREMENT 和 PRIMARY_KEY

AUTO_INCREMENT 自动递增

PRIMARY_KEY 主键约束
主键约束:列值必须是唯一的,不可以重复
主键列的值不能为空,即主键列不能有 NULL 值,因为 NULL 不是一个有效的主键值。
主键列的值必须是唯一的,即不能在表中存在两个或多个主键列的值相同的记录。
主键列的值不能被更新或删除,因为它们在表中是唯一的标识符。

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
age INT
);

-- 删除/解除 主键约束/外键关系
alter table 表名 drop primary key(字段名)

设置默认值

CREATE TABLE person (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50),
age INT DEFAULT 18, -- 设置默认值为18
PRIMARY KEY (id)
);

日期和时间类型

字符串类型