一、数据库操作
# 1.登录数据库客户端
mysql -uroot -p
Enter password: ****
# 2.查看所有的库
show databases;
# 3.新建一个库
create database 库名 charset utf8;
# 4.进入数据库
use 库名;
# 5.查看所有的表
show tables;
# 6.创建一张表
create table 表名 (字段名 类型, 字段名, 类型, .....);
# 7.查看一下表结构
desc 表名;
# 8.查看当前在哪个数据库下:
select database();
# 9.删除表
drop table 表名;
# 10.删除库
drop database 库名;
二、SQL增删改查
1、添加语句
insert into 表 (要插入字段) values (数据)
-
说明:主键列是自动增长,但是在全列插入时需要占位,通常使用空值(0或者null) ; 字段默认值 default 来占位,插入成功后以实际数据为准
-
全列插入:值的顺序与表结构字段的顺序完全一一对应 案例: INSERT INTO student (NAME,age,phone) VALUE ("张三",19,"190778866") INSERT INTO student (ID,NAME,age,phone) (5,"李四",19,"190778866"); INSERT INTO student VALUE (NULL,"王五",19,"190778866");
-
SQL语句实现批量
方法1:使用多条语句插入
方法2:使用SQL自带批量插入
INSERT INTO student (NAME,age,phone) VALUES ("张飞",33,"190778866"),("关羽",36,"190778866"),("刘备",38,"190778866")
2、修改语句
update 表 set 字段=值 where 条件
UPDATE student SET NAME="张翼德" WHERE NAME="张飞"
3、删除语句
delete from 表 where 条件
DELETE FROM student WHERE NAME="张三"
逻辑删除与物理删除
例如我们生活中的 删帖、拉黑人 都是 逻辑删除,不是真的 在数据库中删除。
给一个已经存在的表 添加一个新字段
ALTER TABLE student ADD isdel BOOLEAN
逻辑拉黑 叫刘备的
UPDATE student SET isdel=TRUE WHERE NAME='刘备'
4、查询语句
-
简单查询
SELECT * FROM student # 指定 查询结果有哪些字段 SELECT NAME,age FROM student
-
起别名
我们可以给 字段 或者 表 起别名,使用as语句
当然 as是可以省略的
SELECT NAME 姓名,age 年龄 FROM student SELECT NAME AS 姓名,age AS 年龄 FROM student SELECT id,student.name 姓名,student.age 年龄 FROM student
-
去重
对查询的结果去重,如果有完全一样的 就去掉重复的
SELECT DISTINCT NAME FROM student
-
聚合函数
SELECT COUNT(*) 总计 FROM student
聚合函数 是对结果进行操作
sum 求和
count 统计记录数
max 求最大值
min 求最小值
avg 求平均值
三、条件查询
1、条件表达式
我们可以根据条件来查询表,找出符合条件的数据记录。
条件表达式:
比较表达式
模糊查询
范围查询
判空查询
逻辑表达式:对多条 表达式进行组合
-
比较表达式
等于= 大于> 小于 < 不等于!=、>= <=
SELECT * FROM student WHERE age>=30
-
范围表达式
类似于枚举,列举出具体的值 in 表达式 表示 是否在这些选项中
SELECT * FROM student WHERE age IN (38,33,30)
连续范围、一段数据 可以使用 between ... and ...表示在一个连续的范围内
SELECT * FROM student WHERE age BETWEEN 30 AND 40
-
模拟查询表达式
如果 数据表数据 不是太多,
%表示任意多个任意字符 _表示一个任意字符
案例:
# 可以查询到张开头的所有学生 SELECT * FROM student WHERE NAME LIKE '张%' # 只能查询到张三 SELECT * FROM student WHERE NAME LIKE '张_'
-
判断是否为空
注意:null与''是不同的 判空is null
案例:
# 判断手机号为空的学生 SELECT * FROM student WHERE phone='' SELECT * FROM student WHERE phone IS NULL
2、排序
查找在30到40之间的所有学生,并进行降序排列
SELECT * FROM student WHERE age BETWEEN 30 AND 40 ORDER BY age DESC
desc 代表降序
asc 升序 这个是默认排序方式
3、分页
select * from 表 limit offset,num
查询一条语句,从 哪里offset开始查 查几条num
SELECT * FROM student LIMIT 2,3 表示偏移量是2 查询 3条记录 从第三条记录开始查 查询三条记录 我一页 3条记录 我要查询第n页数据 select * from student limit (n-1)*3,3 limit 0,3 limit 3,3 limit 6,3
4、分组
我们使用分组可以做一些集合类的相关业务,
例如,有一个学生表, 有姓名、年龄 等 我们可以统计出 每个年龄的 学生数
SELECT COUNT(NAME),age FROM student GROUP BY age;
如果想查看 每个年龄的具体姓名,我们需要借助于 group_concat(name) 来完成
SELECT GROUP_CONCAT(NAME),age FROM student GROUP BY age;
-
分组中使用 having
having 条件表达式:用来过滤分组结果。
having作用和where类似,但having只能用于group by 而where是用来过滤表数据
SELECT GROUP_CONCAT(NAME),age FROM student GROUP BY age HAVING age>30;
从分组结果中 在筛选出 年龄 大于30的记录
5、子查询
在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句
外部那个select语句则称为主查询。
子查询 先执行,查询的结果 作为 主查询的条件
案例:
查询 年龄大于 平均值的所有学生
分析:
明显需要知道平均年龄,然后 在进行查询,平均年龄也是需要查询后才知道的
SELECT * FROM student WHERE age > (SELECT AVG(age) FROM student);
四、多表查询
1、外键
创建一个 学生表 、图书表,图书属于学生
CREATE TABLE Book( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), stu_id INT , FOREIGN KEY(stu_id) REFERENCES student(id) )
我们查询 图书所属的 学生信息
select Book.name,student.name from Book left join student on Book.stu_id=student.id
2、多对多
CREATE TABLE Course( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10) ) CREATE TABLE SelectCourse( id INT PRIMARY KEY AUTO_INCREMENT, sid INT, cid INT, FOREIGN KEY(sid) REFERENCES student(id), FOREIGN KEY(cid) REFERENCES Course(id) )
学生表、课程表、选课表
使用内连接,inner join
没有选课的 学生 不展示,这个就需要使用内连接,屏蔽掉没有选课的学生和没有被人选的课程。
SELECT s.name,c.name FROM student s INNER JOIN SelectCourse ON sid=s.id INNER JOIN Course c ON c.id=cid
补充点
防火墙 是根据端口号来拦截的,
查看 目前防火墙 放行了哪些端口
firewall-cmd --list-all
添加开发端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent # 注意重启防火墙 systemctl restart firewalld