暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySql技术概要

yacon 2018-05-06
166



概念

什么叫数据库系统

存储数据的系统成为数据库系统

什么叫关系型数据库系统

关系型数据库中的数据都是存储在表中的,表与表之间存在某种关系,这种关系可以提高数据的有效性,支持这种表关系的数据库系统成为关系型数据库系统

什么叫数据库管理系统

管理数据库的系统成为数据库管理系统,可以通过数据库管理系统对数据库进行权限、数据等操作

什么叫SQL

结构化查询语句

SQL语句分类

名称解释明令
DDL(数据定义语言)定义和管理数据对象,如数据库,数据表等CREATE、DROP、ALTER
DML(数据操作语言)用于操作数据库对象中所包含的数据INSERT、UPDATE、DELETE
DQL(数据查询语言)用于查询数据库数据SELECT
DCL(数据控制语言)用来管理数据的语言,包括管理权限及数据更改GRANT、COMMIT、ROLLBACK

MySql的特点

  1. 免费、开源

  2. 小巧、功能齐全

  3. 使用便捷

  4. 可运行与Windows或Linux

  5. 适用于中小型甚至大型网站应用

  6. 关系型数据库系统

MySql服务启动与关闭

通过控制台启动与关闭

net start mysql #启动服务

net stop mysql #停止服务

如果出现拒绝访问
,就使用管理员模式
打开CMD

通过服务管理器启动与关闭

  1. 点击微软键+R
    ,打开运行窗体

  2. 输入services.msc
    ,打开服务管理器

  3. 在服务中找到MySql
    ,并进行启动或停止服务操作

控制台操作MySql数据库

登陆本地MySql数据库

语法mysql -u用户名 -p密码

mysql -uroot -proot

语法mysql -u 用户名 -p

mysql -u root -p

语法mysql -h 服务器地址 -u 用户名 -p密码

mysql -h localhost -u root -proot

如果出现'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件。
,就将MySql安装目录下的bin目录配置到系统环境变量中,配置成功后,要记得重启以下CMD,否则不会生效

显示数据库的版本号

select version();

退出MySql

exit;

查看数据库中有哪些表

show tables;

查询当前数据库用户信息

use mysql;select * from user\G;

修改用户密码

#选择mysql
use mysql;
#root用户的密码修改为123
update user set password=password('123') where user='root';
#刷新权限
flush privileges;

查看帮助

语法? 关键字;

? show;

语法命令 --help

mysqldump 
--help|more;

语法help 命令

help show;

DDL

创建数据库

语法

CREATE DATABASE [IF NOT EXISTS] 数据库名称[CHARACTER SET [=] 字符集COLLATE [=] 校对规则]

示例

CREATE DATABASE school CHARACTER SET utf8 COLLATE utf8_general_ci;

删除数据库

语法DROP DATABASE [IF EXISTS] 数据库名称;

DROP DATABASE IF EXISTS 

查看数据库

SHOW DATABASES;

选择要操作的数据库

语法USE 数据库名;

USE mysql;

创建表

语法

CREATE TABLE [IF NOT EXISTS] 表名(
   列名 数据类型(数据长度) [NOT NULL | NULL] [DEFAULT 默认值] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT '列注释'],
   ...,
   列名 数据类型(数据长度) [NOT NULL | NULL] [DEFAULT 默认值] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT '列注释']
)[ENGINE [=] 表引擎 CHARACTER SET [=] 字符集 COMMENT [=] '表注释' AUTO_INCREMENT [=] 自增列初始值]

示例

