写在前面:
贪心报了好几个班,没有时间实际操作了,所以这篇博客就是一些知识点的粘贴,后期会单独出一个博客写Mysql班所有项目的代码,请见谅。
一.表操作
1. MySQL表数据类型
1.1字符串类型:CHAR、TEXT
- 定长字符串:接受长度固定的字符串,在创建表时指定其长度。定长列不允许多于指定的字符数目,缺少的字符长度用空格填充或根据需要补为NULL。
- 变长字符串:存储任意长度的文本,只有指定的数据得以保存。优点是灵活,缺点是性能。
- 字符串值必须括在单引号内。
1.2 数值类型
- 如:BIT(二进制)、DECIMAL(或NUMERIC)、FLOAT(或NUMBER)、INT等。
- 数值不应该括在引号内
1.3 日期和时间类型
- 每种DBMS能识别自己特定的日期格式,请参阅相应文档。
- 如:DATE、DATETIME(或TIMESTAMP)、TIME等。
1.4二进制类型
- 可包含任何数据,甚至可包含二进制信息,如图像、多媒体、字处理文档等。
- 如:BINARY、 (LONG) RAW、VARBINARY等。
2. 用SQL语句创建表
2.1.创建语句语法
CREATE TABLE table_name (column_name column_type);
2. 2. 语句解释
- 表名紧跟CREATE TABLE关键字。
2.3一些设定
- 实际的表定义(所有列)括在圆括号中,各列之间用逗号分隔。
- 每列的定义以列名开始,后跟列的数据类型。
- 允许NULL值就是允许该列有缺值,NOT NULL就是不接受没有列值的行。
- 设定主键:只有不允许NULL值得列可作为主键
3. 用SQL语句向表中添加数据
3.1添加一行的MySQL INSERT 语句
- 语法:
INSERT INTO table_name (column1,column2...)
VALUES (value1,value2,...);
- 语句解释
INSERT INTO的括号方列名,这是可选的,建议指定列名,不同列名用逗号分隔,最后一列后面没有逗号。
VALUES的括号里面放对应列的对应值,如果前面没有指明列,则按位置,依次插入。注意字符型数据要加单引号或者双引号。
3.2 添加多行
INSERT INTO table_name (column1,column2...)
VALUES (value1,value2,...),
(value1,value2,...)
3.3 利用SELECT子句添加多行
INSERT INTO table_1
SELECT c1, c2, FROM table_2;
4.用SQL语句删除表
4.1 三种删除方法
删除操作很简单,但是一定要确实是否需要使用WHERE子句,否则整表将被删除。
- DROR
DROP TABLE table_name;
- DELETE
DELETE FROM table_name;
或者
DELETE * FROM table_name;
- TRUNCATE
TRUNCATE TABLE table_name
4.2 不同方法的区别
DROP:删除表数据和表本身。真正意义上的删除表,操作前一定要小心。
DELETE:删除一行或者多行数据,不删除表本身。
TRUNCATE:仅删除表内数据,不删除表本身。
- 小结
(1)DROP TABLE table_name : 删除表全部数据和表结构,立刻释放磁盘空间,不管是 Innodb 和 MyISAM;
(2)TRUNCATE TABLE table_name : 删除表全部数据,保留表结构,立刻释放磁盘空间 ,不管是 Innodb 和 MyISAM;
(3)DELETE FROM table_name : 删除表全部数据,表结构不变,对于 MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;
(4)DELETE FROM table_name WHERE XXX : 带条件的删除,表结构不变,不管是 innodb 还是 MyISAM 都不会释放磁盘空间;
(5)DELETE 操作以后,使用 optimize TABLE table_name 会立刻释放磁盘空间,不管是 innodb 还是 myisam;
(6)DELETE FROM 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。
5. 用SQL语句修改表
5.1 修改列名
ALTER TABLE TABLE_NAME RENAME COLUMN OLD_COLUMN_NAME TO NEW_COLUMN_NAME;
5.2 修改表中数据
UPDATE table_name SET column1=value1,column2=value2,...
WHERE some_column=some_value;
5.3 删除行
DELETE FROM table_name WHERE some_column=some_value;
5.4删除列
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
ALTER TABLE table_name DROP COLUMN column_name
5.5 新建列
alter table 表名 add column 列名 varchar(20) not null;--插入在最后一列
alter table 表名 add column 列名 varchar(20) not null after column1;--插在column1列后面
alter table 表名 add column 列名 varchar(20) not null first;--插入到第一列
5.6 新建行
INSERT INTO table_name VALUES (value1,value2,value3,...);
二. 表联结
1. MySQL别名
1.1 为表取别名
查询数据时,如果表名很长,使用起来不方便,此时,就可以为表取一个别名,用这个别名来代替表的名称
SELECT * FROM 表名 [AS] 别名;
--注意,为表指定别名,AS关键字可以省略不写
1.2 为字段取别名
在查询数据时,为了使显示的查询结果更加直观,可以为字段取一个别名 。
SELECT 字段名 [AS] 别名 [,字段名 [AS] 别名,……] FROM 表名;
--注意,为字段指定别名,AS关键字可以省略不写
2. INNER JOIN
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name;
MySQL的INNER JOIN 也可以省略 INNER 使用 JOIN,效果一样。
3. LEFT JOIN
MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。如果右表中没有匹配,则结果为 NULL。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name;
注释:MySQL中 LEFT JOIN 和 LEFT OUTER JOIN 两者等价,推荐使用 left join。
4. CROSS JOIN
CROSS JOIN 把表A和表B的数据进行一个N*M的组合,即笛卡尔积。
SELECT * FROM TableA CROSS JOIN TableB ;
笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
实际上,在 MySQL 中(仅限于 MySQL) CROSS JOIN 与 INNER JOIN 的表现是一样的,在不指定 ON 条件得到的结果都是笛卡尔积,反之取得两个表完全匹配的结果。
INNER JOIN 与 CROSS JOIN 可以省略 INNER 或 CROSS 关键字,因此下面的 SQL 效果是一样的
... FROM table1 INNER JOIN table2
... FROM table1 CROSS JOIN table2
... FROM table1 JOIN table2
5. 自连接
自连接就是一个表和它自身进行连接,是多表连接的特殊情况。
在自连接查询中,要先在FROM字句中为表分别定义两个不同的别名,然后使用这两个别名写出一个连接条件,条件比较在同一个表中的情况。
SELECT DISTINCT c1.CouNo 课程编号, c1.CouName 课程名称, c1.Kind 课程类别,c1.DepartNo 系部编号
FROM Course c1 JOIN Course c2 ON c1.Kind=c2.Kind
AND c1.DepartNo!=c2.DepartNo ORDER BY c1.CouNo;
6. UNION
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
/*参数
expression1, expression2, ... expression_n: 要检索的列。
tables: 要检索的数据表。
WHERE conditions: 可选, 检索条件。
DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
ALL: 可选,返回所有结果集,包含重复数据。
*/