title: MySql
#+STARTUP: content
configuation
安装
install
sudo apt install mysql-server
sudo mysql_secure_installation
此时是给电脑的root用户,创建了一个mysql里root用户的数据库
电脑的root用户
sudo apt install mysql-server sudo mysql~secureinstallation~
sudo
上面默认设置的是电脑root用户的密码,也就是说只能 sudo 登陆 : sudo mysql -u root -p create new user 后可以用非sudo 登录
with password
关闭无密码登录
USE mysql;
UPDATE user SET plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;
exit;
sudo systemctl restart mysql.service sudo mysql~secureinstallation~
remote connect
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1
Chinese
对该 my.ini 文件下进行配置修改 :
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8
collation-server = utf8_unicode_ci
init_connect=’SET NAMES utf8’
Plugin is not loaded
if Plugin *** is not loaded: 修改mysql.cnf 在 [mysqld]下添加skip-grant-tables
电脑的普通用户进入配置 This is not needed
step env command explain
01 terminal sudo mysql -u root -p 电脑root进入mysql的root
02 mysql select User, Host, plugin from user; 获取
03 mysql update user set plugin='mysql_ native_ password';
04 mysql select User, Host, plugin from user; 获取
05 mysql flush privileges; 权限更新 in mysqld:skip-grant-tables
06 mysql 1 C-d C-d 退出
07 terminal mysql -u root BUT NOT (mysql -u root -p) 不能 -p, 密码为空,直接Enter进入
08 mysql set password for root@localhost = '123' 老版本 = password('123');
09 error 123 is too simple, just not satisfy the check the password requirement.
10 mysql show variables like 'validate_ password%'; 显示密码设置要求
11 mysql set global validate_ password_ length=3; 设置密码长度要求 为 3
12 mysql set global validate_ password_ policy=0; 设置密码要求概要 为 0
13 mysql set password for root@localhost = '123' 老版本 = password('123');
14 mysql flush privileges; 权限更新 in mysqld:skip-grant-tables
15 terminal mysql -u root -p 密码 123 , 登陆时不需要 sudo 开头
给数据库添加用户
在进入数据库的root后,mysql 添加普通用户 简书连接 .
create USER 'sx'@'localhost' IDENTIFIED BY 'scofild'; 创建sx用户,只能本地连接,秘密scofild
GRANT ALL ON testforjava.course TO 'sx'@'localhost'; 开放testforjava数据集中的course数据表的所有全线给sx 用户
退出后登陆 sx 用户 mysql -u sx -p scofild
便只能看到有权限的数据集
查看数据库及添加数据库
show databases;
create databese kurs;
drop databases kurs;
中文设置
show variables like 'character%';
听说mysql的utf8不是真的utf8,需要使用utf8mb4. 在用户登陆后用set charactater server database = utf8 或者utf8mb4, 只要重开接入,设置就复原。 只有在/etc/mysql/中的mysql.cnf中的clint/mysqld/mysql字段加入以上设定,重启生效
在[client]下追加 default-character-set=utf8 在[mysqld]下追加 character-set-server=utf8 在[mysql]下追加 default-character-set=utf8
特殊字符
- 用`ry-vue`
create database `ry-vue`;
execute file 执行sql文件
mysql -u root -p xxxx use database; source .../file.sql
remote
alter user 'root'@'localhost' indentified by '110011';
reboot
sudo systemctl restart mysql
Operation
进入数据库
create databese testforjava; use testforjava;
插入表格
create table course(
id int primary key atuo_increment,
kurs_name varchar(50),
kurs_length varchar(50),
teacher varchar(50),
categeory varchar(50)
);
for later version, only works for auto~increment~, not for identity(m,n)
插入值
insert into kurs values(1, 'C++', 23, 'su', 'basic'); insert into kurs values (2, 'Python', 50, 'morvan', 'hard'); insert into kurs values(3, 'CLI', 22, 'su', 'basic');
或者 不完整信息
insert into kurs(id, kurs~name~, categeory) values(4, 'java', 'basic'); (指定属性给值)
查看表格
show tables;
describe course;
编辑表格
alter table course rename kurs; (重命名)
alter table kurs add link varchar(50); (添加属性,列)
alter table kurs drop column link; (将该列删除)
alter table kurs modify teacher varchar(100); (修改该列的属性,增加容量)
alter table kurs change column teacher lecture varchar(100); (修改该列的名称,和属性,)
读取内容
select * from kurs;
select kurs~name~, lecture from kurs;
读取内容时,不重复显示
select distinct lecture from kurs;
高级条件查询
select * from course where course~name~ = 'gnome';
select * from course where course~length~ > 10;
select * from course where lecture='su' and categeory='adv'; (满足这两个要求的) select * from course order by course~length~ desc; (由课程长度有小到大排序) 后面加desc 则反序排序
delete
delete from course where id =2; delete from table where key=value
update
update course set lecture = 'Lee' where id =3;
backup
mysqldump -u root -p kurs > firstForFun.sql; (在root下将kurs数据库备份为FirstForFun.sql)
mysql -u root -p kurs < Firstforfun.sql (将备份文件FirstForFun.sql恢复为kurs数据库)
(此两个语句是在退出sql后的terminal执行的)
Management
user
show databases; use mysql; show tables;
mysqld --skip-grant-tables (开启mysql的无验证登陆,对于遗失密码后) select host,user from user; (查看所有用户)
create user 'cloud'@'%' identified by 'password'; drop user 'root'@'%';
rename user si to shi; (将si重命名为shi) set password = password('new'); (将当前用户密码改为new) set password for si = password(link); (将si用户密码重置为link)
grant all privileges on **.** to 'cloud'@'%' with grant option; flush privileges;
privileges
creat
create user shi identified by 'lining'; grant all privileges on **.** to 'shi'@'%' identified by 'lining' with grant option; flush privileges;
grant all privileges on **.** to 'root'@'%' identified by 'lining';
查询
show grants for 'newuser'@'localhost'
授予
grants 权限列表 on 数据库名.表明 to '用户'@'主机名' grants all on . 'newuser'@'localhost'
撤销
revoke delete on . from 'newuser'@'localhost'
timezone
set global time~zone~ = '+8:00'; ##修改mysql全局时区为北京时间,即我们所在的东8区 set time~zone~ = '+8:00'; ##修改当前会话时区 flush privileges; #立即生效
Operations for SQL
decripation
there can available code to execute, change the dbhost and dbpassword
check the connection in 0812erp
#+name: myweb
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database 0812erp
show tables;
Tables_in_0812erp
bus_customer
bus_goods
bus_inport
bus_outport
bus_provider
bus_sales
bus_salesback
sys_dept
sys_loginfo
sys_menu
sys_notice
sys_role
sys_role_menu
sys_role_user
sys_user
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database 0812erp
SELECT * FROM sys_menu
check the database
#+name: my-query
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser root
#+header: :dbpassword "123456"
#+header: :database testforjava
show tables;
#+RESULTS: my-query
dump database
mysqldump -uroot -p123456 testforjava > ~/Desktop/mysql.sql
delete database
#+name: my-query1
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser root
#+header: :dbpassword "123456"
drop database testforjava;
show databases;
Database
information~schema~ 0812erp mysql performance~schema~ sys
recover testforjava
#+name: my-query2
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser root
#+header: :dbpassword "123456"
create database testforjava;
use testforjava;
source ~/Desktop/mysql.sql
show databases;
Database
information~schema~ 0812erp mysql performance~schema~ sys testforjava
Table creation update delete
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
-- 班级表
CREATE TABLE classe(
id INT PRIMARY KEY auto_increment,
caption VARCHAR(30) COMMENT '班级名'
);
-- 学生表
CREATE TABLE student(
id INT UNSIGNED PRIMARY KEY auto_increment,
student_name CHAR(30) COMMENT '学生名',
gender CHAR(30) DEFAULT NULL COMMENT '学生性别',
class_id INT DEFAULT NULL COMMENT '班级id'
);
-- 老师表
CREATE TABLE teacher(
id INT UNSIGNED PRIMARY KEY auto_increment,
teacher_name CHAR(30) COMMENT '教师名'
);
-- 课程表
CREATE TABLE course(
id INT UNSIGNED PRIMARY KEY auto_increment,
course_name CHAR(30) COMMENT '课程名',
teacher_id INT DEFAULT NULL COMMENT'教师id'
);
-- 成绩表
CREATE TABLE score(
id INT UNSIGNED PRIMARY KEY auto_increment,
number INT DEFAULT NULL COMMENT '分数',
student_id INT DEFAULT NULL COMMENT '学生id',
course_id INT DEFAULT NULL COMMENT '课程id'
);
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
drop table score;
drop table student;
drop table course;
drop table classe;
drop table teacher;
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
INSERT INTO student (student_name, gender, class_id) VALUES ('张三', 'M', 1);
INSERT INTO student (student_name, gender, class_id) VALUES ('李四', 'M', 2);
-- INSERT INTO student (student_name, gender, class_id) VALUES ('王五', 'F', 4);
INSERT INTO classe (caption) VALUES ('一班');
INSERT INTO classe (caption) VALUES ('二班');
INSERT INTO classe (caption) VALUES ('三班');
add foreign key
add foreign key muss be careful, the references must exist, such as -- INSERT INTO student (student~name~, gender, class~id~) VALUES ('王五', 'F', 4); will give error with add foreign key, because there are no such item in classe with id=4!!!!
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
-- ALTER TABLE student DROP FOREIGN KEY student_class;
ALTER TABLE student ADD
CONSTRAINT student_class
FOREIGN KEY (class_id)
REFERENCES classe(id)
ON DELETE CASCADE
ON UPDATE CASCADE;
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
DELETE FROM classe WHERE id=2;
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
UPDATE classe SET id=10 WHERE id=1;
left join
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
select c.caption, s.student_name, s.gender from classe c left join student s on c.id=s.class_id;
right join
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
select c.caption, s.student_name, s.gender from classe c right join student s on c.id=s.class_id;
inner join
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
select c.caption, s.student_name, s.gender from classe c inner join student s on c.id=s.class_id;
full joipn
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
select * from classe left join student on classe.id=student.class_id union select * from classe right join student on classe.id=student.class_id;
many2one
add more students to same class
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
INSERT INTO student (student_name, gender, class_id) VALUES ('张五', 'M', 1);
INSERT INTO student (student_name, gender, class_id) VALUES ('李六', 'M', 2);
INSERT INTO student (student_name, gender, class_id) VALUES ('李七', 'M', 1);
INSERT INTO student (student_name, gender, class_id) VALUES ('李八', 'M', 1);
INSERT INTO student (student_name, gender, class_id) VALUES ('李九', 'M', 1);
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
SELECT c.caption ,COUNT(s.student_name) student_num
FROM classe c LEFT JOIN student s ON c.id=s.class_id
GROUP BY c.id;
#+header: :engine mysql
#+header: :dbhost localhost
#+header: :dbuser cloud
#+header: :dbpassword "password"
#+header: :database tuto
select c.caption , s.student_name, s.gender from classe c left join student s on c.id=s.class_id;
many2many
CREATE TABLE tag(
id INT UNSIGNED PRIMARY KEY auto_increment,
tag_name VARCHAR(50) NOT NULL
)
CREATE TABLE article(
id INT UNSIGNED PRIMARY KEY auto_increment,
title VARCHAR(100) NOT NULL
)
CREATE TABLE tag_article(
id INT UNSIGNED PRIMARY KEY auto_increment,
tag_id INT UNSIGNED DEFAULT NULL,
article_id INT UNSIGNED DEFAULT NULL,
FOREIGN KEY(tag_id) REFERENCES tag(id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(article_id) REFERENCES article(id) ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE(tag_id,article_id)
)
SELECT a.title
FROM article a INNER JOIN tag_article t
ON a.id=t.article_id
WHERE tag_id=1
Operation from the third program language
singal python file connect with mysql
import pymysql
db = pymysql.connect("localhost", "root", "123456", "testforjava")
cursor = db.cursor()
sql = """create table IF NOT EXISTS course(id int, kurs_name varchar(50), kurs_length varchar(50),teacher varchar(50), categeory varchar(50))"""
cursor.execute(sql)
sql = """insert into course values(7, 'CLI', 22, 'su', 'basic')"""
cursor.execute(sql)
sql = """insert into course values(8, 'CLI', 22, 'su', 'basic')"""
cursor.execute(sql)
db.commit()
sql1 = """select * from course"""
cursor.execute(sql1)
results = cursor.fetchall()
print('\n')
for row in results:
num = row[0]
name = row[1]
age = row[2]
right = row[3]
dis = row[4]
print("num is %7s, name is %7s, age is %7s, right is %7s, dis is %7s" %
(num, name, age, right, dis))
# if __name__ == "__main__":
cursor.close()
from pymysql import connect
from pymysql.cursors import DictCursor
class Pymysqlconnection:
def __init__(self):
self.conn = connect(
host='localhost',
port=3306,
user='cloud',
password='password',
database='0812erp'
)
self.cursor = self.conn.cursor(DictCursor)
def __def__(self):
self.cursor.close()
self.conn.close()
def get_item(self):
sql = 'select * from sys_user'
self.cursor.execute(sql)
for temp in self.cursor.fetchall():
print(temp)
if __name__ == '__main__':
pymysqlconnection = Pymysqlconnection()
pymysqlconnection.get_item()
singal java file connect with mysql
import java.sql.*;
public class JavaConnSQL
{
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/testforjava?useSSL=false&serverTimezone=UTC";
static final String USER = "root";
static final String PASS = "123456";
public static void main( String[] args )
{
System.out.println( "Hello World!" );
System.out.println("在dir中生成的代码, 如果dir中有驱动,则可以执行mysql的连接");
System.out.println("提前执行");
System.out.println("export CLASSPATH=mysql-connector-java-8.0.20.jar:. ");
Connection conn = null;
Statement stmt = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
System.out.println(" 实例化Statement对象...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, kurs_name FROM course";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("kurs_name");
// 输出数据
System.out.print("ID: " + id);
System.out.print(", kurs name 站点名称: " + name);
System.out.print("\n");
}
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// 处理 JDBC 错误
se.printStackTrace();
}catch(Exception e){
// 处理 Class.forName 错误
e.printStackTrace();
}
}
}
Footnotes
此后,电脑的root用户将不能登陆,而此时电脑的普通, 用户可以登陆,但是没有设置密码,不能用 -p 登陆