CREATE TABLE IF NOT EXISTS `student` (
  `id` INT(11) DEFAULT NULL,
  `name` CHAR(1) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8

查询数据库的定义

语法SHOW CREATE DATABASE 数据库名称;

SHOW CREATE DATABASE school;

查看数据表的定义

语法SHOW CREATE TABLE 表名

SHOW CREATE TABLE student;

查看表结构

语法DESC 表名;

DESC student;

设置SQL检查模式

语法SET sql_mode='检查模式'

#设置严格检查模式
SET sql_mode='strict_trans_tables'

设置表中自增列的步长

语法SET @@auto_increment_increment = 步长

SET @@auto_increment_increment = 5

查看支持的数据库引擎

SHOW ENGINES;

查看默认的数据库引擎

SHOW VARIABLES LIKE 'storage_engine';

修改表

修改表名

语法 ALERT TABLE 旧表名 RENAME AS 新表名;

ALERT TABLE sutdent 
RENAME AS stu;

添加字段

语法ALERT TABLE 表名 ADD 字段名 数据类型(数据长度) [列属性];

ALERT TABLE student ADD address varchar(100);

修改字段

语法ALERT TABLE 表名 MODIFY 字段名 数据类型(数据长度) [列属性];

ALERT TABLE student MODIFY address varchar(500);

语法ALERT TABLE 表名 CHANGE 旧字段名 新字段名 数据类型(数据长度) [列属性];

ALERT TABLE student CHANGE address addr varchar(500);

删除字段

语法ALERT TABLE 表名 DROP 字段名;

ALERT TABLE student DROP address;

删除表

语法DROP TABLE IF EXISTS 表名;

DROP TABLE IF EXISTS student;

创建外键

语法

CREATE TABLE 从表名(
   字段定义,    CONSTRAINT 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表名称(主键列名) )

示例

/* 主键表 */
CREATE TABLE IF NOT EXISTS grade(
id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT, grade_name VARCHAR(20) NOT NULL);/* 外键表*/CREATE TABLE IF NOT EXISTS student( id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL DEFAULT '匿名', grade_id INT(4) NOT NULL,
CONSTRAINT Fk_gradeid FOREIGN KEY(grade_id) REFERENCES grade(id) );

语法

ALTER TABLE 从表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表名称(主键列名)

示例

ALTER TABLE student ADD CONSTRAINT Fk_gradeid FOREIGN KEY(grade_id) REFERENCES grade(id)

删除外键

语法

/*删除外键*/
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
/*删除外键索引*/
ALTER TABLE 表名 DROP INDEX 索引名称;

示例

ALTER TABLE student DROP FOREIGN KEY Fk_gradeid;ALTER TABLE 表名 DROP INDEX Fk_gradeid;

修改表的存储引擎

ALTER TABLE 表名 ENGINE 
= MYISAM:

DML

插入数据

语法INSERT INTO 表名 [(字段1,...,字段n)] VALUES (值1,...,值n);

INSERT INTO grade(gradename) VALUES ('S1');

语法

INSERT INTO 表名 [(字段1,...,字段n)] 
VALUES (1,...,n),...,(1,...,n);

示例

INSERT INTO grade(gradename) VALUES ('S1'),('S2');

插入默认值

INSERT INTO student VALUES (1000,'张三',DEFAULT,1)

插入空值

INSERT INTO student VALUES (1000,'张三',NULL)

修改数据

语法UPDATE 表名 SET 列明=值[,...,列明=值] [WHERE 修改条件]

UPDATE student SET sex = 0 WHERE id=10001

删除数据

语法DELETE FROM 表名 [WHERE 删除条件];

DELETE FROM student WHERE id = 10001;

不会清空自增列;当表类型为INNODB,重启服务后会清空自增列

语法TRUNCATE TABLE 表名;

TRUNCATE TABLE student;

会清空自增列

DQL

语法

SELECT 字段列表FROM 表名 [AS 表别名]
[LEFT|RIGHT|INNER JOIN 表名]
[WHERE 查询条件]
[GROUP BY 分组字段列表[HAVING 组后筛选条件]]
[ORDER BY 排序字段列表]
[LIMIT [偏移量,]行数]

示例

/*查询所有学生信息*/
SELECT * FROM student;

/*查询指定列*/
SELECT studentno,studentname FROM student;

/*给列添加别名*/
SELECT studentno AS 学号,studentname AS 姓名 FROM student;
SELECT studentno 学号,studentname 姓名 FROM student;

/*给表添加别名*/
SELECT studentno,studentname FROM student AS s;
SELECT studentno,studentname FROM student s;

/*去除重复值*/
SELECT DISTINCT studentno FROM result;

/*查询自增列步长*/
SELECT @@auto_increment_increment;

/*查询版本号*/
SELECT VERSION();

/*直接查询表达式*/
SELECT 100*3-1 AS 计算结果;

/*根据条件查询*/
SELECT * FROM student WHERE id=10001

/*查询性李的学员*/
SELECT * FROM student WHERE studentname LIKE '%';

/*查询地址中包含%号的学员信息*/
SELECT * FROM student WHERE address LIKE '%\%%';

/*使用自定义转义符*/
SELECT * FROM student WHERE address LIKE '%:%%' ESCAPE ':';

/*查询指定范围的学员信息*/
SELECT * FROM student WHERE studentno IN(1000,1001,1002);

/*空值查询*/
SELECT * FROM student WHERE email IS NULL;

/*非空值查询*/
SELECT * FROM student WHERE email IS NOT NULL;

/*对查询结果进行排序*/
SELECT * FROM result ORDER BY studentresult DESC

/*分组查询*/
SELECT sex,COUNT(1) FROM studentGROUP BY sexHAVING COUNT(1) > 10

/*返回指定条目数*/
SELECT * FROM student LIMIT 10SELECT * FROM student LIMIT 5,10

/*内连接查询*/
SELECT student.studentno,studentname,subjectno,studentresult
FROM student INNER JOIN result ON result.studentno=student.studentno

/*内连接查询(等值连接查询)*/
SELECT student.studentno,studentname,subjectno,studentresult
FROM student,result WHERE result.studentno=student.studentno

/*左外连接查询*/
SELECT student.studentno,studentname,subjectno,studentresult
FROM student LEFT JOIN result ON result.studentno=student.studentno

/*右外连接查询*/
SELECT student.studentno,studentname,subjectno,studentresult
FROM student RIGHT JOIN result ON result.studentno=student.studentno

/*自连接查询*/
SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS bWHERE a.categoryId = b.pid

/*子查询*/
SELECT studentno,subjectno,studentresult FROM result
WHERE subjectno=(SELECT subjectno FROM subject WHERE subjectname='数据库结构')

事务处理

什么是事务

将一组SQL语句放在同一批次内去执行,如果一个SQL出错,则该批次内的所有SQL都将被取消执行。

事务的特点(ACID原则)

  1. 原子性(Atomic)

  2. 一致性(Consist)

  3. 隔离性(Isolated)

  4. 持久性(Durable)

事务的实现

/*关闭自动提交模式*/
SET AUTOCOMMIT = 0;

/*开启事务*/
START TRANSACTION;

/*要执行的SQL语句组*/
UPDATE account SET cash=cash-500 WHERE name='a';
UPDATE account SET cash=cash+500 WHERE name='b';

/*提交事务*/
COMMIT;

/*回滚事务*/
ROLLBACK;

/*开启自动提交模式*/
SET AUTOCOMMIT = 1;

索引

什么是索引

可以将索引看作是数据表的目录

索引的所用

  1. 提高查询速度

  2. 确保数据的唯一性

  3. 可以加速表和表之间的连接,实现标语表之间的参照完整性

  4. 使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间

  5. 全文检索字段进行搜索优化

索引分类

  1. 主键索引(PRIMARY KEY)

  2. 唯一索引(UNIQUE)

  3. 常规索引(INDEX)

  4. 全文索引(FULLTEXT)

主键索引

主键索引特点

  1. 最常见的索引类型

  2. 确保数据记录的唯一性

  3. 确定特定数据记录在数据库中的位置

创建主键索引

/*方式一*/
CREATE TABLE 表名(
   id int(11) AUTO_INCREMENT PRIMARY KEY,    ... );
   
/*方式二*/
CREATE TABLE 表名(
   id int(11) AUTO_INCREMENT,    ...,    PRIMARY KEY(`id`) );

/*方式三*/
ALTER TABLE 表名 ADD PREMARY KEY(`id`);

唯一索引

唯一索引作用

避免同一个表中某列数据重复

与主键索引的区别

  1. 主键索引只能右一个,唯一索引可以右多个

  2. 主键索引不能为NULL值,唯一索引可以为NULL值

创建唯一索引

/*方式一*/
CREATE TABLE 表名(
   name int(11) AUTO_INCREMENT UNIQUE,    ... );
/*方式二*/
CREATE TABLE 表名(
   name int(11) AUTO_INCREMENT,    ...,
   UNIQUE KEY `name`(`name`) );
/*方式三*/
ALTER TABLE 表名 ADD UNIQUE KEY(`name`);

常规索引

常规索引作用

快速定位特定数据

常规索引注意事项

  1. index和key关键都可以设置常规索引

  2. 应该加在查找条件的字段

  3. 不宜添加太多常规索引,影响数据的插入、删除和修改操作

创建常规索引

/*方式一*/
CREATE TABLE 表名(    ...,
   INDEX 'ind'(`studentno`,`subjectno`) );
/*方式二*/
CREATE TABLE 表名(    ...,
   KEY 'ind'(`studentno`,`subjectno`) );
/*方式三*/
ALTER TABLE `表名` ADD INDEX `ind`(`studentno`,`subjectno`);

全文索引

全文索引作用

快速定位特定数据

全文索引注意事项

  1. 只能用于MyISAM类型的数据表

  2. 只能用于CHAR、VARCHAR、TEXT数据列类型

  3. 适合大型数据集

创建全文索引

/*方式一*/
CREATE TABLE 表名(    ...,    FULLTEXT(`content`) );
/*方式二*/
ALTER TABLE `表名` ADD FULLTEXT (`content`);

使用全文索引

全文索引无法直接使用,需要使用如下SQL才可使用

SELECT * FROM student WHERE MATCH(StudentName) AGAINST('')

查看执行查询语句的性能

EXPLAIN SELECT * FROM student WHERE studentno='1001';

显示表中的索引信息

SHOW INDEX FROM 表名;

删除索引

/*方式一*/
DROP INDEX 索引名称 ON 表名;
/*方式二*/
ALTER TABLE 表名 DROP INDEX 索引名称;
/*删除主键索引*/
ALTER TABLE 表名 DROP PRIMARY KEY;

索引使用准则

  1. 索引不是越多越好

  2. 不要对经常变动的数据加索引

  3. 小数据量的表建议不要加索引

  4. 索引一般应加在查找条件的字段

数据库备份与还原

使用mysqldump
备份

语法

mysqldump -h 主机名 -u用户名 -p密码 [其它参数] 数据库名[1 2 3] > 文件路径.sql

示例

/*备份整个库*/
mysqldump -uroot -proot myschool > d:/myschool.sql

/*备份库中指定的表*/
mysqldump -uroot -proot myschool grade student > d:/myschool.sql

/*备份时跳过drop table语句*/
mysqldump -uroot -proot --skip-add-drop-table myschool > d:/myschool.sql

/*备份时跳过drop table语句,插入时显示列名*/

mysqldump -uroot -proot --skip-add-drop-table -c myschool > d:/myschool.sql
  1. 在控制台使用

  2. 在未登录的情况下使用

mysqldump常用选项

选项描述
--add-drop-table到处sql脚本会加上 DROP TABLE IF EXISTS
语句
默认是打开的,可以使用--skip-add-drop-table
来取消
--add-locks该选项会在INSERT语句中捆绑一个LOCK TABLE
UNLOCK TABLE
语句
好处:防止记录被再次导入时,其他用户对表进行操作,默认是打开的
-t 或 --no-create-info忽略不写重新创建每个转储表的CREATE TABLE
语句
-c 或 --complete-insert在每个INSERT语句的列上加上字段名
在数据库导入另一个数据库时非常有用
-d 或 -no-data不写表的任何行信息。对于只想转储表的结构很有用
--where "where-condition" 或 -w "where-condition"只转储给定的WHERE条件选择的记录
-opt该选项时速记;等同于指定
--add-drop-tables
--add-locking
--create-option
--disable-keys
--extended-insert
--lock-tables
--quick
--set-charset

数据库的恢复

SOURCE
恢复

SOURCE /path/db_name.sql
  1. 在控制台使用

  2. 登陆后使用

mysql
恢复

mysql -uroot -proot 数据库名 < /path/db_name.sql;
  1. 在控制台使用

  2. 在未登录的情况下使用

备份数据与恢复数据

/*备份*/
SELECT studentno,studentname INTO OUTFILE 'h:/student.sql' FROM student;
/*恢复*/
LOAD DATA INFILE 'h:/student.sql' INTO TABLE student(studentno,studentname);

  1. 该方法只能备份和恢复数据

  2. 可在工具中使用

  3. 登陆后使用

数据类型

数值类型

类型说明取值范围存储需求
tinyint非常小的数据有符值: -27 ~ 27-1
无符号值:0 ~ 28-1
1字节
smallint较小的数据有符值:-215 ~ 215-1
无符号值:0 ~ 216-1
2字节
mediumint中等大小的数据有符值:-223 ~ 223-1
无符号值:0 ~ 224-1
3字节
int标准整数有符值:-231 ~ 231-1
无符号值:0 ~ 232-1
4字节
bigint较大的整数有符值:-263 ~ 263-1
无符号值:0 ~264-1
8字节
float单精度浮点数±1.1754351e-384字节
double双精度浮点数±2.2250738585072014e-3088字节
decimal字符串形式的浮点数decimal(m,d)m个字节

字符串类型

类型说明字节数
char[(M)]固定长字符串,检索快但费空间,0<=M<=255M字节
varchar[(M)]可变字符串0<=M<=65535可变长度
tinytext微型文本串0~28–1字节
text文本串0~216–1字节

日期类型

类型格式取值范围
DATEYYYY-MM-DD,日期格式1000-01-01 ~ 9999-12-31
DATETIMEYY-MM-DD hh:mm:ss1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
TIMEhh:mm:ss-835:59:59 ~ 838:59:59
TIMESTAMPYYYYMMDDHHMMSS格式表示的时间戳197010101000000~2037年某时刻,精度为1秒
YEARYYYY1901~2155

NULL值

  1. 理解为“没有值”或“未知值”

  2. 不要用NULL进行算术运算,结果仍为NULL

常用函数

常用数学函数

/*绝对值*/
SELECT ABS(-8);
/*向上取整*/
SELECT CEILING(9.8);
/*向下取整*/
SELECT FLOOR(9.8);
/*返回0-1之间的随机数*/
SELECT RAND();
SELECT RAND(10);
/*判断一个数值的符号,如果是负数返回-1,如果是正数返回1,如果是0返回0*/
SELECT SIGN(-9);

常用字符串函数

/*返回字符串包含的字符数*/
SELECT CHAR_LENGTH('Hello World!!!');
/*将多个字符串连接起来,返回一个新字符串*/
SELECT CONCAT('My',' ','Love',' ', 'MySql');
/*将指定位置和长度的字符串替换为新字符串,下标从1开始*/
SELECT INSERT('Hello World!!!',7,5,'MySql');
/*将指定字符串替换为新字符串*/
SELECT REPLACE('Hello World!!!','World','Mysql');
/*字母转换为小写*/
SELECT LOWER('Hello World');
/*字母转换为大写*/
SELECT UPPER('Hello World');
/*从左侧截取指定长度的字符串*/
SELECT LEFT('Hello world',3);
/*从右侧截取指定长度的字符串*/
SELECT RIGHT('Hello world',3);
/*截取指定位置和长度的字符串*/
SELECT SUBSTR('Hello World!!!',1,5);
/*反正字符串*/
SELECT REVERSE('Hello World!!!');

常用日期和时间函数

/*返回当前的日期*/
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());

