环境如下:
腾讯云 ubuntu18.04
mysql Ver 14.14 Distrib 5.7.37
文章目录
1. 安装
# 首先更新软件包
sudo apt-get update
# 安装最新的mysql
sudo apt-get install mysql-server
2. 初始化配置
sudo mysql_secure_installation
引用该博主对各项配置的描述:Ubuntu18.04安装MySQL教程
依次按照需求选择即可
注意这里对root用户设置的密码,我虽然在初始化配置时已经设置,但是好像没起作用,在第三步重置密码之后可以正常用自己设置的密码登录。
3. 首次登录设置密码
引用该博主的方法:ubuntu18.04 首次登录mysql未设置密码或忘记密码解决方法
记录win10下连接本地mysql8的过程
Windows10安装mysql8.0教程
Win10下Mysql8忘记密码,登录及修改Mysql密码
均亲测有效
workbench8汉化文件
汉化教程
汉化文件下载地址
(打开下载地址之后在本地新建main_menu.xml,然后将网站的内容全部复制进去即可)
4. mysql常用命令
sudo service mysql start # 启动mysql
sudo service mysql stop # 停止mysql
sudo service mysql restart # 重启mysql
mysql -u root -p # 以root身份进入mysql,之后输入密码即可进入mysql
# mysql语句
create database practice; # 创建名为practice的数据库
show databases; # 显示mysql中所有数据库
select database(); # 查看当前正在使用的数据库
use practice; # 选择名为practice的数据库
## 建表
CREATE TABLE table_name (column_name column_type);
# 创建一个名为tb1的表,属性有id(int),title(varchar),author(varchar),submission_data(data)
# 设置主键为id
# NOT NULL 表示不可为空
mysql> create table tb1(
-> id INT NOT NULL ,
-> title VARCHAR(100) NOT NULL,
-> author VARCHAR(40) NOT NULL,
-> submission_data DATE,
-> primary key (id)
-> );
show tables; # 显示practice中所有表
desc tb1; # 以二维表格的形式显示tb1的详细信息
drop table tb1; # 删除名为tb1的数据表
## 插入一个实例(即一条数据行), 也可以省略field,直接写values及后面的数据
INSERT INTO table_name VALUES ( value1, value2,...valueN );
# 创建带主键和外键约束的表
CREATE TABLE student_course(
student_id CHAR (9),
course_id CHAR (9),
score INT CHECK (score BETWEEN 0 AND 100) DEFAULT 0,
primary key(student_id,course_id),
foreign key (student_id) references Student(id),
foreign key (course_id) references Course(id)
);
# 建表后再添加外键约束
ALTER TABLE student ADD FOREIGN KEY (s_cid) REFERENCES class(cid);
# 删除名为tablename的表
drop table tablename;
# 查看名为teacher的表
select * from teacher
# 向名为teacher的表中插入一条数据(记得字符串类型要用''包起来)
insert into teacher values(14002, 'Crick','Biology', 72000);
# 从名为teacher的表中删除trid=14002的一条数据
delete from teacher where trid=14002;
# 将teacher表中的数据条按照trid这个属性升序排列 | DESC是降序排列
select * from teacher order by trid ASC;
# 修改名为course的表中dept属性的varchar类型的数据长度
alter table course modify dept varchar(15);
# 更新course表中cid='C5'该行中teacher字段的数据为'Wen'
update course set teacher='Wen' where cid='C5'
# 从teacher这张表中选出属性名为dept的这一列的数据并去重
select distinct dept from teacher;
# 截取字符串sname的左三个字符
select sid, sname, age from student where left(sname, 3)='Liu';
# max函数与min函数
select max(grade) from sc where cid='C1';
设置主键自增长
mysql> CREATE TABLE member(
-> member_id INT(4) PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(25) NOT NULL
-> );
上述语句执行成功后,会创建名为 member的数据表。其中,member_id 为主键,每插入一条新记录,member_id 的值就会在前一条记录的基础上自动加 1。name 为非空字段,该字段的值不能为空值(NULL)。
向 member表中插入数据,这里不用提供主键,主键自增,SQL 语句如下所示:
INSERT INTO member(name) VALUES('wyj'), ('kkk'), ('hhh');
5. 注意点
已知student表、course表、sc表(记录学生学习课程情况)如下:
① group by的使用
参考语法
group by主要结合合计函数进行使用,比如sum、count、avg
(计算平均值)
如果仅仅使用group by或者仅仅使用后面统计函数都会报错或者出现不正确的结果
② case语句的使用
考虑题目:
在teacher表中,为工资低于或等于70000的教师增长10%的工资,为工资高于70000的教师增长5%的工资。
此处如果使用两次选择进行更新,那么第二次选择会受到第一次的影响。而使用case语句可以同时更新两种条件选出的教师,而不会受先后顺序的影响。
对应的SQL语句:
update teacher set salary=case
when salary<=7000 then salary*1.1
else salary*1.05
end;
③ 字符串截取
考虑题目:
查询所有姓liu的学生的学号、姓名和年龄;(姓名诸如liu yu)
要匹配liu姓,那么就要将sname这个字段的左边三个字符截取出来进行匹配,用到left(sname,3)
函数。
SQL语句:
select sid, sname, age from student where left(sname, 3)=’Liu’;
④ 几种连接的使用
- 内连接
- 等值连接:在连接条件中**使用等于号(=)**运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
- 不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。【还未使用过】
- 自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
也可以用A natural join B
- 外连接
- 左外连接:保留左边表所有的元组以及两张表中相同属性下取值相同的元组
使用A left join B using(sid)
指定连接项
或者A naural left join B
- 右外连接:保留右边表所有的元组以及两张表中相同属性下取值相同的元组
- 交叉连接【待补充】
考虑题目:
基于表student、SC和course,查看到计算机系CS的每位学生所选课程的所有信息,包括学生姓名、所在系、课程名称、课程学分的情况。
SQL语句:
select sname, temp.dept, cname, credits from(
select * from(
select sid, sname from student as a where a.dept='CS')
left join sc using(sid)
left join course using(cid)) as temp;
解释:
首先最内层的select选出student中所有dept为CS的,得到一张临时表X
select sid, sname from student as a where a.dept='CS'
将X表基于sid与sc进行左连接,得到所有选课了的CS学生的临时表Y
left join sc using(sid)
再将Y表基于cid进行左连接得到所有的课程信息表,命名为temp
left join course using(cid)) as temp;
最后是最外层的select,从temp中选出要求的四个字段。
select sname, temp.dept, cname, credits from(
(以上代码可能写的有冗余,但是以目前我的理解,以不省略的语法写出)
⑤ 临时表的命名
考虑题目:
学生只能选择自己学院开设的课程。发现CS学院有的同学选择了其他学院开设的课程。在SC表中删除这些错选的记录。
这里因为要进行几次连接,得到比较多的中间临时表,而我又想从临时表中select数据,如何命名临时表呢?
经过思考尝试之后,可以用as name
进行命名,规则就是select xxx, temp.xx from (口) as temp
口代表任何select和连接等操作,那么每个select后的from(),括号中的这个临时表可以用temp来命名。
上述题目SQL语句为:
delete from sc where cid=(select temp.cid from(select * from(select sid from student as a where a.dept='CS') left join sc using(sid) left join course using(cid)) as temp where temp.dept<>'CS')
and
sid=(select temp.sid from(select * from(select sid from student as a where a.dept='CS') left join sc using(sid) left join course using(cid)) as temp where temp.dept<>'CS');
此这里进行拆解
①选出所有student中dept为CS的学生;
select * from student as a where a.dept='CS'
②从这些学生中仅仅选出sid,得到只包含sid的临时表,临时表与sc基于sid进行左连接得到CS学生选的所有课,再将该表基于cid和course左连接得到选的这些课的信息;
select * from(select sid from student as a where a.dept='CS') as temp left join sc using(sid) left join course using(cid);
③将该临时表命名为temp2,从temp2中选出非CS的课程;
select * from(select * from(select sid from student as a where a.dept='CS') as temp left join sc using(sid) left join course using(cid)) as temp2 where temp2.dept<>'CS';
④该课程的信息已经得到,下面用delete语句从sc表中删除该行数据。注意不能仅仅只用cid或者sid标识该行,因为可能还有该课程号或者学生号与该行相同,会误删。所以用and语句将两个条件连接一下就能唯一指定该行数据。
delete from sc where cid=(select temp2.cid from(select * from(select sid from student as a where a.dept='CS') as temp left join sc using(sid) left join course using(cid)) as temp2 where temp2.dept<>'CS')
and
sid=(select temp2.sid from(select * from(select sid from student as a where a.dept='CS') as temp left join sc using(sid) left join course using(cid)) as temp2 where temp2.dept<>'CS');
上面可以省略第一个temp表,就得到最开始的SQL语句。
⑥ delete语句的使用
语法例如:delete from teacher where trid=14002;
上一道题注意一个问题,因为筛选出来最后要删除的只有一行数据,但是如果有多行数据就会报错。原因是where后面的条件,即cid=(口)只能接受口中一个返回值,不能有多个