mysql基本使用

安装mysql

Ubuntu上安装MySQL很是简单只须要几条命令就能够完成。mysql

sudo apt-get install mysql-server sudo apt-get isntall mysql-client sudo apt-get install libmysqlclient-dev

安装过程当中会提示设置密码什么的,注意设置了不要忘了,安装完成以后可使用以下命令来检查是否安装成功:
sudo netstat -tap | grep mysql
经过上述命令检查以后,若是看到有mysql 的socket处于 listen 状态则表示安装成功。
登录mysql数据库能够经过以下命令:
mysql -u root -p
-u 表示选择登录的用户名, -p 表示登录的用户密码,上面命令输入以后会提示输入密码,此时输入密码就能够登陆到mysql。web

MySQL

MySQL 是应用最普遍的关系数据库。关系数据库使用关系模型做为数据组织存储的的方式,能够分为四级结构:sql

  • 数据库,好比一个应用对应一个数据库;
  • 表,一个数据库包含若干张表;
  • 记录,一个表包含多条记录;
  • 字段,一条记录包含若干字段;

一张表的结构能够想象成一张 Excel 表,有多个字段组成,每个字段均可以存储特定类型的数据,好比字符串或者数字,在建立表的时能够指定类型。表与表之间经过关系链接(逻辑上的关系),查询数据时能够经过关系跨越多张表进行查询。shell

关系数据库最重要的特性是是知足 ACID 性质:数据库

  • A atomicity 表明原子性;
  • C consistency 表明一致性;
  • I isolation 表明隔离性;
  • D durability 表明持久性;

ACID 可以保证事务的可靠性,什么意思呢?就是说可以保证一系列的数据库操做组成的一个完整逻辑过程,要么所有被执行,要么完全不执行,不会出现执行一半的状况。例如银行转账,从原帐户扣除金额,以及向目标帐户添加金额,这两个数据库操做的总和,构成一个完整的逻辑过程,不可拆分。ruby

为了知足 ACID 性质,MySQL 支持各类约束,好比插入一条数据时,须要检查外键是否存在,这些操做虽然能确保数据的一致性,可是不少时候却下降了并发操做的能力,因此在现在的互联网网站中,若是有高并发的需求每每再也不使用关系数据库的 ACID 性质,更有的直接使用非关系数据库。bash

除此以外,这里再补充几点关系数据库中关系键的基本概念知识,以帮助理解下文内容。并发

  • 主键(英语:primary key)。数据库表中对储存数据对象予以惟一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
  • 外键(英语:foreign key)。其实在关系数据库中,每一个数据表都是由关系来连系彼此的关系,父数据表(Parent Entity)的主键(primary key)会放在另外一个数据表,当作属性以建立彼此的关系,而这个属性就是外键。

好比,学生跟老师之间对应着教学关系,学生数据表会有个属性叫指导老师(外键),而这个值就是对应到老师数据表的老师代号(主键)。app

mysql基本操做

启动/中止mysqlsocket

sudo service mysql start sudo service mysql stop

数据库的建立和删除

建立数据库很是简单,只须要输入 create database <db_name>; 就能够了,其中 <db_name> 表明数据库名称,查看全部的数据库能够经过 show databases; (注意,这里多了一个 s) 命令,而删除一个数据库则能够经过 drop database <db_name>; ,

  • 建立
mysql> create database news;
Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | news | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
  • 删除
mysql> drop database news;
Query OK, 0 rows affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)

表的基本操做

  1. 表建立和删除

数据库建立成功之后,就能够建立表了。在建立表以前,须要经过 use shiyanlou; 命令链接到 shiyanlou 数据库。

建立表的基本命令以下:

CREATE TABLE 表的名字 ( 列名a 数据类型(数据长度), 列名b 数据类型(数据长度), 列名c 数据类型(数据长度) );
数据类型 大小(字节) 用途 格式
FLOAT 4 单精度浮点数  
DOUBLE 8 双精度浮点数  
INT 4 整数  
SET 4 多选 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 长文本数据  
ENUM   单选,好比性别 ENUM('a','b','c')

下面尝试建立一张表名为 user 的表,该表有 3 个字段:

  • id 编号,整数类型,使用 int 类型;
  • name 用户名,字符串,使用 varchar 可变字符类型;
  • email 邮箱,字符串, 使用 varchar 可变字符型;