常用信息信息函数

/*返回系统版本*/
SELECT VERSION();
/*返回当前用户*/
SELECT USER();

聚合函数

/*返回记录总条数*/
SELECT COUNT(1) FROM student;
/*求和*/
SELECT studentno,SUM(studentresult) FROM result GROUP BY studentno
/*求平均*/
SELECT studentno,AVG(studentresult) FROM result GROUP BY studentno
/*求最大值*/
SELECT MAX(studentresult) FROM result
/*求最小值*/
SELECT MIN(studentresult) FROM result

注释

-- 注释内容

/*!版本号 可执行的MySql注释,只能在MySql数据库中执行 */

/* 注释内容 */

相关单词

名词翻译
select查询
insert插入
update更新
delete删除
create创建
drop删除
use使用
database数据库
table数据表
show视图
stored proc存储过程
function函数
trigger触发器
event事件
field name字段名
datatype数据类型
len数据长度
default默认值
PK?是否为主键
not null?是否为空
unsigned?是否为无符号数值,无符号是指不能为负数
auto incr?是否自增
zerofill?是否用0填充
comment注释
alert修改
add添加
change更改
modify修改
rename as重命名

表引擎

名称MyISAMInnoDB
事务处理不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间大小较小较大,约2倍

区别

MyISAM:节约空间,更适合查询
InnoDB:安全性高,更适合操作

运算符

运算符含义
=等于
<>或!=不等于
>大于
<小于
>=大于等于
<=小于等于
BETWEEN a AND b在a到b的范围内
AND或&&并且
OR或||
NOT或!
IS NULL是空值
IS NOT NULL不是空值
LIKE 'a'像'a'这种模式
IN ()在()的范围内

通配符

在LIKE运算符后的字符串中使用

占位符说明
%0到多个任意字符
_1个任意字符



北大青鸟徐州中博 教育改变生活



  扫 码 报 名  


文章转载自yacon,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论