Windows系统启动和关闭Mysql服务器
启动:mysqld –console
关闭:mysqladmin -uroot shutdown
Linux系统下启动关闭mysql服务
检查mysql服务是否启动:ps -ef | grep mysqld
启动Mysql:sudo systemctl start mysqld.service
停止:sudo systemctl restart mysqld.service
查看 MySQL 运行状态:systemctl status mysqld.service
1
2
3
4
5
6
7
8
9#服务管理启动:sudo service mysql start
#服务启动:sudo systemctl mysql start
#停止:sudo service mysql stop
#服务状态:sudo service mysql status
#重启Mysql:sudo service mysql restart
#连接数据库:mysql -h 127.0.0.1 -P 3306 -uroot -p123456 #-h为远程IP,-P为端口号,-u为用户名,-p为密码
#退出连接:quit
#测试SQL:show databases;
#登录MySql数据库:mysql -u root -pmysql添加用户
1
2
3
4
5
6首先创建用户
create user 'usrabc'@'%' identified by 'usrabc';
再赋予权限
grant all privileges on testdb to 'test'@'localhost';
flush privileges;
查看mysql的用户列表select host,user from mysql.user;那么这里有一个问题,再赋予权限的时候,会有‘test’@‘%’是什么意思?
1
2
3
4
5
6
7
8
9授权所有数据库的所有表的所有权限给ip为任意值用户名为test密码为pwd的用户
GRANT ALL ON *.* TO 'test'@'%' IDENTIFIED BY 'pwd';
授权mydb数据库的所有表的增删改查权限给ip为1.1.1.1用户名为test密码为pwd的用户
GRANT SELECT,INSERT,UPDATE,DELETE ON mydb.* TO 'test'@'1.1.1.1' IDENTIFIED BY 'pwd';
授权mydb数据库的stu表的修改权限给ip为1.1.1.1用户名为test密码为pwd的用户
GRANT UPDATE(name,age) ON mydb.stu TO 'test'@'1.1.1.1' IDENTIFIED BY 'pwd';mysql默认有一个root用户,但root用户的权限很大,一般只有在管理数据库的时候才会用到。如果在项目中要连接mysql数据库,则建议新建一个权限较小的用户连接。那么流程怎样的呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16用户创建:
CREATE USER username IDENTIFIED BY 'password';
给用户分配权限:
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'username'@'localhost' IDENTIFIED BY 'password';
当我们以username登陆mysql的时候,只有wordpress数据库才是可见的
用户删除
@>mysql -u root -p
@>密码
mysql>Delete FROM user Where User='test' and Host='localhost';
mysql>flush privileges;
mysql>drop database testDB; //删除用户的数据库
删除账户及权限:>drop user 用户名@'%';
>drop user 用户名@ localhost;Django中的host为数据库服务器地址
mysql创建数据库
CREATE DATABASE IF NOT EXISTS my_db default character set utf8 COLLATE utf8_general_ci;
python的Django里面命令行操作mysql数据库:python manage.py dbshell
Django使用命令makemigrations无法执行表修改动作解决方式:
1
2
3python3 manage.py makemigrations --empty 你的应用名
python3 manage.py makemigrations
python3 manage.py migrateDjango管理工具的激活
通常生成项目的时候会在urls.py 中自动设置好,我们只需去掉注释即可
1
2
3
4相关代码
urlpatterns = [
url(r'^admin/', admin.site.urls),
]当你用Django创建superuser的时候,如果报了错误:
将数据模型migrate到数据库后再执行超级用户创建
Django表结构的修改
1
2
3
4表结构修改后,原来表中已存在的数据,就会出现结构混乱,makemigrations更新表的时候就会出错
解决方法:
1、新增加的字段,设置允许为空。生成表的时候,之前数据新增加的字段就会为空。(null=True允许数据库中为空,blank=True允许admin后台中为空)
2、新增加的字段,设置一个默认值。生成表的时候,之前的数据新增加字段就会应用这个默认值Mysql数据类型的属性
NULL:数据列可包含NULL值
NOT NULL:数据列不允许包含null值
Default:默认值
Primary Key:主键
AUTO_INCREASED:自动递增,适用于整数类型,一般用于主键
UNSIGNED:无符号
Chracter Set Name:制定一个字符集
Mysql数据表的创建
1
2
3
4
5
6
7
8CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建 MySql 的表时,表名和字段名外面的符号 ` 不是单引号,而是英文输入法状态下的反单引号,也就是键盘左上角 esc 按键下面的那一个 ~ 按键,坑惨了。数据库查询
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
57SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;
当我们需要将字段中的特定字符串批量修改为其他字符串时,可已使用以下操作:
UPDATE table_name SET field=REPLACE(field, 'old-string', 'new-string')
[WHERE Clause]
DELETE FROM table_name [WHERE Clause]
如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚,打个比方,delete 是发微信说分手,后悔还可以撤回,truncate 和 drop 是直接扇耳光说滚,不能反悔。
UNION用于组合多个select语句的结果
UNION 不能用于列出两个表中所有的country。如果一些网站和APP来自同一个国家,每个国家只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!
Mysql排序
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
Mysql分组
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
group by 可以实现一个最简单的去重查询,假设想看下有哪些员工,除了用 distinct,还可以用:
SELECT name FROM employee_tbl GROUP BY name;
分组后的条件使用 HAVING 来限定,WHERE 是对原始数据进行条件限制。几个关键字的使用顺序为 where 、group by 、having、order by ,例如:
SELECT name ,sum(*) FROM employee_tbl WHERE id<>1 GROUP BY name HAVING sum(*)>5 ORDER BY sum(*) DESC;
表连接查询
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
transaction再执行的时候可以执行回滚rollback,当所有sql语句都正确执行后,才会提交
alter的使用
当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
CREATE INDEX indexName ON mytable(username(length));
修改表结构(添加索引):ALTER table tableName ADD INDEX indexName(columnName)
我们可以在创建表的时候直接指定索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。MySQL 中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列。Mysql处理重复数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。
CREATE TABLE person_tbl
(
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
UNIQUE (last_name, first_name)
);
使用distinct过滤重复数据
SELECT DISTINCT last_name, first_name FROM person_tbl;
使用分组group过滤重复数据
SELECT last_name, first_name FROM person_tbl GROUP BY (last_name, first_name);
删除重复的数据
CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl GROUP BY (last_name, first_name, sex);
DROP TABLE person_tbl;
ALTER TABLE tmp RENAME TO person_tbl;
当然你也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:
ALTER IGNORE TABLE person_tbl ADD PRIMARY KEY (last_name, first_name);导出mysql
mysql的dump用于转存储数据库的实用程序。它主要产生一个 SQL 脚本,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等。
1
2$ mysqldump -u root -p --no-create-info \
--tab=/tmp RUNOOB runoob_tbl导出sql格式的数据
1
mysqldump -u root -p RUNOOB runoob_tbl > dump.txt
如果你需要导出整个数据库的数据,可以使用以下命令
1
mysqldump -u root -p RUNOOB > database_dump.txt
将数据表及数据库拷贝到其他主机
即将数据拷贝至其他的mysql服务器上,可以再mysqldump命令中数据库名字以及数据表
在源主机上执行一下命令,备份至dump.txt中
1
mysqldump -u root -p database_name table_name > dump.txt
将备份的数据库导入到mysql服务器中,注意使用该命令前需要确认数据库已经创建
1
mysql -u root -p database_name < dump.txt
将导出的数据直接导入到远程的服务器上,但请确保两台服务器是相通的,是可以相互访问的:
1
2mysqldump -u root -p database_name \
| mysql -h other-host.com database_name将远程主机的数据库导到本地
1
mysqldump -h other-host.com -P port -u root -p database_name > dump.txt
mysql导入数据
使用mysql导入:
1
mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql)
source命令导入:source 命令导入数据库需要先登录到数库终端:
1
2
3
4mysql> create database abc; # 创建数据库
mysql> use abc; # 使用已创建的数据库
mysql> set names utf8; # 设置编码
mysql> source /home/abc/abc.sql # 导入备份数据库使用mysqlimport导入数据
从文件 dump.txt 中将数据导入到 mytbl 数据表中, 可以使用以下命令
1
mysqlimport -u root -p --local database_name dump.txt
mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:
1
2$ mysqlimport -u root -p --local --fields-terminated-by=":" \
--lines-terminated-by="\r\n" database_name dump.txt