Mysql 启动和创建数据库

sql语句注释:--表示单行注释/**/表示多行注释
Markdown书写格式不对,注意缩进问题
1、ubuntu下打开Mysql服务,并使用root用户登录
sudo service mysql start(也可用来检测系统是否安装mysql)mysql -u root
检测是否安装成功:
    netstat -tap |grep mysql
这句话的意思就是查看监听服务进程号
    `
2、连接数据库
use mysql_car
use+[数据库名称] 表示使用某个数据库
show tables;
显示该数据库的各个表名(如果有视图,也会显示)
3、 新建数据库
  CREATE   DATABASE company
虽然Mysql建表语句中不区分大小写,但是一般保留字(关键字)大写,变量小写
4、 新建数据表
- use company (连接数据库)
 - 在数据库中新建一张表的格式为:
 
1  | CREATE TABLE employee(  | 
5、数据类型
| 数据类型 | 大小(字节) | 用途 | 格式 | 
|---|---|---|---|
| INT | 4 | 整数 | |
| Float | 4 | 单精度浮点数 | |
| DOUBLE | 4 | 双精度浮点数 | |
| ENUM | 单选 | ENUM(‘a’,’b’,’c’) | |
| SET | 多选 | SET(‘1’,’2’,’3’) | |
| DATE | 3 | 日期 | YYYY-MM-DD | 
| TIME | 3 | 时间点或持续时间点 | HH:MM:SS | 
| YEAR | 1 | 年份值 | HH:MM:SS | 
| CHAR | 0~255 | 定长字符串 | |
| VARCHAR | 0~255 | 变长字符串 | |
| TEXT | 0~65535 | 长文本数据 | 
CHAR和VARCHAR的区别: CHAR的长度是固定的,而VARCHAR的长度是可以变化的,比如,存储字符串“abc”,对于CHAR (10),表示存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR(12)则只占用3个字节的长度,12只是最大值,当你存储的字符小于12时,按实际长度存储。
ENUM和SET的区别: ENUM类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而SET类型的值则可以多选。
6、插入数据
1  | INSERT INTO 表名(  | 
1  | INSERT INTO employee(id,name,phone) VALUES(1,'周星',18570631121);  | 
1,3语句相同,如果插入数据完整可以省略
2语句不全时该值为NULL
除INT,DOUBLE,FLOAT值不需要单引号,其他数据需要单引号括起
#####约束
约束:通过对表的行和列的数据做出限制,来保证表数据的完整性和唯一性
Mysql数据库的约束分类:
| 约束类型: | 主键 | 默认值 | 唯一 | 外键 | 非空 | 
|---|---|---|---|---|---|
| 关键字: | PRIMARY KEY | DEFAULT | UNIQUE | FOREIGN KEY | NOT NULL | 
主键
列级定义主键
1
2
3
4
5create table employee(
id int(10) NOT NULL PRIMART KEY AUTO_INCREMENT,
name char(20),
phone bigint(15)
)表级定义主键
1
2
3
4
5
6create table employee(
id int(10) NOT NULL AUTO_INCREMENT,
name char(20),
phone bigint(15),
CONSTRAINT emp_pk PRIMARY KEY(id)
)复合主键(由表中两列或多列共同标识)
1
2
3
4
5
6
7create table employee(
id int(10) NOT NULL AUTO_INCREMENT,
name char(20),
phone bigint(15),
CONSTRAINT emp_py PRIMARY KEY(id,phone)
)
emp_py是主键名称(自定义的)
默认值约束
phone bigint(15) 15203768500
DEFAULT约束只会在使用INSERT语句时体现出来,
INSERT语句中,插入位置没有值,则填充默认值
唯一约束
UNIQUE比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
UNIQUE(phone)
如果在phone这一列插入相同的值则失败
FOREIGN KEY
FOREIGN KEY既能保证数据完整性,又能体现表之间的关系1
2
3
4
5CONSTRAINT emp_fk FOREIGN KEY(name) REFERENCE Em_info(em_name)
--name列为外键,参考列为Em_info表的em_name列
/*
这里是多行注释
*/
NOT NULL
非空约束:name char(20) NOT NULL
Mysql中违反非空约束,不会报错只有警告,值为0
没有非空约束:空插入,值为NULL1
2
3
4INSERT INTO employee(id,name,phone) VALUES(3,1586563241)
--警告 name被非空约束,值为空,表中显示0
INSERT INTO employee(id,name,phone) VALUES(3,'laiwei')
-- INSERT成功 phone为空,因为没有非空约束,表中显示NULL
查询
1.基本select语句
1  | select * from 表名  | 
2.AND与OR
1  | SELECT name,age from employee WHERE age>20 AND age<30  | 

如果需要包含边界值既age>=20<=31
select name,age from employee WHERE age BETWEEN 20 AND 30`;

