COMPLEX-B

导航

数据库容易忘记的操作

1.通配符

2.Top,mysql没有top语法,以limit代替
SELECT TOP 2 * FROM Persons选择前2的人
SELECT TOP 50 PERCENT * FROM Persons选择前50%的人
SELECT * FROM Persons LIMIT 5选择前5的人

3.between,and 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'

4.建表,新建数据库CREATE DATABASE database_name

CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
  • 使用select查询集建表
create table table_name
select name,age from person

5.数据类型
小数:decimal
日期:date

6.主键\外键约束,一般和字段分开定义
在表内增加主键

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)

表外增加主键ALTER TABLE Persons ADD PRIMARY KEY (Id_P)
删除主键ALTER TABLE Persons DROP PRIMARY KEY

表内增加外键

CREATE TABLE IF NOT EXISTS Students(
	sid INT NOT NULL AUTO_INCREMENT,
	sname VARCHAR(20) NOT NULL,
	cid INT NOT NULL,
	PRIMARY KEY(sid),
	FOREIGN KEY(cid) REFERENCES Classs(cid)
	)DEFAULT CHARSET=utf8;

表外增加外键:ALTER TABLE Classs ADD CONSTRAINT FOREIGN KEY(tid) REFERENCES Teacher(tid);
删除外键:alter table classs drop foreign key cid;

7.外键FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
作用
FOREIGN KEY 约束用于预防破坏表之间连接的动作。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

8.创建索引CREATE INDEX PersonIndex ON Person (LastName)

9.删除表DROP TABLE 表名称

10.NULL值比较
无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>,必须使用 IS NULL 和 IS NOT NULL 操作符。

11.函数

  • MID 函数用于从文本字段中提取字符SELECT MID(City,1,3) as SmallCity FROM Persons
  • LEN 函数返回文本字段中值的长度。
  • ROUND 函数用于把数值字段舍入为指定的小数位数。
  • Now 函数返回当前日期和时间SELECT ProductName, UnitPrice, Now() as PerDate FROM Products

12.修改表结构alter

  • 增加字段alter table table_name add 字段名 类型
  • 删除字段alter table tabe_name drop 字段名
  • 修改字段属性alter table table_name modify 字段名 类型
  • 修改字段名alter table table_name change 原字段名 新字段名 类型

复制表结构:
create table 表名 like 被复制的表名;
修改表名:
alter table 表名 rename to 新的表名;
修改表的字符集:
alter table 表名 character set 字符集名称;
计算处理null值:
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
* 表达式1:哪个字段需要判断是否为null
* 如果该字段为null后的替换值。
取区间值:
BETWEEN...AND

使用IN代替OR:
select name from students where cid=1 or cid=2;
select name from students where cid in(1,2);
易忘单词:
2. 如果要删除所有记录
TRUNCATE 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
TRUNCATE [TABLE] tbl_name
清空数据
删除重建表
区别:
1,truncate 是删除表再创建,delete 是逐条删除
2,truncate 重置auto_increment的值。而delete不会
3,truncate 不知道删除了几条,而delete知道。
删除列 DROP:
ALTER TABLE 表名 DROP 列名
4,当被用于带分区的表时,truncate 会保留分区
唯一约束:unique
注意mysql中,唯一约束限定的列的值可以有多个null

建表后添加外键:
    alter table 表名 add **constraint** 外键名称 foreign key(字段名) reference 主表名(主键名)
    可以重复添加外键,如果不加外键名称,默认外键名称为:class_ibfk_1

建表时候添加主键和外键:
    primary key(字段名);
    foreign key(字段名) reference 主表名(主键名)

主键可以指定多个字段:
    -- 创建复合主键:
        primary key(rid,uid),(在多对多表关系中中间表使用,保证组合没有重复)
删除主键外键:
    alter table 表名 drop primary key;
    alter table 表名 drop foreign key 外键名称;


笛卡尔积:
    * 有两个集合A,B .取这两个集合的所有组成情况。
    * 要完成多表查询,需要消除无用的数据

2. 子查询的结果是多行单列的:
    * 子查询可以作为条件,使用运算符in来判断
    -- 查询'财务部'和'市场部'所有的员工信息
    SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部';
    SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;
    -- 子查询
    SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');

3. 子查询的结果是多行多列的:
    * 子查询可以作为一张虚拟表参与查询
    -- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
    -- 子查询
    SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2
    WHERE t1.id = t2.dept_id;

GROUP BY 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。
分组的目的就是为了统计, 一般分组会跟聚合函数一起使用。

对表中的数据进行限制, 保证数据的正确性、 有效性和完整性。一个表如果添加了约束, 不正确的数据将无
法插入到表中。约束在创建表的时候添加比较合适。

修改auto_increment起始值
建表时
create table st4 ( id int primary key auto_increment, name varchar(20) ) auto_increment = 1000;
建表后:
ALTER TABLE 表名 AUTO_INCREMENT=起始值;

级联操作:(只能在建表时创建级联关系)
什么是级联操作:
在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作
语法:
ON UPDATE CASCADE 级联更新, 只能是创建表的时候创建级联关系。更新主表中的主键, 从表中的外键列也自动同步更新
ON DELETE CASCADE 级联删除
实例:
create table employee( id int primary key auto_increment, name varchar(20), age int, dep_id int, -- 外键对应主表的主键 -- 创建外键约束 constraint emp_depid_fk foreign key (dep_id) references department(id) on update cascade on delete cascade -- 创建级联关系 )

储存引擎的选择:
(1)、InnoDB 存储引擎
InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键, InnoDB 是默认的 MySQL引擎。
(2)、MyISAM 存储引擎
MyISAM 基于 ISAM 存储引擎,并对其进行扩展。它是在 Web、数据仓储和其他应用环境下最常使用的存储引擎之一。 MyISAM 拥有较高的插入、查询速度,但不支持事物。

数据库范式
1NF:数据表的每一列都是最小单位,不能再分割
2NF:在满足第一范式的情况下,数据表的所有列完全依赖于主键列
3NF:在满足第二范式的前提下,表中的每一列都直接依赖于主键,而不是通过其它的列来间接依赖于主键。简而言之,第三范式就是所有列不依赖于其它非主键列,也就是在满足 2NF 的基础上, 任何非主列不得传递依赖于主键。 所谓传递依赖, 指的是如果存在"A → B → C"的决定关系, 则 C 传递依赖于 A。因此, 满足第三范式的数据库表应该不存在如下依赖关系:主键列 → 非主键列 x → 非主键列 y7.4.2 示例:学生信息表

事务:
手动提交事务的 SQL 语句功能 SQL 语句
开启事务 start transaction;
提交事务 commit;
回滚事务 rollback;
回滚点:
设置回滚点 savepoint 名字
回到回滚点 rollback to 名字

脏读:
    读取到了另一个事务还没有提交的数据
    解决方式是将全局的隔离级别进行提升

三大范式小结:
范式 特点
1NF 原子性:表中每列不可再拆分。
2NF 不产生局部依赖,一张表只描述一件事情
3NF 不产生传递依赖,表中每一列都直接依赖于主键。而不是通过其它列间接依赖于主键。

posted on 2019-04-23 17:36  COMPLEX-B  阅读(124)  评论(0编辑  收藏  举报