mysql> use pyclass; Database changed mysql> create table user( -> id int(10), -> name varchar(20), -> email varchar(64) -> ); Query OK, 0 rows affected (0.47 sec)  mysql> show tables; +-------------------+ | Tables_in_pyclass | +-------------------+ | user | +-------------------+ 1 row in set (0.00 sec)

经过以上命令就能够建立出 user 表,须要注意的是当输入 create table user 回车之后,客户端会自动识别出这是一个未完成的命令,因此会出现提示符 -> 。表建立成功之后,能够经过 show tables; 查看全部的表, 删除表能够经过 drop table <table_name>; 。

若是想查看一张表的字段信息,能够经过 show create table <table_name>; 或者 describe <table_name>; 指令,以下所示:

mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | user | CREATE TABLE `user` ( `id` int(10) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `email` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec) mysql> describe user; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(10) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | email | varchar(64) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
  1. 插入数据

表建立成功之后,就能够插入数据了。可使用 insert 指令插入数据,完整的命令格式以下:

INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);

当插入的值和和表定义的字段数量一致且顺序一致时,能够忽略列名信息,经过如下命令往 user 表中插入数据:

mysql> insert into user(id,name,email) values(1,'mmm','mmm@qq.com'); Query OK, 1 row affected (0.46 sec) mysql> insert into user values(2,'zzz','zzz@qq.com'); Query OK, 1 row affected (0.01 sec)

查看插入的数据:

mysql> select * from user;
+------+------+------------+
| id | name | email | +------+------+------------+ | 1 | mmm | mmm@qq.com | | 2 | zzz | zzz@qq.com | +------+------+------------+ 2 rows in set (0.00 sec)
  1. 修改表名

重命名一张表的语句有多种形式,如下 3 种格式效果是同样的:

RENAME TABLE 原名 TO 新名字; ALTER TABLE 原名 RENAME 新名; ALTER TABLE 原名 RENAME TO 新名;

使用命令尝试修改 user 的名字为 user1 :

mysql> rename table user to user1; Query OK, 0 rows affected (0.44 sec)  mysql> show tables; +-------------------+ | Tables_in_pyclass | +-------------------+ | user1 | +-------------------+ 1 row in set (0.00 sec)  mysql> alter table user1 rename user; Query OK, 0 rows affected (0.01 sec)  mysql> show tables; +-------------------+ | Tables_in_pyclass | +-------------------+ | user | +-------------------+ 1 row in set (0.00 sec)
  1. 修改表结构

在表中增长一列的语句格式为:

ALTER TABLE 表名字 ADD COLUMN 列名字 数据类型 约束; ALTER TABLE 表名字 ADD 列名字 数据类型 约束;

增长age字段,默认值18:

mysql> alter table user add age int(4) default 18; Query OK, 0 rows affected (0.56 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from user; +------+------+------------+------+ | id | name | email | age | +------+------+------------+------+ | 1 | mmm | mmm@qq.com | 18 | | 2 | zzz | zzz@qq.com | 18 | +------+------+------------+------+ 2 rows in set (0.00 sec)

能够发现:新增长的列,被默认放置在这张表的最右边。若是要把增长的列插入在指定位置,则须要在语句的最后使用AFTER关键词(“AFTER 列1” 表示新增的列被放置在 “列1” 的后面)。

好比咱们新增一列 weight (体重)放置在 name 的后面:

mysql> alter table user add weight int(4) default 120 after name; Query OK, 0 rows affected (0.60 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from user; +------+------+--------+------------+------+ | id | name | weight | email | age | +------+------+--------+------------+------+ | 1 | mmm | 120 | mmm@qq.com | 18 | | 2 | zzz | 120 | zzz@qq.com | 18 | +------+------+--------+------------+------+ 2 rows in set (0.00 sec)

上面的效果是把新增的列加在某位置的后面,若是想放在第一列的位置,则使用 FIRST 关键词,如语句:

ALTER TABLE employee ADD test INT(10) DEFAULT 11 FIRST;

删除表中的一列和刚才使用的新增一列的语句格式十分类似,只是把关键词 ADD 改成 DROP ,语句后面不须要有数据类型、约束或位置信息。具体语句格式:

ALTER TABLE 表名字 DROP COLUMN 列名字;

或: ALTER TABLE 表名字 DROP 列名字;
咱们把刚才新增的 age 删除:

mysql> alter table user drop age;
Query OK, 0 rows affected (0.52 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from user; +------+------+--------+------------+ | id | name | weight | email | +------+------+--------+------------+ | 1 | mmm | 120 | mmm@qq.com | | 2 | zzz | 120 | zzz@qq.com | +------+------+--------+------------+ 2 rows in set (0.00 sec)

重命名一列,这条语句其实不仅可用于重命名一列,准确地说,它是对一个列作修改(CHANGE) :
ALTER TABLE 表名字 CHANGE 原列名 新列名 数据类型 约束;
注意:这条重命名语句后面的 “数据类型” 不能省略,不然重命名失败。

当原列名和新列名相同的时候,指定新的数据类型或约束,就能够用于修改数据类型或约束。须要注意的是,修改数据类型可能会致使数据丢失,因此要慎重使用。

咱们用这条语句将 “weight” 一列重命名为汉语拼音 “tizhong” ,效果以下:

mysql> alter table user change weight tizhong int(4) default 125; Query OK, 0 rows affected (0.47 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from user; +------+------+---------+------------+ | id | name | tizhong | email | +------+------+---------+------------+ | 1 | mmm | 120 | mmm@qq.com | | 2 | zzz | 120 | zzz@qq.com | +------+------+---------+------------+ 2 rows in set (0.00 sec)

要修改一列的数据类型,除了使用刚才的CHANGE语句外,还能够用这样的MODIFY语句:
ALTER TABLE 表名字 MODIFY 列名字 新数据类型;
再次提醒,修改数据类型必须当心,由于这可能会致使数据丢失。在尝试修改数据类型以前,请慎重考虑。

大多数时候咱们须要作修改的不会是整个数据库或整张表,而是表中的某一个或几个数据,这就须要咱们用下面这条命令达到精确的修改:
UPDATE 表名字 SET 列1=值1,列2=值2 WHERE 条件;
好比,咱们要把 zzz 的 tizhong 改成125,email 改成 zzz@163.com:

mysql> update user set tizhong=125,email='zzz@163.com' where name = 'zzz'; Query OK, 1 row affected (0.43 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from user; +------+------+---------+-------------+ | id | name | tizhong | email | +------+------+---------+-------------+ | 1 | mmm | 120 | mmm@qq.com | | 2 | zzz | 125 | zzz@163.com | +------+------+---------+-------------+ 2 rows in set (0.00 sec)

删除表中的一行数据,也必须加上WHERE条件,不然整列的数据都会被删除。删除语句:
DELETE FROM 表名字 WHERE 条件;

约束

约束分类
听名字就知道,约束是一种限制,它经过对表的行或列的数据作出限制,来确保表的数据的完整性、惟一性。

在MySQL中,一般有这几种约束:

约束类型 主键 默认值 惟一 外键 非空
关键字 PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL

eg:

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)是用于约束表中的一行,做为这一行的惟一标识符,在一张表中经过主键就能准肯定位到一行,所以主键十分重要。主键不能有重复且不能为空。
    定义主键:
    mysql基本使用
    也能够这样定义:
    mysql基本使用
    还有一种特殊的主键——复合主键。主键不只能够是表中的一列,也能够由表中的两列或多列来共同标识,好比:
    mysql基本使用

  • 默认值约束
    默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为空时,将使用默认值。
    people_num INT(10) DEFAULT '10' 默认值为10
    DEFAULT 约束只会在使用 INSERT 语句(上一实验介绍过)时体现出来,INSERT语句中,若是被 DEFAULT 约束的位置没有值,那么这个位置将会被 DEFAULT 的值填充,如语句:

    INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);# 正常插入数据 INSERT INTO department(dpt_name) VALUES('dpt2');#插入新的数据,people_num 为空,使用默认值
  • 惟一约束
    惟一约束 (UNIQUE) 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每一个值都是惟一的。
    mysql基本使用
    当 INSERT 语句新插入的数据和已有数据重复的时候,若是有 UNIQUE约束,则 INSERT 失败,好比:
INSERT INTO employee VALUES(01,'Tom',25,3000,110110,'dpt1'); INSERT INTO employee VALUES(02,'Jack',30,3500,110110,'dpt2');
  • 外键约束
    外键 (FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。
    一个表能够有多个外键,每一个外键必须 REFERENCES (参考) 另外一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。
    mysql基本使用
    在 INSERT 时,若是被外键约束的值没有在参考列中有对应,则INSERT 失败

  • 非空约束
    非空约束 (NOT NULL),听名字就能理解,被非空约束的列,在插入值时必须非空。
    mysql基本使用在MySQL中违反非空约束,不会报错,只会有警告
相关文章
相关标签/搜索