3. IN和NOT IN
IN 和NOT IN用来指定在不在一个某个范围内的结果,比如我们要查询在dpt3和dpt4中的结果:1
select name,age,dpt from employee where dpt IN ('dpt3','dpt4');

NOT IN 查询不在这个序列中的:1
select name,age,dpt from employee where dpt NOT IN ('dpt3','dpt4');
4. 通配符
SQL语句中 LIKE 关键字和通配符一起使用,_ :表示未指定的 一个字符%: 表示未指定的多个字符
查询电话号码前面为:43776的employee1
select name,age from employee where phone LIKE '43776__';
查询以周姓开头的employee1
select name,age from employee where name LIKE '周%';
结果可能为: 周星,周星星,周建波
5. 对结果进行排序 DESC(降) ASC(升)
1  | select name,age,salary,phone from employee ORDER BY salary DESC;  | 
6.sql内置函数和计算
sql允许对表中数据进行计算,有5个内置函数:
| 函数名: | COUNT | SUM | AVG | MAX | MIN | 
|---|---|---|---|---|---|
| 作用: | 计数 | 求和 | 平均值 | 最大值 | 最小值 | 
查询salary最大最小值:1
select MAX(salary) AS zuigao_gongzi, MIN(salary) from employee;

AS关键字对最高工资进行命名
7.子查询
想要知道名为”Tom”的员工所在部门做了几个工程。员工信息储存在employee表中,但工程信息储存在project表中
1  | select apt_name,COUNT(proj_name) AS count_project from project  | 
子查询还可以扩展到3层、4层或更多层。

8.连接查询
在处理多个表时,子查询只有在结果来自一个表时才有用。但如果需要显示两个表或多个表中的数据,使用连接查询把多个表当做一个表使用。
各员工所在部门的人数,其中员工的id和name来自employee表,people_num来自department表:1
2
3
4select name,people_num
FROM employee,department
WHERE employee.in_dpt= department.dpt_name
ORDER BY id
修改和删除
删除数据库
DROP DATABASE test_01
重命名一张表
1  | RENAME TABLE 原名 TO 新名  | 
这三种方式都可以
删除一张表
DROP TABLE 表名;
对一列的修改(既对表结构的修改)
#######  1.增加一列
  1
2
3 ALTER TABLE 表名字 ADD COLUMN 列名字 数据类型 约束;
或: ALTER TABLE 表名字 ADD 列名字 数据类型 约束;
ex:ALTER TABLE employee ADD Height int(10) DEFAULT 170;
我们新增一列 weight (体重)放置在 age (年龄)的后面:
ex:
  ALTER  TABLE employee ADD weight int(10) DEFAULT 120 AFTER age;

  新增加一列,放在第一位
  ex:
    ALTER  TABLE employee ADD test int(10) DEFAULT  11 FIRST;
