Mysql基础知识篇(二)- 三大范式&常用sql语句

355 阅读1分钟

数据库的三大设计范式

第一范式

数据库中所有的字段都具有不可分割的原子性 例:

$ create table student(
    id int primary key,
    name varchar(20),
    address varchar(30)
);

上述该表的address字段值是可以进行拆分成省份,城市,街道等,所以不符合数据库的第一范式。

第二范式

再满足第一范式的情况下,确保表中的每列都完全依赖于主键。如果出现不完全依赖的情况,只可能出现在联合主键

-- 订单表
$ CREATE TABLE order (
    product_id INT,
    customer_id INT,
    product_name VARCHAR(20),
    customer_name VARCHAR(20),
    PRIMARY KEY (product_id, customer_id)
);

此表是联合主键, product_name只和product_id有关, customer_name 只和customer_id有关,所以只是部分依赖,不符合第二范式的要求。

第三范式

再满足第二范式的情况下,除主键外,其他列字段之间不能有传递关系

$ CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    customer_phone VARCHAR(15)
);

在上述订单表中,order_id可以通过product_id找到,也可以通过customer_id找到,所以依赖关系产生了冗余。

SQL

命令行登陆mysql数据库

# 登录MySQL
$ mysql -u root -p12345612
$ 密码
# 退出MySQL数据库服务器
$ exit;

显示数据库

$ show databases;

创建数据库

$ create database databases_name;

删除数据库

$ drop databases databases_name;

使用数据库

$ use databases_name;

显示库下的表

$ show create tables;

创建表

$ CREATE TABLE table_name (
	id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
    name1 bigint(20) NOT NULL DEFAULT '0' COMMENT '示例字段1',
    name2 varchar(20) NOT NULL DEFAULT '' COMMENT "示例字段2",
    name3 text NOT NULL DEFAULT '' COMMENT '示例字段3',
    name4 tinyint(4) NOT NULL DEFAULT '0' COMMENT '示例字段4',
	name5 int(11) NOT NULL DEFAULT '0' COMMENT '示例字段5',
   	ctime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'DB级别创建时间',
  	mtime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'DB级别更新时间',
    PRIMARY KEY (id),
)ENGINE=InnoDB AUTO_INCREMENT= 1 DEFAULT CHARSET=utf8 COMMENT='示例表';

查看表结构

$ desc table_name;

插入数据

$ insert into table_name(name1,name2) values ( 1 ,"xxx");

修改数据

$ update table_name set name1 = 1 ,name2 = "lll" where id = 20;

删除数据

$ delete from  table_name where id  = 20;

添加字段

$ alter table table_name add filed_name int(11) NOT NULL DEFAULT '0' COMMENT '示例字段filed_name';

删除字段

$ alter table table_name drop filed_name;

删除表

$ drop table table_name;

查找 (有序,分页,分组,联合,子查询等)

查询表

$ select * from table_name;

分组

$ select * from table_name group by name1;

排序

$ select * from table_name order by name1 desc;

子查询

$ select *  
	from (select * 
    	from table_name 
    ) as son_table

join查询

join分为内链接,外链接,全链接。

内链接在sql中是join,内链接查询返回两张表中ON后面指定条件相同时的行

$ select * from table_name join table_name2 on table_name.name1 = table_name2.name1

外链接在sql中分为左外链接(left join)和右外链接(right join)。

  • left join: 关键字会从左表那里返回所有的行,即使再右表中不匹配的行。
  • right join: 关键字会从右表中返回所有的行,即使左表中不匹配的行。

全链接,mysql不支持全链接,但是有相应的替代策略,利用union联合查询

$ select * from table_name 
  union
  select * from table_name1;