Mysql:初级总结

1.DOS窗口相关命令

#连接数据库
mysql -h '服务器主机地址' -u '用户名' -p'用户密码'
#修改密码
update user set password=password('xxxx') where user='root';
#刷新数据库权限
flush privileges;
#显示数据库
show databases;
#打开某个数据库
use dbname;
#显示数据库mysql中所有的表
show tables;
#显示表mysql数据库中user表的列信息
describe user;
#创建数据库
create database xxx;
#选择数据库
use databasename;

2. 数据库操作

名称解释命令
DDL(数据定义语言)定义和管理数据对象CREATE、DROP、ALTER
DML(数据操作语言)用于操作数据对象中所包含的数据INSERT、UPDATE、DELETE
DQL(数据查询语言)用于查询数据库数据SELECT
DCL(数据控制语言)用于管理数据库的语言,包括权限管理及数据更改GRANT、commit、rollback
1. 基本增删改操作

1. 创建数据表:

create table [if not exists] `表名`(
    '字段名1' 列类型 [属性][索引][注释],
    '字段名2' 列类型 [属性][索引][注释],
    #...
    '字段名n' 列类型 [属性][索引][注释]
)[表类型][表字符集][注释];
CREATE TABLE IF NOT EXISTS `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
 ....
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

MySQL的数据表的类型 : MyISAM , InnoDB , HEAP , BOB , CSV等…
常见的 MyISAM 与 InnoDB 类型:
在这里插入图片描述

2. 修改数据表:
修改表名

ALTER TABLE 旧表名 RENAME AS 新表名

添加字段:

 ALTER TABLE 表名 ADD 字段名 列属性[属性]

修改字段:

ALTER TABLE 表名 MODIFY 字段名 列类型[属性]
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性]

3. 删除数据表:
删除字段:

ALTER TABLE 表名 DROP 字段名

删除数据表:

DROP TABLE [IF EXISTS] 表名

4. 查询数据表:

SELECT语法:
注意:[ ] 括号代表可选的 , { }括号代表必选得,且注意前后关系

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
    [left | right | inner join table_name2]  -- 联合查询
    [WHERE ...]  -- 指定结果需满足的条件
    [GROUP BY ...]  -- 指定结果按照哪几个字段来分组
    [HAVING]  -- 过滤分组的记录必须满足的次要条件
    [ORDER BY ...]  -- 指定查询记录按一个或多个条件排序
    [LIMIT {[offset,]row_count | row_countOFFSET offset}];
    --  指定查询的记录从哪条至哪条
    1. As子句作为别名
    1. DISTINCT关键字对查询结果去重:SELECT DISTINCT… (大表一般不用distinct去重,建议用GROUP BY)
    1. 使用表达式作为查询列
SELECT @@auto_increment_increment; -- 查询自增步长
SELECT VERSION(); -- 查询版本号
SELECT 100*3-1 AS 计算结果; -- 表达式
    1. 模糊查询:IS NULL、IS NOT NULL、BETWEEN、LIKE、IN(a IN (a1,a2,a3…)
    1. 连接查询:
操作符名称描述
INNER JOIN如果表中至少一个匹配,则返回行
LEFT JOIN即使右表中没有匹配,也从左表中返回所有的行
RIGHT JOIN即使左表中没有匹配,也从中表中返回所有的行

在这里插入图片描述

    1. 排序和分页: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
limit x按顺序取x条记录
limit x,y按索引x取y条数据
limit x offset y索引y 取x条数据
2. 数据值和列类型

数值类型:

类型说明存储需求
tinyint非常小的数据1字节
smallint较小的数据2字节
mediumint中等大小的数据3字节
int标准整数4字节
bigint较大的整数8字节
float单精度浮点数4字节
double双精度浮点数8字节
decimal字符串形式浮点数

(float和double容易导致精度丢失,在数字要求准确的情况下必须使用decimal)

字符串类型:

类型说明存储需求
char[M]固定长字符串,检索快但费时间M字符
varchar[M]可变字符串 ,对应java中的String变长度
tinytext微型文本串2^8-1字节
text文本串2^16-1字节

日期和时间型数值类型:

类型说明
DATEYYYY-MM-DD ,日期格式
TIMEHh:mm:ss,时间格式
DATETIMEYY-MM-DD hh:mm:ss
TIMESTAMPYYYYMMDDhhmmss,时间戳,197010101000000到某个时刻
YEARYYYY格式

数据字段属性:

  1. UnSigned:无符号的,声明该数据列不允许为负数
  2. ZEROFILL:0填充的,不足位数用0来填充,如int(3),4->004
  3. Auto_InCrement:
    • :自动增长的,自动在上一个记录数上加一;
    • 通常用于主键,且为整数类型
    • 可定义起始值和步长
  4. NULL 和 NOT NULL
  5. DEFAULT
3.常用函数

数据函数:

 SELECT ABS(-8);  /*绝对值*/
 SELECT CEILING(9.4); /*向上取整*/
 SELECT FLOOR(9.4);   /*向下取整*/
 SELECT RAND();  /*随机数,返回一个0-1之间的随机数*/
 SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/

字符串函数:

 SELECT CHAR_LENGTH('……'); /*返回字符串包含的字符数*/
 SELECT CONCAT('a','b','c');  /*合并字符串,参数可以有多个*/
 SELECT INSERT('我爱编程helloworld',1,2,'超级热爱');  /*替换字符串,从某个位置开始替换某个长度*/
 SELECT LOWER('A'); /*小写*/
 SELECT UPPER('a'); /*大写*/
 SELECT LEFT('hello,world',5);   /*从左边截取*/
 SELECT RIGHT('hello,world',5);  /*从右边截取*/
 SELECT REPLACE('abc','b','d');  /*替换字符串*/
 SELECT SUBSTR('abcdfgh',3,3); /*截取字符串,开始和长度*/
 SELECT REVERSE('狂神说坚持就能成功'); /*反转
 
 -- 查询姓周的同学,改成邹
 SELECT REPLACE(studentname,'周','邹') AS 新名字
 FROM student WHERE studentname LIKE '周%';

日期和时间函数:

 SELECT CURRENT_DATE();   /*获取当前日期*/
 SELECT CURDATE();   /*获取当前日期*/
 SELECT NOW();   /*获取当前日期和时间*/
 SELECT LOCALTIME();   /*获取当前日期和时间*/
 SELECT SYSDATE();   /*获取当前日期和时间*/
 
 -- 获取年月日,时分秒
 SELECT YEAR(NOW());
 SELECT MONTH(NOW());
 SELECT DAY(NOW());
 SELECT HOUR(NOW());
 SELECT MINUTE(NOW());
 SELECT SECOND(NOW());

聚合函数:

count()
 sum();
 max();
 min();
 avg();
 group_concat()

COUNT(字段)、COUNT(1)、COUNT(*)的区别:

从含义上讲,count(1) 与 count() 都表示对全部数据行的查询。
count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
count(
) 包括了所有的列,相当于行数,在统计结果的时候,包含字段为null 的记录;
count(1) 用1代表代码行,在统计结果的时候,包含字段为null 的记录 。
count(1)和count(*)都会对全表进行扫描,统计所有记录的条数,包括那些为null的记录,因此,它们的效率可以说是相差无几。而count(字段)则与前两者不同,它会统计该字段不为null的记录条数。

  • 在表没有主键时,count(1)比count(*)快
  • 有主键时,主键作为计算条件,count(主键)效率最高;
  • 若表格只有一个字段,则count(*)效率较高。
4. 其他
 - 可用反引号(`)为标识符(库名、表名、字段名、索引、别名)包裹,以避免与关键字重名!中文也可以作为标识符!
 - 每个库目录存在一个保存当前数据库的选项文件db.opt。
 - 注释:
    单行注释 # 注释内容
    多行注释 /* 注释内容 */
    单行注释 -- 注释内容        (标准SQL注释风格,要求双破折号后加一空格符(空格、TAB、换行等))    
 - 模式通配符:
    _    任意单个字符
    %    任意多个字符,甚至包括零字符
    单引号需要进行转义 \' 
 - CMD命令行内的语句结束符可以为 ";", "\G", "\g",仅影响显示结果。其他地方还是用分号结束。delimiter 可修改当前对话的语句结束符。
 - SQL对大小写不敏感 (关键字)
 - 清除已有语句:\c

3.事务

什么是事务:

  • 事务就是将一组SQL语句放在同一批次内去执行
  • 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
  • MySQL事务处理只支持InnoDB和BDB数据表类型

ACID:
1. 原子性(Atomic):
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态,就像这个事务从来没有执行过一样。

2. 一致性(Consist):
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。

3. 隔离性(Isolated):
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

4. 持久性(Durable):
在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

-- 使用set语句来改变自动提交模式
SET autocommit = 0;   /*关闭*/
SET autocommit = 1;   /*开启*/
 
-- 注意:
---  1.MySQL中默认是自动提交
---  2.使用事务时应先关闭自动提交
-- 开始一个事务,标记事务的起始点
START TRANSACTION  
-- 提交一个事务给数据库
COMMIT
-- 将事务回滚,数据回到本次事务的初始状态
ROLLBACK 
-- 还原MySQL数据库的自动提交
SET autocommit =1;
-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值