####### 2. 删除一列1
2ALTER TABLE employee DROP test;
--ALTER TABLE 表名字 DROP 列名字
####### 3.重命名一列(对列的属性做修改)
修改数据类型必须小心,因为这可能会导致数据丢失。在尝试修改数据类型之前,请慎重考虑。
1  | ALTER TABLE employee CHANGE age nianling int(50) NOT NULL;  | 
注意:这条重命名语句后面的 “数据类型” 不能省略,否则重命名失败。
当原列名和新列名相同的时候,指定新的数据类型或约束,就可以用于修改数据类型或约束。需要注意的是,修改数据类型可能会导致数据丢失,所以要慎重使用。
####### 4.改变数据类型1
2ALTER TABLE employee MODIFY age char(2);
--ALTER TABLE 表名字 MODIFY 列名 新数据类型;
对表的内容进行修改
####### 修改表中的某个值1
2UPDATE employee SET age=21, salary=3000 WHERE name='TOM';
--UPDATE 表名 SET 列1='值1' 列2='值2' where 条件
####### 删除一行记录1
2DELETE FROM employee where name ='TOM';
--DELETE FROM 表名 WHERE 条件;
索引
索引是一种与表有关结构,相当于书的目录,可以根据目录的页码快速找到所需内容。
当表中有大量内容,如果表中没有索引,进行全表搜索将记录全部取出,与查询条件对比,返回符合条件的记录。这样会消耗数据库的大量时间,造成大量磁盘IO操作。
如果表中以建立索引,在索引中查找符合条件的索引值,根据索引值快速找到表中数据,可大大加快查询速度
1  | ALTER TABLE employee ADD INDEX idx_id (id);  | 
索引的目的是加快查询的速度,当数据较少时候不会体现
SHOW INDEX FROM 表名查看表中的索引- SELECT语句查询时,WHERE里面的条件会自动判断有没有可用的索引
 
视图
视图是从一个表或者多个表导出来的表,是一个虚拟的表,它就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户不用看到整个数据库中的数据,而只关心对自己有用的数据。
注意理解视图是一个虚拟的表:
- 数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据放在原来的表中
 - 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据
 - 视图中的数据依赖于原来表中的数据,如果原来表中的数据发生改变,显示在视图中的数据也会发生改变
 - 在使用视图时,可以把它当做一张表
 
创建视图的语句格式为:1
CREATE VIEW 视图名(列a,列b,列c) AS SELECT 列1,列2,列3 FROM 表名字;
可见创建视图的语句,后半句是一个SELECT查询语句,所以视图也可以建立在多张表上,只需在SELECT语句中使用子查询或连接查询

######导入和导出
导入操作,可以把一个文件里的数据保存进入一张表:1
LOAD DATA INFILE '文件路径' INTO TABLE 表名字;
前提是文件中数据的格式要对:
导出操作,是将一个数据库表中的数据保存到一个文件之中:1
SELECT 列1,列2 INTO OUTFILE '文件路径和文件名' FROM表名字;
注意:语句中 “文件路径” 之下不能已经有同名文件。
现在我们把整个employee表的数据导出到 /tmp 目录下,导出文件命名为 out.txt 具体语句为:1
SELECT * INTO OUTFILE 'tmp/out.txt' FROM employee
备份
数据库中的数据十分重要,注意使用备份功能
备份与导出的区别:导出的文件只是保存数据库中的数据;而备份,则是把数据库的结构,包括数据、约束、索引、视图等全部另存为一个文件。
mysqldump是MySQL用于备份数据库的实用程序。它主要产生一个SQL脚本文件,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。
使用mysqldump备份的语句:1
2
3
4mysqldump -u root 数据库名 > 备份文件名;
--备份整个数据库
mysqldump -u root 数据库名 表名字 > 备份文件名;
--备份整个表
我们尝试备份整个数据库 mysql_shiyan,将备份文件命名为 bak.sql,先 Ctrl+Z 退出MySQL,再使用语句:1
mysqldump -u root mysql_shiyan > bak.sql
使用备份文件恢复数据库
1  | source /tmp/SQL6/MySQL-06.sql  | 
这就是一条恢复语句,它把MySQL-06.sql文件中保存的mysql_shiyan数据库恢复。
另一种方式:
1.CREATE DATABASE test;
- CTRL+Z退出mysql ,然后输入语句进行恢复,把刚才备份的 bak.sql 恢复到 test 数据库:
mysql -u root test < bak.sql mysql -u root use test show tables;
结果: