什么是表?
表:table
表可以为0行 但至少要有一列 表同样支持索引的查询
物理上 每个表由一个或多个文件在磁盘上保存
每一个表的存储 在数据库中目录中都有对应的文件系统格式
表空间:比表大而比数据库小的物理单位
创建表:
help CREATE TABLE
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name ( // 新建一个表
(create_definition,...)
[table_option]...
);
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name ( // 选择已知表的字段并创建
[(create_definition,...)]
[table_option] ...
SELECT [select_statement]
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name ( // 参照已知表进行创建
{ LIKE old_tbl_name | (LIKE old_tbl_name)} 字段与字段间用 , 隔开
查看如何创建:
SHOW CREATE TABLE tbl_name;
-----------------------------------------------------------------------------------------------------------------------------------------------------------
e.g.
CREATE TABLE employee (
id INT NOT NULL,
last_name CHAR(30) NOT NULL,
first_name CHAR(30) NOT NULL,
UNIQUE (id),
INDEX (last_name, first_name)
);
CREATE TABLE ... SELECT can create a table that is empty or non-empty, depending on what is returned by the SELECT part
CREATE TABLE ... LIKE creates an empty table using the definition of another existing table
CREATE TABLE tbl_name (
ID INT UNSIGNED AUTO_INCREMENT NOT NULL,
------------------------------------------------------------------------------------------------------------------------------------------------------------
单表查询:
SHOW ENGINES;
AUTO_INCREMENT = value 指定增长值
创建表指定索引类型
USING {BTREE|HASH}
直接使用CREATE创建索引
CREATE INDEX index_name ON tbl_name (col..)
创建表指定存储引擎
CREATE TABLE user(id INT)ENGINE = InnoDB;
ALTER TABLE user ENGINE = MyISAM;
设定默认引擎
SET GLOBAL storage_engine = engine_name;
SET SESSION storage_engine = engine_name;
查询选择数据:
字段名不区分大小写
SELECT column1, col2 FROM table_name // 选定 指定字段 并显示 project 投影
字段给定的次序 就是显示次序
SELECT * FROM table_name // 查询表中所有字段
选择过滤条件:
WHERE // 指定选定行
查询条件如下:
>, <, =, !=, LIKE, BETWEEN...AND.., IN, IS NULL(空), IS NOT NULL
LIKE // 模糊匹配
% 匹配任意长度任意字符
_ 匹配任意长度任单个字符
BETWEEN...AND.. // 匹配特定条件
IN // 在特定集合符合条件的行显示出来
REGEXP ( RLIKE ) // 支持正则表达式 模式匹配
AND (&&), OR (||), NOT (!) XOR 异或
过滤后 进行排序:
ORDER BY col_name {ASC|AESC}
ASC // 升序排列 {默认}
DESC // 降序排列
检索的结果 只看哪些行
LIMIT N // 显示前N 行
LIMIT N,M // 从第N行开始 一共显示M行
DISTINCT // 合并相同的结果选项
e.g. SELECT DISTINGCT field_name FROM tbl_name
对结果进行分组: 分组后做聚合 统计有多少行
GROUP BY // 选定行 以字段相同的值进行分组
COUNT(*) // 统计数据
对GROUP BY 结果进行过滤 // 分组以后在进行过滤
HAVING
表中的字段名 显示可以和 选择的不同 AS // 改变显示名字
内置了N多的函数 增加使用效果
参照 MYSQL 官方手册
聚合函数
COUNT(*), MAX(), MIN(), AVG(), SUM()
除了函数 还可以使用变量
SET @num=10 // 设置变量为10
应用声明要使用@
===============================================================================================
修改表结构:
ALTER TABLE t1 CHANGE a b INTERGER; // 把一个INTERGER列的名称从a变到b
ALTER TABLE t1 MODIFY b b BIGINIT NOU NULL // 修改类型 修改定义和位置 而不改变字段名
可以使用FIRST或AFTER col_name在一个表行中的某个特定位置添加列。默认把列添加到最后。您也可以在CHANGE或MODIFY语句中使用FIRST和AFTER
-------------------------------------------------------------------------------------------
ALTER TABLE tbl_name MODIFY col_name col_definition 改变位置
ALTER TABLE tbl_name CHANGE col_name col_definition
--------------------------------------------------------------------------------------------
添加一个新字段
ADD {FIRST | AFTER} col_name col_definition
添加索引:
ADD {INDEX|KEY} [index_name] [index_type] (col..)
index_type: BTREE、HASH、RTREE、FULLTEXT
删除格式:
DROP col_name; // 删除字段
DROP PRIMARY KEY; // 删除主键
DROP {INDEX|KEY} index_name; // 删除索引
删除数据:
DELETE FORM table [WHERE cloue] ;
重命名表:
重命名是新建一个新表 把老表数据复制过去然后删除老表
1. ALTER TABLE old_name RENAME TO new_name;
2. RENAME TABLE old_name TO new_name;
插入数据:
INSERT INTO table_name(col1,col2) VALUES (val1,val2) // 插入值也可以不指字段
REPLACE // 有重复的值替换 避免出错
INSERT 还支持一次插入多行
修改数据 : DML
UPDATE table_name SET col1=val1[, ...] [WHERE clause] // 需要指定条件 否则更新所有列
e.g. UPDATE knight SET AGE=18 WHERE UID=1
help TRUNCATE;
SELECT LAST_INSERT_ID(); // 记录最后的ID 行
TRUNCATE TABLE table_name; // 清空表中的所有数据 并重1开始计数
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
多表查询:
两张表如何组织起来:
JOIN, 连接 基于某种方式 把表组合起来
连接的种类:
1. 交叉连接,CROSS JOIN 笛卡尔乘积 // 一般很少用 但是适用所有情况 在内存中临时存储 在 磁盘上存储 结果 所以是非常非常的慢
2. 内连接,INNER JOIN 对称连接
基于等值条件 左右表同时出现 且值相等
如果字段名字相同 就要引用表前缀 table_name.col_name
3. 外连接 OUTER JOIN
左外连接 LEFT JOIN ON
左边有 右边显示NULL // 左表显示的有的全显示 右边有的显示 没有的显示NULL
右外连接 RIGHT JOIN [ON] on 指条件
左边NULL 右边显示
全外连接 FULL JOIN
都显示出来 左表有的右表没有 右表有的左表没
4. 自连接 SELF JOIN 自己与自己相连接
5. UNION 结果组合连接起来
将两个表的查询结果合成一个