基本使用
点击新建一个数据库
输入数据库name(不要有中文和空格)输入好后,点击右下角Apply
弹出一个新窗口,然后再点击一次右下角Apply,又弹出最后一个窗口,点击finish,右边栏中就会新增数据库了
然后在新的数据库中创建新的数据表
点击新建一个数据表
然后配置数据表,配置好后点击Apply
其中INT是整数类型 VARCHAR是字符串(括号内是字符串最大长度)
PN :主键,唯一标识
NN:值不允许为空
UQ:值唯一
AI:值自动增长
Default:默认值
右键新建的表,点击Select Rows - limit 1000
SQL编程形式操控数据库
SQL是一门数据库编程语言
使用SQL语言编写出来的代码叫做SQL语句
SQL语言只能在关系型数据库中使用(MySQL,Oracle、SQL Server)
SQL能做什么
(前四个是重点)
从数据库中查询数据
向数据库中插入新的数据
更新数据库中的数据
从数据库删除数据
创建新数据库
在数据库中创建新表
可以再数据库中创建存储过程、视图、……
查询使用语句总览
-- 查询
-- 通过 * 把users表中所有的列查询出来
select * from users
-- 从user表中把username 和 userpassword对应的数据查询出来
select username,userpassword from users
-- 插入
INSERT INTO 【表名称】 (指定列1,指定列2) values ('数据一','数据二')
-- 向users表中,插入新数据
insert into users (username,userpassword) values ('newword','508242')
-- 更改
-- 将id为4的用户的密码,更改成'888888'
update users set userpassword='888888' where id=4
-- 删除
-- 删除users表中zs的所有数据
delete from users where username='zs'
-- 排序
select * from users order by userid desc; -- 按照userid降序排序
-- 计数
select count(*) from users where userid>=10;
-- 计数id大于等于10的有多少个
SELECT语句
SELECT语句用于从表中查询数据。执行的结果被存储在一个结果表中(成为结果集)。
(通常用于表中数据更改后,查询结果)
语法格式如下:
-- 这是注释
-- 从FROM指定的【表中】,查询出【所有的】数据。*表示【所有列】
SELECT * FROM 表名称
-- 从FROM指定的【表中】,查询出【指定列名称】的数据,多个列名称可以用逗号隔开
SELECT 列名称 FROM 表名称
-- 关键字不区分大小写,可以用from select 但是表名称列名称这些数据是要区分大小写的。
使用示例:
-- 通过 * 把users表中所有的列查询出来
select * from users
-- 从user表中把username 和 userpassword对应的数据查询出来
select username,userpassword from users
INSERT INTO语句
INSERT INTO语句用于向指定表的指定列插入数据
语法:
INSERT INTO 【表名称】 (指定列1,指定列2) values ('数据一','数据二')
使用示例(该操作会想表中插入一个
username:‘newword’ ,
userpassword:’508242’
数据
-- 向users表中,插入新数据
insert into users (username,userpassword) values ('newword','508242')
UPDATA语句
UPDATA语句用于更改指定表中指定行的指定列数据
语法:(更新某一行中的某一列)
UPDATA 【表名称】 set 【指定列】=数据 where 【指定行的条件】
示例
-- 将id为4的用户的密码,更改成'888888'
update users set userpassword='888888' where id=4
-- 将username为‘zs'的用户密码,更改成'999999'
update users set userpassword='999999'where username='zs'
语法:(更新某一行中的若干列)
UPDATA 【表名称】 set 【指定列】=数据,【指定列】=数据 where 【指定行的条件】
示例
-- 将username='ls'的行数据中的密码改为'admin123’,状态改为'1'
update users set userpassword='admin123',userstatus=1 where username='ls'
## DELETE语句
DELETE语句用于删除指定行数据
语法:
```sql
DELETE FROM 【表名称】 where 【指定行的条件】
示例:
DELETE语句
DELETE语句用于删除指定行数据
语法:
DELETE FROM 【表名称】 where 【指定行的条件】
示例:
WHERE子句
AND和OR运算符
用于where子句中的多条件判断
select * from users where userid=3 or userid=5
安全模式和非安全模式
在 MySQL 数据库中,安全模式(safe update mode)和非安全模式主要在数据修改操作(UPDATE
和DELETE
)的执行规则上存在明显区别:
安全模式
- 开启方式:默认情况下,MySQL 可能会开启安全模式。可以通过配置文件(如
my.cnf
或my.ini
,在[mysqld]
组下添加sql_safe_updates=1
)设置,也能在会话中使用SET SQL_SAFE_UPDATES = 1;
开启。 - 数据修改限制
- UPDATE 操作:如果
UPDATE
语句中没有使用WHERE
子句,或者WHERE
子句里没有使用主键(primary key) 、唯一索引(unique index) 等能明确限定记录唯一性的条件, 该语句会被阻止执行。比如UPDATE users SET username = 'new_name';
(未指定具体修改哪条记录 ),以及UPDATE users SET username = 'new_name' WHERE age = 25;
(age
不是主键或唯一索引,无法精准定位记录 ),这两种情况在安全模式下都会报错。 - DELETE 操作: 与
UPDATE
类似,当DELETE
语句没有WHERE
子句,或者WHERE
子句没有基于主键、唯一索引等能唯一标识记录的条件,也会被禁止执行。像DELETE FROM users;
(删除整张表数据,没有条件限制 ),以及DELETE FROM users WHERE gender = 'Male';
(gender
不是主键或唯一索引 ),在安全模式下都会报错。
- UPDATE 操作:如果
- 优势:能有效防止因误操作导致的大量数据被意外修改或删除,降低数据丢失或错误修改的风险, 保障数据的安全性和完整性,尤其适合对数据安全性要求较高的生产环境。
- 劣势:在一些需要批量修改数据,且条件不是基于主键或唯一索引的场景下,会增加操作的复杂性,需要仔细调整 SQL 语句以符合安全模式的规则。
非安全模式
- 开启方式:通过配置文件设置
sql_safe_updates=0
,或者在会话中执行SET SQL_SAFE_UPDATES = 0;
来关闭安全模式。 - 数据修改限制:对于
UPDATE
和DELETE
操作,没有上述基于WHERE
子句条件的严格限制。即使WHERE
子句没有使用主键、唯一索引,或者没有WHERE
子句,语句也会正常执行。 例如UPDATE users SET password = 'new_password';
(会修改users
表中所有记录的密码 ),DELETE FROM users WHERE score < 60;
(只要满足score < 60
,无论记录是否能被唯一标识,都会删除 )。 - 优势:在进行一些快速的数据调整,或者开发、测试环境中,方便快速地执行数据修改操作, 不需要过于复杂的条件构造。
- 劣势:一旦 SQL 语句编写错误,很容易导致大量数据被错误修改或删除,造成数据丢失或业务影响, 所以在生产环境使用时需要非常谨慎。
临时关闭安全模式
SET SQL_SAFE_UPDATES = 0; -- 在当前会话中关闭安全模式
举例
直接删去条件不是基于唯一索引或者主键的行数据的话是会被报错阻止的
SET SQL_SAFE_UPDATES = 0;-- 在当前会话中关闭安全模式
delete from users where userpassword='508242' -- 此时会将密码为‘508242’的所有用户删去
ORDER BY排序
order by 语句用于排序
语法:
select 【行名称】 from 【表名称】 order by 【排序的索引】 asc;
-- asc是升序排列,升序排列时asc可省去,默认为升序排列 desc为降序排列
示例
COUNT(*)函数
该函数用于计数满足指定条件的行数
select count(*) from users where userid>=10;
-- 计数id大于等于10的有多少个
AS别名
1. 列别名
-- 给列取别名,简化显示
SELECT
user_id AS 编号,
username AS 用户名,
age + 1 AS 明年年龄 -- 表达式别名
FROM users;
解释:查询结果中,user_id
显示为 “编号”,username
显示为 “用户名”,年龄 + 1 的结果显示为 “明年年龄”。
2. 表别名
-- 多表查询时简化表名引用
SELECT
u.username,
o.order_id
FROM users AS u
JOIN orders AS o ON u.id = o.user_id;
核心作用:
- 简化名称,提升 SQL 可读性
- 为计算结果 / 表达式命名
- 多表查询(尤其自连接)中区分同表的不同引用
AS
可省略(如username 用户名
),但保留更规范。
express中模块操作MySQL
配置模块
首先在express项目中安装MySQL模块
npm i mysql
然后如下步骤
const mysql = require('mysql') //导入模块
const laolongsql = mysql.createPool({
host:'127.0.0.1', //数据库的ip地址
user:'root', //登录数据库的账号
password:'ws5082425821', //登录数据库的密码
database:'laolong_sql', //指定操作哪个数据库
})
测试是否成功连接
//测试 MySQL 模块是否能正常工作
laolongsql.query('select 1',(err,results)=>{
//mysql模块工作期间报错了
if(err) return console.log(err.message)
//能够成功的执行SQL语句,打印出[ RowDataPacket { '1': 1 } ]
console.log(results)
})
正确执行的控制台打印:[ RowDataPacket { ‘1’: 1 } ]
查询数据
//查询users表中的所有的数据
const sqlStr = 'select * from users' //注意:如果执行的是select查询语句,则执行的结果results是数组。
laolongsql.query(sqlStr,(err,results)=>{
//查询数据失败
if(err) return console.log(err.message)
//查询数据成功
console.log(results) //查询到的results是一个对象数组。
})
其中该语句用来配置对数据库使用的指令,语法遵循SQL语法。
const sqlStr = 'select * from users' //使用所有SQL中所有select查询语句
插入数据
//定义新增数据
const user = {username:'GGB',userpassword:'ggb123'} //先配置插入的数据对象
//定义执行的 SQL 语句
const sqlStr = 'insert into users (username,userpassword) value (?,?)' //配置指令,预留出?占位数据
//执行 SQL 语句
laolongsql.query(sqlStr,[user.username,user.userpassword],(err,results)=>{ //插入数据
//执行SQL语句失败时
if(err) return console.log(err.message)
//执行SQL语句成功
if(results.affectedRows===1)
console.log('插入数据成功');
//如果执行的是insert into 插入语句,则results是一个对象
//可以通过affectedRows属性,来判断是否插入数据成功
})
如果执行成功,则打印插入数据成功,重新查询一下,可以看到新增的数据。
如果重复执行则会报错,因为数据库中已经存在该数据,
则会返回err信息ER_DUP_ENTRY: Duplicate entry ‘GGB1’ for key 'users.username_UNIQUE
这种插入数据的方法,不仅要编写对象,还要使用数组罗列出每个属性,如果数据属性很多的时候就相当费力,
更方便的插入数据的方法
//定义新增数据
const user = {username:'熊二',userpassword:'acfm123'}
//定义执行的 SQL 语句
const sqlStr = 'insert into users set ?' //前三个词不变,后面使用一个SET?就行
//执行 SQL 语句
laolongsql.query(sqlStr,user,(err,results)=>{ //原本的数组直接把对象放里面就行
//执行SQL语句失败时
if(err) return console.log(err.message)
//执行SQL语句成功
if(results.affectedRows===1)
console.log('插入数据成功');
//如果执行的是insert into 插入语句,则results是一个对象
//可以通过affectedRows属性,来判断是否插入数据成功
})
更新数据
//更新用户信息
const user = {userid:8,username:'光头强',userpassword:'aks123'}
//定义sql语句
const sqlStr = 'update users set username=?,userpassword=? where userid=?'
//执行SQL语句
laolongsql.query(sqlStr,[user.username,user.userpassword,user.userid],(err,results)=>{
if(err)return console.log(err.message)
if(results.affectedRows === 1){
console.log('更新成功')
}
})//更新数据同样也有简便的
更方便的更新数据的方法
const user = {userid:19,username:'毛毛',userpassword:'cxj123'}
//定义sql语句
const sqlStr = 'update users set ? where userid=?'
//执行SQL语句
laolongsql.query(sqlStr,[user,user.userid],(err,results)=>{ //数组包含对象和id属性
if(err)return console.log(err.message)
if(results.affectedRows === 1){
console.log('更新成功')
}
})
删除数据
//删除id为14的用户
const sqlStr = 'delete from users where userid=?'
//执行SQL语句
laolongsql.query(sqlStr,14,(err,results)=>{
if(err)return console.log(err.message)
if(results.affectedRows === 1){
console.log('删除id为5的数据成功')
}
})
该步操作是真的会把数据彻底删除,这是不安全的,如果操作失误或者定义范围错误,错删了某些重要数据,这是非常严重的后果,
所以推荐软删除来代替硬删除,所谓软删除就是执行删除操作时,实际上只是执行更新指定数据status状态,该状态属性决定该数据是否被使用等,并非真的删除数据。