重启mysql服务器 service mysql restart
停止mysql服务器 service mysql stop
开启mysql服务器 service mysql restart
创建数据库 CREATE DATABASE 数据库名;
删除数据库drop database ;
创建数据表 CREATE TABLE 表名(column_name column_type); create table 表名 -- 表字段名 -- 表字段类型create table students(id int unsigned primary key auto_increment not null);
查看表结构 desc 表名;查看表的创建语句 show create table 表名;
查看所有表 show tables;
修改数据表名&修改数据表字段
删除表字段 ALTER TABLE 表名 DROP 字段名; alter table students drop birthda;
增加表字段(定义字段类型) ALTER TABLE 表名 ADD 字段名 类型; alter table students add birthday datetim;
修改字段类型 alter table 表名modify 列名 类型及约束alter table students modify birth date not null;
修改字段名&字段类型 alter table 表名 change原名 新名 类型及约束; alter table students change birthday birth datetime not null;
修改字段默认值 ALTER TABLE 表名 ALTER 字段名 SET DEFAULT 1000;
修改表名 ALTER TABLE 原表名 RENAME TO 新表名;
删除外键约束 alter table tableName drop foreign key keyName;
修改存储引擎 alter table tableName engine=myisam;
删除数据表DROP TABLE 表名; drop table students;
插入数据INSERT INTO 表名(field1,field2,...fieldN )VALUES(value1,value2,...valueN);insert into students(name,hometown,birthday) values('⻩蓉','桃花岛','2016-3-2')value若为字符串类型,需添加引号(单/双)insert into 表名 values (..); insert into students values(0,’郭靖‘,1,'蒙古','2016-1-2')
insert into 表名 values (..),(...); insert into classes values(0,'python1'),(0,'python2')
insert into 表名(列1,...) values(值1,...),(值1,...)..; insert into students(name) values('杨康'),('杨过'),('⼩⻰⼥')
修改数据 update 表名 set 列1=值1,列2=值2... where 条件; update students set gender=0,hometown='北京'where id=5;删除数据DELETE FROM 表名[WHERE条件] delete from students where id=2;
删除表中所有数据 :
delete from 表名; #delete相当于将mysql表中所有记录一条一条删除到删完,而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表
truncate table 表名; # 效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。
删除有外键约束的MySQL表中的数据 : SET FOREIGN_KEY_CHECKS = 0 ;
操作结束后 : SET FOREIGN_KEY_CHECKS = 1;
查询数据SELECT column_name, column_nameFROM table_name[WHERE Clause][LIMIT N][OFFSETM]as关键字 select id as 序号, name as 名字,gender as 性别from student(字段起别名)
select s.id,s.name,s.gender from students as(表起别名)
消除重复行 select distinct 列1,... from表名
where条件查询SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....
比较运算符、逻辑运算符(and or not)、模糊查询(like %多个 _一个)、范围查询(bettween..and(区间内) in(指定值))、空判断(is null is not null)
like条件查询 SELECT field1, field2,...fieldN FROM table_nameWHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
排序查询select 显示字段名 from 表名 order by 排序字段名 asc|desc [,列2 asc|desc,..] select * from students order by age desc,height des
分组查询 SELECT column_name,function(column_name) FROM table_name WHERE column_name operatorvalue GROUP BY column_name;
select gender from students group by gender; 单字段分组
select gender,group_concat(id) from students group by gender; 分组并显示每组成员
select gender,avg(age) from students group by gender; 分组+聚合,平均值
select gender,count(*) from students group by gender; 分组+聚合,计总人数
select gender,count(*) from students group by gender having count(*)>2; 分组+过滤,having过滤分组之后的结果
select gender,count(*) from students group by gender with rollup; 分组后新增一行作为汇总
聚合查询 select count(字段名) from student 计总
select max(id) from students where gender=2; 最大值
select min(id) from students where is_delete=2;最小值
select sum(age) from students where gender=2; 求和
select sum(age)/count(*) from students where gender=2; 或 select avg(id) from students where is_delete=0 and gender=2; 平均值
连接查询INNER JOIN(内连接,或等值连接):查询的结果为两个表匹配到的数据。
select * from students inner join classes on students.cls_id = classes.id;
LEFT JOIN(左/外连接):查询的结果为两个表匹配到的数据和左表特有的,右表不存在数据null填充 select * from students as s left join classes as c on s.cls_id = c.id;RIGHT JOIN(右/外连接):查询的结果为两个表匹配到的数据和右表特有的数据,左表不存在的数据null填充
select * from students as s right join classes as c on s.cls_id = c.id;
自连接查询 select city.* from areas as cityinner join areas as province on city.pid=province.aidwhere province.atitle='山西省';select dis.* from areas as disinner join areas as city on city.aid=dis.pidwhere city.atitle='广州市';
子查询 标量子查询: 子查询返回的结果是⼀个数据(一行一列) select * from students where age > (select avg(age) from students);
列子查询: 返回的结果是⼀列(⼀列多行) 主查询 where 条件 in (列子查询) select name from classes where id in (select cls_id from students);
行子查询: 返回的结果是⼀行(⼀行多列) 主查询 where (字段1,2,...) = (行子查询) select * from students where (height,age) = (select max(height),max(age) from students);
子查询是⼀个完整的SQL
limit分页查询 limit 起始记录,记录数
select * from students limit 0,3; 意思是:从第下标为0的记录开始取,取3条
select * from 表名 limit start=0,count select * from students where is_delete=0 limit (n-1)*m,m
事务处理方法
1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
MySQL 索引
索引 : 单列索引和组合索引;单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,这不是组合索引。 组合索引,即一个索引包含多个列。
创建索引 CREATE INDEX indexName ON mytable(username(length));# 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定length。
修改表结构(添加索引) ALTER table tableName ADD INDEX indexName(columnName)
删除索引 DROP INDEX [indexName]ON mytable;
唯一索引 : 索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
创建唯一索引 CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表结构 ALTER table mytable ADD UNIQUE [indexName](username(length))
显示索引信息 SHOW INDEX FROM table_name;\G
MySQL导出数据:SELECT ... INTO OUTFILE 语句
SELECT*FROM runoob_tblINTO OUTFILE'/tmp/runoob.txt';将数据表runoob_tbl 数据导出到 /tmp/runoob.txt 文件中导出 SQL 格式的数据 mysqldump -u root -p RUNOOB runoob_tbl >dump.txt
导出整个数据库的数据 mysqldump -u root -p RUNOOB >database_dump.txt
备份所有数据库 mysqldump -u root -p --all-databases >database_dump.txt
将备份的数据库导入到MySQL服务器中(需预先建好数据库) mysql -u root -p database_name
MySQL导入数据:
方法一:
mysql -u用户名-p密码
方法二:
mysql>create database abc;# 创建数据库mysql>useabc;# 使用已创建的数据库 mysql>setnames utf8;# 设置编码mysql>source/home/abc/abc.sql # 导入备份数据库
方法三:
LOAD DATA LOCAL INFILE 'dump.txt'INTO TABLE mytbl;
MySQL 事务(ACID)
原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
数据库三范式:
-- 1NF第一范式,要求字段具有原子性,不可再分解。
-- 2NF第二范式,满足第一范式的前提下,不能出现部分依赖。解决:消除复合主键就可以避免部分依赖。增加单列关键字。
-- 3NF第三范式,满足第二范式的前提下,不能出现传递依赖,某个字段依赖于主键,而有其他字段依赖于该字段,这就是传递依赖。解决:将一个实体信息的数据放在一个表内实现。
数据库事务隔离级别:未提交读(Read Uncommitted):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。可重复读(Repeated Read):可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
脏读: 一个事务读取到了另外一个事务没有提交的数据。当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。不可重复读:在同一事务中,两次读取同一数据,得到内容不同。幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同。 幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。
那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
1、脏读:修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放事务1读取数据时加上共享锁后(这样在事务1读取数据的过程中,其他事务就不会修改该数据),不允许任何事物操作该数据,只能读取,之后1如果有更新操作,那么会转换为排他锁,其他事务更无权参与进来读写,这样就防止了脏读问题。但是当事务1读取数据过程中,有可能其他事务也读取了该数据,读取完毕后共享锁释放,此时事务1修改数据,修改 完毕提交事务,其他事务再次读取数据时候发现数据不一致,就会出现不可重复读问题,所以这样不能够避免不可重复读问题。
2、不可重复读:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题
3、幻读问题:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题,在这里有个描述范围锁的文章
不可重复读的重点是修改:同样的条件,你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增或者删除:同样的条件,第 1 次和第 2 次读出来的记录数不一样