Mysql

本篇为记录Mysql语法,以当记录为主

启动与关闭

1
2
3
4
启动:net start mysql;
关闭:net stop mysql;
登录:mysql -u root -p 123 -h localhost;
退出:quit;

数据类型

1
2
3
4
5
6
INT
DECIMAL 小数
VALCHAR(n)字符串
BLOB (binary Large Object) 图片 影片
DATE 日期
TIMESTAMP 记录时间

分类

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
  • DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

DLL 数据定义语言

对于 DB 操作

1
2
3
CREATE DATABSASE ‘database’;(创建叫database的数据库)
SHOW DATABASE;(展示数据库)
DROP DATABASE ‘database’;(删除数据库)
1
2
3
4
5
6
7
8
9
查看所有数据库名称:SHOW DATABASES;

切换数据库:USE mydb1;

创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb1;

删除数据库:DROP DATABASE [IF EXISTS] mydb1;

修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8

对于 table 操作

1
2
3
4
5
6
CREATE TABLE `student` (
`student_id` INT PRIMARY KEY,
`name` VARCHAR(20),
`major` VARCHAR(20)
);
describe `student`;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建表
CREATE TABLE stu(
sid CHAR(6),
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
);

CREATE TABLE emp(
eid CHAR(6),
ename VARCHAR(50),
age INT,
gender VARCHAR(6),
birthday DATE,
hiredate DATE,
salary DECIMAL(7,2),
resume VARCHAR(1000)
);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
查看当前数据库中所有表名称:SHOW TABLES;

查看指定表的创建语句:SHOW CREATE TABLE emp;

查看表结构:DESC emp;

删除表:DROP TABLE emp;

修改表:

# 1.修改之添加列:给stu表添加classname列:
ALTER TABLE stu ADD (classname varchar(100));

# 2.修改之修改列类型:修改stu表的gender列类型为CHAR(2):
ALTER TABLE stu MODIFY gender CHAR(2);

# 3.修改之修改列名:修改stu表的gender列名为sex:
ALTER TABLE stu change gender sex CHAR(2);

# 4.修改之删除列:删除stu表的classname列:
ALTER TABLE stu DROP classname;

# 5.修改之修改表名称:修改stu表名称为student:
ALTER TABLE stu RENAME TO student;

DML 数据操作语言

insert

语句 作用
insert into student values (1,’bai’,’history’,50); 普通添加
insert into student values (2,’black’,NULL,100); 添加可以加入 null 空元素
insert into student values (3,’green’,’enlish’,20);
insert into student (name,major,student_id,score) values (‘red’,’enlish’,4,60); 可以按照自定顺序添加

updete

语句 作用
update student
set major=’chemistry’
where student_id= ‘4’;
在 id 为 4 的行的 major 改为 chemistry。
update student
set major = ‘japan’
where student_id = ‘3’ or student_id=2 ;
在 id 为 2 或 3 的地方改为 japan(and 同理)
UPDATE student
SET ‘name’=‘zero’
不安全会报错
update student
set name=’purple’ , score=10000
where student_id=5;
在 id 为 5 下 name 改为 purple 和 score10000

delete

语句 作用
DELETE FROM ‘student’
WHERE ‘name’=‘小灰’ AND ‘major’=‘物理’;
删除在满足 and 条件的元素
DELETE FROM ‘student’
WHERE ‘score’ < 60 ;
删除分数小于 60 的元素
DELETE FROM ‘student’ 删除整个 student 表
1
2
3
4
5
6
7
8
9
10
11
12
# 插入数据
INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan');
INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');

# 修改数据
UPDATE stu SET sname=’liSi’, age=20WHERE age>50 AND gender=’male’;

# 删除数据
DELETE FROM stu WHERE sname=’chenQi’ OR age > 30;
DELETE FROM stu;
# truncate 是先DROP TABLE,再CREATE TABLE。而且TRUNCATE删除的记录是无 法回滚的,但DELETE删除的记录是可以回滚的
TRUNCATE TABLE stu;

DCL 数据控制语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 创建用户: CREATE USER 用户名@地址 IDENTIFIED BY '密码';
CREATE USER user1@localhost IDENTIFIED BY123’;
CREATE USER user2@’%’ IDENTIFIED BY123’;

# 给用户授权: GRANT 权限1, … , 权限n ON 数据库.* TO 用户名
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
GRANT ALL ON mydb1.* TO user2@localhost;

# 撤销授权: REVOKE权限1, … , 权限n ON 数据库.* FORM 用户名
REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;

# 查看用户权限:SHOW GRANTS FOR 用户名
SHOW GRANTS FOR user1@localhost;

# 删除用户:DROP USER 用户名
DROP USER user1@localhost;


# 修改用户密码
USE mysql;
UPDATE USER SET PASSWORD=PASSWORD(‘密码’) WHERE User=’用户名’ and Host=’IP’;
FLUSH PRIVILEGES;
#------------------
UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2' and Host=’localhost’;
FLUSH PRIVILEGES;


DQL 数据查询语言

SELECT

语句 作用
SELETE ‘name’,’major’ FROM ‘student’; 普通查询 name major 列
SELETE * FROM ‘student’
ORDER BY ‘score’ ASC(DESC);
排序从小到大(从大到小)
SELETE * FROM ‘student’
ORDER BY ‘score’ DESC LIMIT 3 ;
返回前三低(高)的资料
SELETE * FROM ‘student’
WHERE ‘major’ =‘英语’ OR ‘score’ <> 70;
不等于 70
SELETE * FROM ‘student’
WHERE ‘major’ IN (历史,英语,生物)
相当于 OR 连用
1
2
3
4
5
6
7
8
9
语法:
SELECT selection_list /*要查询的列名称*/
FROM table_list /*要查询的表名称*/
WHERE condition /*行条件*/
GROUP BY grouping_columns /*对结果分组*/
HAVING condition /*分组后的行条件*/
ORDER BY sorting_columns /*对结果分组*/
LIMIT offset_start, row_count /*结果限定*/

条件查询

  • =、!=、<>、<、<=、>、>=;
  • BETWEEN…AND;
  • IN(set);
  • IS NULL;
  • AND;
  • OR;
  • NOT;
1
2
3
4
5
SELECT * FROM stu 
WHERE sid IN ('S_1001','S_1002','S_1003');
SELECT * FROM stu
WHERE sname IS NOT NULL;

模糊查询

  • “*_”:匹配任意一个字母,5个“*”表示5个任意字母
  • “%”:匹配0~n个任何字母 “
1
2
3
# 查询姓名中第2个字母为“i”的学生记录
SELECT * FROM stu
WHERE sname LIKE '_i%';

字段控制查询

1
2
3
4
5
# 去除重复记录 :distinct
SELECT DISTINCT sal FROM emp;

# 给列名添加别名
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;

排序

1
2
SELECT * FROM emp
ORDER BY sal DESC,empno ASC;

聚合函数

  • COUNT():统计指定列不为NULL的记录行数;
  • MAX():计算指定列的最大值,是字符串类型,那么使用字符串排序运算;
  • MIN():计算指定列的最小值,是字符串类型,那么使用字符串排序运算;
  • SUM():计算指定列的数值和,不是数值类型,计算结果为0;
  • AVG():计算指定列的平均值,不是数值类型,那么计算结果为0;

分组查询

1
2
3
4
SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;

HAVING子句

1
2
3
4
SELECT deptno, SUM(sal) FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;
#注:WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束

LIMIT

limit 起始行 , 查询行数 //起始行从0开始,为开区间

1
2
# 查询从第四行开始的10行记录
SELECT * FROM emp LIMIT 3, 10;

完整性约束

key 的类型

名称 中文名 作用
primary key 主键 唯一区分某一笔资料(哈希)
foreign key 外键 可以对应到别的或者自己(并查集)这个表格的元素
attribute 元素 普通元素

主键 :primary key

  • 创建表:定义列时指定主键

  • 创建表:定义列之后独立指定主键

  • 修改表时指定主键

    ALTER TABLE stu ADD PRIMARY KEY(sid);

  • 删除主键

    ALTER TABLE stu DROP PRIMARY KEY;

主键自增长 :auto_increment

主键自增长 :auto_increment

  • 主键必须是整型才可以自增长
  • 创建表时设置主键自增长
1
2
3
4
5
6
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
);
  • 修改表时设置主键自增长
1
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
  • 修改表时删除主键自增长
1
ALTER TABLE stu CHANGE sid sid INT;

非空:NOT NULL

字段设为非空后,插入记录时必须给值

唯一:UNIQUE

字段指定唯一约束后,字段的值必须是唯一的

外键 foreign key

外键是另一张表的主键 !!

外键就是用来约束这一列的值必须是另一张表的主键值!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 创建表时设置外键

CREATE TABLE t_section(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(30),
u_id INT,
CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid)
);

# 修改表时设置外键

ALTER TABLE t_session
ADD CONSTRAINT fk_t_user
FOREIGN KEY(u_id)
REFERENCES t_user(uid);

# 修改表时删除外键

ALTER TABLE t_section
DROP FOREIGN KEY fk_t_user;

MySQL数据库备份与还原

  • 生成SQL脚本 (备份)

脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!

在未登录mysql状态下:

mysqldump –u 用户名 –p 密码 数据库名>生成的脚本文件路径mysqldump -uroot -p123456 javaclass>E:\javaclass.sql

  • 执行SQL脚本

执行SQL脚本需要登录mysql,进入指定数据库,执行SQL脚本!SOURCE E:\javaclass.sql

无需登录mysql

mysql –u用户名 –p密码 数据库<要执行脚本文件路径 :

mysql -uroot -p123456 javaclass<E:\javaclass.sql

多表查询

合并结果集 UNION

  • UNION:去除重复记录
1
SELECT * FROM t1 UNION SELECT * FROM t2;
  • UNION ALL:不去除重复记录
1
SELECT * FROM t1 UNION ALL SELECT * FROM t2;

连接查询

  • 内连接
1
2
3
4
5
6
7
8
9
# 方言版
SELECT e.ename,e.sal,e.comm,d.dname
FROM emp AS e,dept AS d
WHERE e.deptno=d.deptno;
# 标准版
SELECT *
FROM emp e
INNER JOIN dept d
ON e.deptno=d.deptno;
  • 左连接
1
2
3
SELECT * FROM emp e 
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno;
  • 右连接
1
2
3
SELECT * FROM emp e 
RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;
  • 自然连接
    1
    2
    3
    SELECT * FROM emp NATURAL JOIN dept;
    SELECT * FROM emp NATURAL LEFT JOIN dept;
    SELECT * FROM emp NATURAL RIGHT JOIN dept;
  • 子查询

嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。

子查询出现的位置:

  • where后,作为条件的一部分
  • from后,作为被查询的一条表

MySQL常用基础语法_mysql的语法-CSDN博客

客户端使用 SQLite 连接数据库

SQLite 数据库:存储大量数据时使用的一种方法
数据库一般用于存储大量的结构化数据。在游戏中,我们通常需要存储大量的数据,比如玩家的角色信息、物品信息等,这时候使用数据库就非常合适。本文将介绍如何在Unity中使用SQLite数据库来存储游戏数据。

1.安装SQLite插件
使用SQLite数据库需要安装插件。

2.创建数据库和表
可以使用SQLiteConnection类来连接SQLite数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mono.Data.Sqlite;

public class DatabaseManager : MonoBehaviour
{
private string connectionString;

// Start is called before the first frame update
void Start()
{
connectionString = "URI=file:" + Application.dataPath + "/PlayerData.db";
CreateTable();
}

// 创建表
void CreateTable()
{
using (var conn = new SqliteConnection(connectionString))
{
conn.Open();

using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "CREATE TABLE IF NOT EXISTS Player (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, level INTEGER)";
cmd.ExecuteNonQuery();
}
}
}
}

3.插入和查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mono.Data.Sqlite;

public class DatabaseManager : MonoBehaviour
{
private string connectionString;
// Start is called before the first frame update
void Start()
{
connectionString = "URI=file:" + Application.dataPath + "/PlayerData.db";
CreateTable();//创建表
InsertData("Jack", 10);//向"Player"表中插入一条玩家角色信息
QueryData();//查询所有的角色信息
}

// 创建表
void CreateTable()
{
using (var conn = new SqliteConnection(connectionString))
{
conn.Open();

using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "CREATE TABLE IF NOT EXISTS Player (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, level INTEGER)";
cmd.ExecuteNonQuery();
}
}
}

// 插入数据
void InsertData(string name, int level)
{
using (var conn = new SqliteConnection(connectionString))
{
conn.Open();

using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO Player (name, level) VALUES (@name, @level)";
cmd.Parameters.AddWithValue("@name", name);
cmd.Parameters.AddWithValue("@level", level);
cmd.ExecuteNonQuery();
}
}
}

// 查询数据
void QueryData()
{
using (var conn = new SqliteConnection(connectionString))
{
conn.Open();

using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM Player";

using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var id = reader.GetInt32(0);
var name = reader.GetString(1);
var level = reader.GetInt32(2);

Debug.LogFormat("id: {0}, name: {1}, level: {2}", id, name, level);
}
}
}
}
}