MySql
Mysql常用命令
use [table_schema]
set names utf8 # 设置编码
show databases # 展示所有数据库
show tables # 展示制定数据库的所有表
show columns(index) from [table_name] # 展示制定数据表的列信息(以及主键信息)
show table status [from db_name] [like 'pattern'] [\G] # 输出性能及统计信息,查看表类型(引擎),from 选取库来源,可用正则表达式选取表来源,\G 将按列打印信息
## show table status from mysql like 'mysql%' \G;
exit # 退出
create table(database) [name] [name type]# 创建表或数据库,前者需要制定字段与类型
drop table(database) [name] # 删除数据库或表
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); # 插入新的行,分别指定除了id之外的特定字段与值,如果数据是字符型则必须有引号
INSERT INTO table_name VALUES ( value1, value2,...valueN ); # 插入新的行,默认所有列都添加数据,第一列为主键,若主键自增(PRIMARY KEY AUTO_INCREMENT)则添加0或者null即可
UPDATE [table_name] SET [name]='' [WHERE] # 更新表数据
## UPDATE runoob_tbl SET runoob_title = REPLACE(runoob_title, 'C++', 'Python') where runoob_id = 3; # 批量将C++替换为Python
DELETE FROM [table_name] [WHERE] # 删除表记录,不指定WHERE则删除所有记录
ALTER TABLE [table_name] DROP [name] # 删除表的某个字段
Engine = [engine] # 修改数据表类型
ADD name type [FIRST[AFTER NAME]] # 给表添加字段,FIRST表名字段位置位于首位,AFTER表示在某字段之后
INDEX [index_name] (column_name) # 添加索引,若是添加唯一索引则将INDEX改为UNIQUE
PRIMARY KEY ([field_name]) # 添加主键
RENAME TO [name] # 重命名
ALTER [name] DROP DEFAULT # 删除默认数值
SET DEFAULT [number] # 更改默认数值
-
WHERE BINARY
后面的字符串区分大小写 -
WHERE field LIKE condition
实现模糊匹配,"condition"中"%"表示0个或多个的任意字符,"_"表示单个任意字符,"[]"表示所列字符中的一个,"[^]"表示不在所列字符中的字符。"[]"括起特殊符号可以避免通配符的二义性 -
UNION ALL
会输出重复内容 -
ORDER BY field1 [ASC[DESC]], field2 [ASC]
"ASC"升序,"DESC"降序,默认ASC。按拼音排序时,若使用GBK编码,则直接使用字段排序;若使用UTF-8编码,则需要先转码成GBK再排序SELECT * FROM [table_name] ORDER BY CONVERT(field using gbk)
-
INNER JOIN
mysql> 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; +-------------+-----------------+----------------+ | a.runoob_id | a.runoob_author | b.runoob_count | +-------------+-----------------+----------------+ | 1 | 菜鸟教程 | 10 | | 2 | 菜鸟教程 | 10 | | 3 | RUNOOB.COM | 20 | | 4 | RUNOOB.COM | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.00 sec)
LEFT JOIN
会读取左边数据表的全部数据,即使右边无对应数据 -
NULL值处理运算符
IS NULL #是NULL则返回true IS NOT NULL <=> # 两个值相等或都为NULL时返回true
使用其他比较运算符永远返回NULL
ifnull(columnName2,0)
把 columnName2 中 null 值转为 0 -
ALTER
修改中,MODIFY
只修改字段类型:MODIFY j BIGINT NOT NULL DEFAULT 100;
。CHANGE
同时修改字段名称和类型:CHANGE j j INT;
。 -
字段类型"DECIMAL":
DECIMAL(m,n)
表示浮点数,最大位数为m,小数点右侧的位数最多为n。 -
完整拷贝表:
方法一:先查看被复制表的结构信息:SHOW CREATE TABLE test1 \G;
会得到创建该结构的语句,复制粘贴后创建相同结构的新表(注意改名)。随后将原表内容拷贝至新的表:
INSERT INTO test1 (id,title,content) SELECT id,title,content from test;
方法二:
CREATE TABLE targetTable LIKE sourceTable; INSERT INTO targetTable SELECT * FROM sourceTable;
方法三:
CREATE TABLE targetTable SELECT * FROM sourceTable
-
拷贝表的部分字段:
CREATE TABLE test3 AS( SELECT title,content FROM test2 )
-
服务器元信息:
SELECT VERSION() # 服务器版本 SELECT DATABASE() # 当前数据库名称 SELECT USER() # 当前用户名 SHOW STATUS # 服务器状态 SHOW VARIABLES # 服务器配置信息
-
查询最后的插入表中的自增列的值:
SELECT LAST_INSERT_ID();
-
对自增id重新排列(删除记录会导致不连续):
可以删除字段后重新添加
ALTER TABLE [table_name] DROP id; ALTER TABLE [table_name] ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST; ALTER TABLE [table_name] ADD PRIMARY KEY (id);
新建表时在末尾添加
AUTO_INCREMENT=100
可将初始值定为100,或者使用一下语句:ALTER TABLE [table_name] AUTO_INCREMENT=100;
-
SELECT DISTINCT
自动省略重复数据查询重复数据:
SELECT column_name1,column_name2,count(1) AS COUNT FROM [table_name] GROUP BY column_name1,column_name2 HAVING count>1; # GROUP BY后加括号会有别的意义
-
DESC tableName | Describe tableName
展示表结构 -
select distinct column from tableName
显示表中column字段唯一的值(过滤重复) -
select colA "A", colB "B", colC "c" from tableName
利用 "sql*plus" 语句定制列名 -
select concat(colA, ’, ‘, colB) as alias from tableName
拼接得到colA, colB
作为列的内容,以"alias"为列名展示。要求内部的字符串必须使用单引号', '
-
设置密码:
ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY "123456";
SET PASSWORD FOR 'root'@'localhost' = '123456';
mysqladmin -u root -p password 123456
-
修改表字段顺序:
ALTER TABLE lytable ADD date datetime AFTER userId; ALTER TABLE lytable CHANGER date datetime AFTER userId;
Mysql在PHP中的应用模板
<?php
$dbhost = 'localhost'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('连接失败: ' . mysqli_error($conn));
}
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
if( isset($runoob_count ))
{
$sql = "SELECT runoob_author, runoob_count
FROM runoob_test_tbl
WHERE runoob_count = $runoob_count";
}
else
{
$sql = "SELECT runoob_author, runoob_count
FROM runoob_test_tbl
WHERE runoob_count IS NULL";
}
mysqli_select_db( $conn, 'RUNOOB' );
mysqli_begin_transaction($conn); // 开始事务定义
if(!mysqli_query($conn, "insert into runoob_transaction_test (id) values(8)"))
{
mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚
}
$seq = mysql_insert_id ($conn_id); // 获取最后插入的自增列的值
$count = mysqli_affected_rows ($conn_id); // 读取受影响的记录数量
print ("$count 条数据被影响\n");
mysqli_query($conn, "COMMIT"); //执行成功后提交
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
echo '<h2>菜鸟教程 IS NULL 测试<h2>';
echo '<table border="1"><tr><td>作者</td><td>登陆次数</td></tr>';
while($row = mysqli_fetch_array($retval, MYSQL_ASSOC))
{
echo "<tr>".
"<td>{$row['runoob_author']} </td> ".
"<td>{$row['runoob_count']} </td> ".
"</tr>";
}
echo '</table>';
mysqli_close($conn);
?>
参考:[
]
2022/8/21:今天在安装mysql时出现了问题,记录一下解决过程
问题汇总
问题一:无法启动mysql服务
下载并解压mysql社区版后cd到根目录创建"my.ini"文件
[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=C:\\web\\mysql-8.0.11
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
# datadir=C:\\web\\sqldata
# 允许最大连接数
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
注意里面是有安装目录路径需要设置的,一开始没看到路径出错导致数据库初始化一直不成功,--console
回显中出现许多error。设置好my.ini后安装mysql
.\mysqld --install
.\mysqld install
# 安装mysql,有无--都可
.\mysqld --remove
.\mysqld remove
# 卸载mysql
不知道为什么网上的教程很多命令行都是没有 .\
的,除此之外命令功能基本一致,安装mysql后初始化
.\mysqld --initialize --console
# --console 会输出初始化信息,其中包括数据库的初始密码
.\mysqld --initialize-insecure
# 初始化的同时数据库初始无密码
初始化数据库就是在创建data文件夹,若是步骤出错需要重新初始化,可以手动删除data文件夹再重新初始化(不可以直接初始化,会出现报错),重新初始化可用于重置密码
初始化完毕后启动mysql程序即可,这里本地出现了报错
PS F:\Mysql\mysql-8.0.28-winx64\bin> net start mysql
MySQL 服务正在启动 .
MySQL 服务无法启动。
服务没有报告任何错误。
请键入 NET HELPMSG 3534 以获得更多的帮助。
原因是端口3306被占用了,参考了博客:解决方案
netstat -ano
# 查看进程,根据PID从任务管理器的详情中管理进程
查看本地进程时发现3306端口运行的就是mysql程序,但是那是phpstudy集成的mysql,我忘记关闭了导致端口被其占用,关闭后再次启动mysql任务,成功启动
net start mysql
# 启动mysql
net stop mysql
# 关闭mysql
问题二:同时存在phpstudy的mysql与自己装的mysql,兼容问题
自己装的mysql若是安装了,则phpstudy中的mysql就无法一键启动,前者一旦卸载则后者恢复正常
phpstudy中的mysql分为两种情况,一种是在extension/下手动安装mysql,一种是不做任何手动处理直接一键启动,两种情况互不兼容
进入phpstudy的extensions文件夹中的mysql,使用命令行将mysql安装后,phpstudy将无法一键启动该数据库,但可以使用 net start mysql
启动mysql服务;卸载mysql后phpstudy可正常一键启动,无法使用命令行启动服务。
phpstudy一键启动mysql后,可以在bin目录下使用命令 mysql -u root -p
正常登录并使用mysql
命令行安装mysql只能选择一个版本,且一旦安装则phpstudy无法一键启动mysql服务。
phpstudy 的 mysql 命令行使用需要配置 bin 目录的环境变量(直接在 bin 目录下输入 mysql
可能会提示找不到命令)
问题三:mysql创建表有语法错误
mysql> CREATE TABLE testing(
-> id int not null auto_increment,
-> title varchar(100) not null,
-> primary key ( id ),
-> )ENGINE=InnoDB DEFAULT CHARSET=uft8;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')engine=innodb default charset=utf8' at line 7
选取主键的语句后多了一个逗号,不同于一些高级语言对象中的多个键值对可以挂载逗号,这里多了一个逗号会导致语法错误,删除后即可正常创建数据表
问题四:执行事务回滚无效
方法一:数据库引擎需要更换成InnoDB,在"my.ini"中更改 default-storage-engine=INNODB
,默认是MyISAM,只有InnoDB可以执行事务。修改后重启mysql,然后新建一张表(原来的表是在MyISAM引擎下创建的,仍然不能使用事务),即可执行事务。
方法二:新建表时带上引擎参数:CREATE TABLE test (id int(5)) engine=innodb;
,仅限该表格可执行事务。
参考:[
]
问题五:Install/Remove of the Service Denied!
权限不够进行操作,使用管理员权限打开shell即可
问题六:mysql8安装
mysql8默认开启ssl密码验证,缺少文件时登录会一直失败,需要在ini文件中配置:
[mysqld]
skip-ssl
来跳过ssl认证,或者使用:
mysql -h localhost -u root --ssl-mode=DISABLED
需要指定登录用户为root,否则会有:
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
初始化时带上 --initialize-insecure
即可不带密码初始化,从而直接登录。
进去后 select user,host,plugin from mysql.user;
查看密码策略
若要使用密码登录,上述步骤完成后仍会出现:
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
网上提示修改默认插件:
[mysqld]
# 更改默认密码验证方式为原始方式
default_authentication_plugin=mysql_native_password
实测下来没用。后来发现他可能是在初始化时生效的,只是重启服务是不够的。
问题解释:MySQL:caching_sha2_password快速问答
远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法 不适用于我的情况,一是不用软件连接,而是此时登录不进去无法修改。目前不知道如何解决上述问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具