MySql 数据库、表常用语句

数据库

查看当前所有数据库

sql 复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

创建一个新数据库

  创建一个叫senpai的数据库:

sql 复制代码
mysql> create database senpai;

  创建一个重名的数据库会报错。所以良好的创建数据库的习惯是先检查senpai的存在性,如果不存在就创建,如果存在那么不进行任何操作。下面的语句就是这个功能。

sql 复制代码
mysql> create database if not exists senpai;

在 Windows 下,数据库名、表名这些是不区分大小写的,即senpai,SenPai,SENPAI都是同一个数据库。但是 Linux 下会严格区分大小写。

切换数据库

  切换到一个叫senpai的数据库:

sql 复制代码
mysql> use senpai;

  切换一个不存在的数据库会报错。

删除数据库

  删除一个叫senpai的数据库。同样地,由于删除不存在的数据库会报错,建议使用下面第二条语句。

sql 复制代码
mysql> drop database senpai;
mysql> drop database if exists senpai;

基本表

  只有指定了具体的数据库或者模式,才能进行对表的操作。比如下面在数据库senpai里进行表的操作,需要先use senpai;

定义基本表 AND 表的主码约束

  最基本的情况就是对每一列进行定义,如有下面的"学生表":

列名 类型
Sno char(9)
Sname char(20)
Ssex char(2)
Sage smallint
Sdept char(20)

  可以使用如下语句进行定义,基本格式是列名 + 数据类型 + 列级完整性约束条件

sql 复制代码
create table Student(
	Sno char(9) primary key,
	Sname char(20) unique,
	Ssex char(2),
	Sage smallint,
	Sdept char(20)
);

完整性约束包括实体完整性 (要定义主码primary key),参照完整性 (可能要定义外码foreign key),以及用户定义的完整性 (比如上面的unique唯一性,当然还有not null非空,unsigned非负等)。

  上面是一个属性作为主码。如果多个属性作为主码要用括号括起来,放在表级完整性约束里面(单属性主码也可以这样)。比如

sql 复制代码
create table SC(
	Sno char(9),
	Cno int, // 到这里都是列级完整性
	primary key(Sno,Cno); // 表级完整性约束
	...
);

外码约束

sql 复制代码
create table SC(
	Sno char(9) foreign key references ,
	Cno int,
	...
	foreign key(Sno) references Student(Sno),
	foreign key(Cno) references Course(Cno)
);

其它约束

Check约束

  有时候一些列的取值限定在某个范围内,或者列与列之间存在相互约束,就可以用check(约束条件)来约束。

字段名称 数据类型 备注
pid char(10) 产品户ID,主码
name varchar(32) 产品名称
brand char(10) 品牌,只能是('A','B')中的某一个
price int 价格,必须 > 0 >0 >0
sql 复制代码
drop table if exists products;
create table products(
    ...,
    brand char(10) [constraint CK_products_brand] check(brand in ('A','B')),
    price int [constraint CK_products_price] check(price > 0)
);

  中括号里是给约束加名字,可省略。

Default 约束

  给属性列设置默认值。

sql 复制代码
create table test(
   pk int primary key,
   test_col int default 114514);

  只有在缺省插入值时,才会触发默认值。如果指定该列是NULL则不会触发默认值。

sql 复制代码
mysql> insert into test values(1,NULL);
mysql> insert into test (pk) values (2);

  上面语句的执行结果:

复制代码
mysql> select * from test;
+----+----------+
| pk | test_col |
+----+----------+
|  1 |     NULL |
|  2 |   114514 |
+----+----------+
2 rows in set (0.00 sec)

Unique 约束

  它和主码约束有点像,可以令某一属性列具有唯一性,也可以令多个属性列的组合具有唯一性。

sql 复制代码
create table test(
   pk int primary key,
   col1 int unique,
   col2 int
);

  不能出现重复的col1,比如插入(0,1,2),(1,1,3)会报错。

sql 复制代码
create table test(
   pk int primary key,
   col1 int,
   col2 int,
   unique(col1,col2)
);

不能出现重复的(col1,col2),但是col1或者col2本身可以重复。

sql 复制代码
mysql> insert into test values(0,1,2),(1,2,1),(2,1,1),(3,2,2);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

  可行,结果如下:

复制代码
mysql> select * from test;
+----+------+------+
| pk | col1 | col2 |
+----+------+------+
|  2 |    1 |    1 |
|  0 |    1 |    2 |
|  1 |    2 |    1 |
|  3 |    2 |    2 |
+----+------+------+
4 rows in set (0.00 sec)

  插入重复的(col1,col2) = (1,1)后报错。

sql 复制代码
mysql> insert into test values(5,1,1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'test.col1'
相关推荐
三十..2 分钟前
MySQL 从入门到高可用架构实战精要
运维·数据库·mysql
cfm_29141 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
真实的菜1 小时前
Redis 从入门到精通(十二):典型业务场景实战 —— 排行榜、限流器、秒杀系统、Session 共享
数据库·redis·python
你想考研啊2 小时前
mysql数据库导出导入
数据库·mysql·oracle
十年编程老舅2 小时前
Linux DRM:底层逻辑与实践架构
数据库·mysql
The Sheep 20233 小时前
Vue复习
linux·服务器·数据库
云边有个稻草人3 小时前
深度解析:KingbaseES高可用架构落地原理与生产运维实战
数据库·读写分离·数据库运维·金仓数据库·国产数据库技术·数据备份恢复
满天星83035773 小时前
【Qt】信号和槽(二) (自定义信号和槽)
开发语言·数据库·qt
我不介意孤独4 小时前
04-记忆系统为什么向量数据库不够用
数据库·人工智能·资源隔离·agent infra
AOwhisky5 小时前
MySQL 学习笔记(第六期):MySQL 备份与恢复
运维·数据库·笔记·学习·mysql·云计算