一、DDL
1.修改表,添加新的字段时,不要加引号
2.在修改表中字段的类型时,会发生数据截断。
像DATETIME 转化为 TIME
二、DML
1.插入和删除的注意点
2.可以通过 select 来协助插入
3.创建非空索引
4.关于count函数
5.分组
6.join
原来Mysql也有自然连接
- 自然连接(Natural Join)是一种在关系型数据库中用于合并两个或多个表的操作。它基于表之间的共同列名进行匹配,从而生成一个新的结果集。
-
- 在执行自然连接时,数据库系统会查找所有具有相同列名的列,并将它们作为连接条件。它会将这些相同列名的值进行比较,如果相等,则将对应的行合并到结果集中。
-
- 例如,假设我们有两个表EMPLOYEE和DEPARTMENT,它们的结构如下:
-
- EMPLOYEE 表:
- +----+-------+--------+
- | ID | Name | Salary |
- +----+-------+--------+
- | 1 | Alice | 5000 |
- | 2 | Bob | 6000 |
- | 3 | Carol | 5500 |
- +----+-------+--------+
-
- DEPARTMENT 表:
- +----+-----------+
- | ID | Department|
- +----+-----------+
- | 1 | HR |
- | 2 | IT |
- | 3 | Finance |
- +----+-----------+
- 如果我们执行以下自然连接操作:
-
- SQL
- SELECT * FROM EMPLOYEE NATURAL JOIN DEPARTMENT;
- 则结果将是:
-
- +----+-------+--------+-----------+
- | ID | Name | Salary | Department|
- +----+-------+--------+-----------+
- | 1 | Alice | 5000 | HR |
- | 2 | Bob | 6000 | IT |
- | 3 | Carol | 5500 | Finance |
- +----+-------+--------+-----------+
- 在这个例子中,自然连接操作使用了ID列作为连接条件,并将两个表中具有相同ID值的行合并到结果集中。
-
- 需要注意的是,自然连接会自动匹配所有具有相同列名的列进行连接,因此在使用自然连接时,应特别小心列名的重复和命名规范,以避免产生意外的结果。
联合查询
子查询
下面这个我很难做出来。
子查询中有空值怎么办。
我认为可以通过子查询的where去过滤一下,设置成not null
DML 数据操作
- DELETE删除多表数据,怎样才能同时删除多个关联表的数据呢?这里做了深入的解释:
-
- 1 delete from t1 where 条件
- 2 delete t1 from t1 where 条件
- 3 delete t1 from t1,t2 where 条件
- 4 delete t1,t2 from t1,t2 where 条件
- 复制
- category(栏目信息表)和news(新闻数据表)。
-
- category中的id(栏目编号)字段作为该表的主键(primary key).唯一标识了一个栏目的信息。 news 中的id字段作为该表的主键(primary key).唯一标识了一个栏目的信息。
-
- category_id(栏目编号)字段与category表的id字段相关联。
-
- 1.SQL删除语句
-
- delete category,news from category left join news on category.id = news.category_id
- 复制
- 1、从数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉1
-
- DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或 DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id
- 复制
- 2、从数据表t1里在数据表t2里没有匹配的记录查找出来并删除掉1
-
- DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL 或 DELETE FROM t1,USING t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL
- 复制
- 3、 从两个表中找出相同记录的数据并把两个表中的数据都删除掉1
-
- DELETE t1,t2 from t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t1.id=25
- 复制
- 注意此处的delete t1,t2 from 中的t1,t2不能是别名
-
- 如:1
-
- delete t1,t2 from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25
- 复制
- 在数据里面执行是错误的(MYSQL 版本不小于5.0在5.0中是可以的)
-
- 上述语句改 写成1
-
- delete table_name,table2_name from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25
- 复制
- Unknown table 'a' in MULTI DELETE的解决办法
-
- 在存储过程中,调用:
-
- delete a from db1.tb1 a, db2.tb2 b where a.col1 = b.col1 and a.col2 = b.col2;
- 复制
- 出现题目中的错误,原因如下:
-
- 在mysql中多表联合删除时,表别名只能在sql中表关联部分声明。我们应该避免不是表关联部分声明别名,因为这产生歧义的sql,从而产生不是期望的结果,例如在错误的表中删除行,举个例子来说:
-
- DELETE t1 AS a2 FROM t1 AS a1 INNER JOIN t2 AS a2;
- 复制
- 对于多个表的删除,表的列表中提到的表别名的引用,使用默认数据库,除非已经明确地指定了一个数据库。例如,如果默认数据库是db1,下面的语句将不会工作,因为不确定的别名a2被认为已经有了db1:
-
- DELETE a1, a2 FROM db1.t1 AS a1 INNER JOIN db2.t2 AS a2
- WHERE a1.id=a2.id;
- 复制
- 除了默认数据库外,为了正确地匹配表的别名,我们必须明确地指定正确的数据库的名字,
-
- DELETE a1, db2.a2 FROM db1.t1 AS a1 INNER JOIN db2.t2 AS a2
- WHERE a1.id=a2.id;
- 复制
- 根据上述理论,我的sql应该这样写:
-
- delete db1.a from db1.tb1 a, db2.tb2 b where a.col1 = b.col1 and a.col2 = b.col2;
- 复制
- 还有需要注意的是:
-
- 1.如果你为一个表声明了别名,当你指向这个表的时候,就必须使用这个别名,例如:
-
- -- 正确的写法:
-
- DELETE t1 FROM test AS t1, test2 WHERE ...
- 复制
- -- 错误的写法:
-
- DELETE test FROM test AS t1, test2 WHERE ...
- 复制
- 2.在多个表联合删除时,不能使用order by 或limit,而单个表的删除时就没有这个限制。
-
- 3.当前,我们还不能在删除表的时候,在子查询中select from相同的表。
下面有一个例子,既可以用where处的子查询,也可以用from处的子查询。
我先查询一下
TCL
很困惑 时间戳和DATETIME
各个语言的枚举类型????
复制表结构和复制表内容
可以指定列的默认值
修改列名及类型
在添加列的时候也可以 指定它的约束。
约束的管理
删除 主键约束的方式 与删除 unique的方式不一样
1.主键约束
唯一约束
非空约束(modify)
外键约束和检查性约束 均使用 constraint
在建表后,添加check约束
alter table 表名 add constraint 约束名 check( 条件)
删除约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名;