MySQL基本使用以及基本操作
MySQL学习笔记
安装及基本操作
安装:
#安装 MySQL 服务端、核心程序 sudo apt-get install mysql-server #安装 MySQL 客户端 sudo apt-get install mysql-client登录:mysql -u root -p 会登录到root账户,输入密码即可 查看数据库:show databases; 选择连接其中一个数据库,语句格式为 use <数据库名>,这里可以不用加分号 使用命令 show tables;查看数据库中有哪些表(注意不要漏掉“;”) 使用命令 quit 或者 exit 退出 MySQL
创建数据库和新建表
新建数据库:create database 名字;,如:CREATE DATABASE mysql_shiyan; 显示数据库:show databases; 连接数据库:use 名字;,如:use mysql_shiyan; 当连接数据库以后,查看当前数据库的表:show tables;
新建数据表:
格式为:
CREATE TABLE 表的名字 ( 列名a 数据类型(数据长度), 列名b 数据类型(数据长度), 列名c 数据类型(数据长度) );
我们尝试在 mysql_shiyan 中新建一张表 employee,包含姓名,ID 和电话信息,所以语句为:
CREATE TABLE employee (id int(10),name char(20),phone int(12));
查看表中内容:SELECT * FROM employee(表名); 删除数据库:DROP DATABASE mysql_shiyan(数据库名);
数据类型
在刚才新建表的过程中,我们提到了数据类型,MySQL 的数据类型和其他编程语言大同小异,下表是一些 MySQL 常用数据类型:
数据类型 | 大小(字节) | 用途 | 格式 |
---|---|---|---|
INT | 4 | 整数 | |
FLOAT | 4 | 单精度浮点数 | |
DOUBLE | 8 | 双精度浮点数 | |
ENUM | 单选,比如性别 | ENUM(‘a’,’b’,’c’) | |
SET | 多选 | SET(‘1’,’2’,’3’) | |
DATE | 3 | 日期 | YYYY-MM-DD |
TIME | 3 | 时间点或持续时间 | HH:MM:SS |
YEAR | 1 | 年份值 | YYYY |
CHAR | 0~255 | 定长字符串 | |
VARCHAR | 0~255 | 变长字符串 | |
TEXT | 0~65535 | 长文本数据 |
整数除了 INT 外,还有 TINYINT、SMALLINT、MEDIUMINT、BIGINT。
CHAR 和 VARCHAR 的区别: CHAR 的长度是固定的,而 VARCHAR 的长度是可以变化的,比如,存储字符串 “abc”,对于 CHAR(10),表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的 VARCHAR(12) 则只占用4个字节的长度,增加一个额外字节来存储字符串本身的长度,12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。
ENUM和SET的区别: ENUM 类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而 SET 类型的值则可以多选。
想要了解更多关于 MySQL 数据类型的信息,可以参考下面两篇博客。
MySQL 中的数据类型介绍 MySQL 数据类型
插入数据
利用INSERT插入数据,用法:
INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);
我们尝试向 employee 中加入 Tom、Jack 和 Rose:
INSERT INTO employee(id,name,phone) VALUES(01,'Tom',110110110); INSERT INTO employee VALUES(02,'Jack',119119119); INSERT INTO employee(id,name) VALUES(03,'Rose');
然后利用SELECT * FROM employee;来显示表中数据:
+------+------+-----------+ | id | name | phone | +------+------+-----------+ | 1 | Tom | 110110110 | | 2 | Jack | 119119119 | | 3 | Rose | NULL | +------+------+-----------+
有的数据需要用单引号括起来,比如 Tom、Jack、Rose 的名字,这是由于它们的数据类型是 CHAR 型。此外 VARCHAR,TEXT,DATE,TIME,ENUM 等类型的数据也需要单引号修饰,而 INT,FLOAT,DOUBLE 等则不需要。
第一条语句比第二条语句多了一部分:(id,name,phone) 这个括号里列出的,是将要添加的数据 (01,'Tom',110110110) 其中每个值在表中对应的列。而第三条语句只添加了 (id,name) 两列的数据,所以在表中Rose的phone为NULL
SQL的约束
定义:约束是一种限制,它通过对表的行或列的数据做出限制
在MySQL中,通常有这几种约束:
约束类型: | 主键 | 默认值 | 唯一 | 外键 | 非空 |
---|---|---|---|---|---|
关键字: | PRIMARY KEY | DEFAULT | UNIQUE | FOREIGN KEY | NOT NULL |
如先用如下语句创建数据库:
/*MySQL-03-01.sql*/ CREATE DATABASE mysql_shiyan; use mysql_shiyan; CREATE TABLE department ( dpt_name CHAR(20) NOT NULL,/*非空约束*/ people_num INT(10) DEFAULT '10',/*默认值约束*/ CONSTRAINT dpt_pk PRIMARY KEY (dpt_name) ); CREATE TABLE employee ( id INT(10) PRIMARY KEY, name CHAR(20), age INT(10), salary INT(10) NOT NULL, phone INT(12) NOT NULL, in_dpt CHAR(20) NOT NULL, UNIQUE (phone),/*唯一约束*/ CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)/*外键约束*/ ); CREATE TABLE project ( proj_num INT(10) NOT NULL, proj_name CHAR(20) NOT NULL, start_date DATE NOT NULL, end_date DATE DEFAULT '2015-04-01', of_dpt CHAR(20) REFERENCES department(dpt_name), CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name) );
主键 (PRIMARY KEY)是用于约束表中的一行,作为这一行的唯一标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。主键不能有重复且不能为空。
默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为空时,将使用默认值。
例如:
# 正常插入数据 INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11); #插入新的数据,people_num 为空,使用默认值 INSERT INTO department(dpt_name) VALUES('dpt2');
唯一约束 (UNIQUE) 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。当 INSERT 语句新插入的数据和已有数据重复的时候,如果有 UNIQUE约束,则 INSERT 失败,比如:
INSERT INTO employee VALUES(01,'Tom',25,3000,110110,'dpt1'); #因为phone冲突,所以只能插入一个,第二个会报错 INSERT INTO employee VALUES(02,'Jack',30,3500,110110,'dpt2');
外键 (FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。
一个表可以有多个外键,每个外键必须 REFERENCES (参考) 另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。
在 INSERT 时,如果被外键约束的值没有在参考列中有对应,比如以下命令,参考列 (department 表的 dpt_name) 中没有dpt3,则INSERT 失败:
INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dpt3');/*另一个表的主键没有dpt3*/
可见之后将 dpt3 改为 dpt2(department 表中有 dpt2),则插入成功.
非空约束 (NOT NULL),听名字就能理解,被非空约束的列,在插入值时必须非空。
在MySQL中违反非空约束,不会报错,只会有警告,比如以下语句:
#INSERT 成功 age 为空,因为没有非空约束,表中显示 NULL INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(03,'Jim',3400,119119,'dpt2'); #警告 salary 被非空约束,值为空,表中显示0 INSERT INTO employee(id,name,age,phone,in_dpt) VALUES(04,'Bob',23,123456,'dpt1');