当前位置: 首页 > news >正文

MySQL知识笔记

DATE_ADD(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。多查官方手册!!

命令行启动和停止sql服务

net start  数据库名;      这是启动服务命令; 例如:net  start  Mysql56
net  stop 数据库名;       这是关闭服务命令; 例如:net stop  Mysql56

修改root密码

方法1: 用SET PASSWORD命令
打开命令行cmd,输入mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
方法2:用mysqladmin
打开命令行cmd
mysqladmin -u root password "newpass"
如果root已经设置过密码,采用如下方法
mysqladmin -u root password oldpass "newpass"

导入.sql文件命令:
mysql> SOURCE sql绝对路径;

导入txt数据

LOAD DATA INFILE 'xxx.txt' into table 表名

字段分隔符:
FIELDS TERMINATED BY '/t' ENCLOSED BY '' ESCAPED BY '//'

行终止符:
LINES TERMINATED BY '/n' STARTING BY ''

1. mysql默认使用tab来分割每行的字段。

2.windows下换行符为"\r\n",而mysql在load data时默认使用"\n"来切割每行记录

3.linux下换行符为"\n"

示例:

LOAD DATA INFILE 
'text.txt' 
into table text
FIELDS TERMINATED BY ','  # 字符之间的分隔符为‘,’
lines terminated by '\r\n' STARTING BY ''; # 每行之间的的分隔为换行符

创建一个数据库
使用 create database 语句可完成对数据库的创建, 创建命令的格式如下:

create database 数据库名 [其他选项];

例如我们需要创建一个名为 samp_db 的数据库, 在命令行下执行以下命令:

create database samp_db character set gbk;

为了便于在命令提示符下显示中文, 在创建时通过 character set gbk 将数据库字符编码指定为 gbk。创建成功时会得到 Query OK, 1 row affected(0.02 sec) 的响应。

新建的数据库保存在:C:\ProgramData\MySQL\MySQL Server 5.6\data

创建数据库表
使用 create table 语句可完成对表的创建, create table 的常见形式:
create table 表名称(列声明);
以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) 这些内容:


create table students

id int unsigned not null auto_increment primary key,
name char(8) not null,
sex char(4) not null,
age tinyint unsigned not null,
tel char(13) null default "-"
);

对于一些较长的语句在命令提示符下可能容易输错, 因此我们可以通过任何文本编辑器将语句输入好后保存为 createtable.sql 的文件中, 通过命令提示符下的文件重定向执行执行该脚本。
打开命令提示符, 输入: mysql -D samp_db -u root -p < createtable.sql



(提示: 1.如果连接远程主机请加上 -h 指令; 2. createtable.sql 文件若不在当前工作目录下需指定文件的完整路径。)

查看已创建数据库

使用 show databases; 命令查看已经创建了哪些数据库。

查看表

1. 使用 show tables; 命令可查看已创建了表的名称; 2. 使用 describe 表名; 命令可查看已创建的表的详细信息。

数据操作:

其实我们可以对数据进行的操作也就无非四种,即 CRUD。其中 C 代表添加(Create) ,R 代表查询(Retrieve) ,U 代表更新(Update) ,D 代表删除(Delete) 。

添加数据时用 insert,查询数据时用 select,更新数据时用 update,删除数据时用 delete。

将查询结果插入新表

如果表存在:

INSERT INTO TableA(c1,c2,c3)
SELECT TableB.c1,TableB.c2,TableB.c3
FROM TableB;

或者insert into tab1 select * from tab2; 

如果表不存在: 

create table tab1 as select * from tab2;

向表中插入数据
insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:
insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);
其中 [] 内的内容是可选的

查询表中的数据
select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:
select 列名称 from 表名称 [查询条件];
例如要查询 students 表中所有学生的名字和年龄, 输入语句 select name, age from students; 执行结果如下:
mysql> select name, age from students;
也可以使用通配符 * 查询表中所有的内容, 语句: select * from students;

检索不同的值:

使用DISTINCT关键字,只是数据库只返回不用的值。如:

SELECT DISTINCT vend_id From Products;

DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。

限制结果:

LIMIT指定返回行数,OFFSET指定从第几行开始(第一个被检索的行是第0行)。如:

select prod_name from products limit 5 offset 3;

排序检索数据:

使用ORDER BY [列]子句,以字母顺序排序(默认为A~Z升序)数据,。注:ORDER BY 字句应是SELECT语句中最后一条子句。

select prod_name,prod_price,prod_id from products order by prod_price;

ORDER BY [列1],[列2]...当指定列明有多个时,将按多个列排序,排序按列的先后顺序为主。如:

select prod_name,prod_price,prod_id from products order by prod_price,prod_name;

也可以按列的位置进行排序,如:

select prod_name,prod_price,prod_id from products order by 2,3;

选择降序排列:

ORDER BY [列]+ DESC 如:

select prod_id,prod_name,prod_price from products order by prod_price DESC;

DESC关键字值应用到直接位于其前面的列名。

注:DESC是DESCENDING的缩写,相对应的是ASC(ASCENDING),即升序排序,升序是默认的)

过滤数据

使用WHERE语句,如:

select vend_id, prod_name from products where vend_id <> 'DLL01';

注:!= 和 <> 通常可以互换;如果将值与字符串类型的列进行比较,就需要限定引号。

非空: XX is not null

范围值检查

使用BETWEEN操作符,连个值之间必须用AND关键字分隔,如:

select * from products where prod_price between 3 and 5;

空值检查

用WHERE子句IS NULL,如:

select cust_name from customers where cust_email is null;

高级数据过滤

AND操作符,如:

select prod_id,prod_name,prod_price,vend_id from products where vend_id = 'DLL01' and prod_price<=4;

OR操作符,如:

select prod_name,prod_price from products where vend_id = 'DLL01' or vend_id = 'BRS01';

注:SQL在处理OR操作符前,优先处理AND操作符。为防止错误组合,应使用圆括号对操作符进行明确分组。

IN操作符,用来指定条件范围,范围中的每个条件都可以进行匹配。如:

select prod_name,prod_price from products where prod_price in (3.49,4.99,5.99);

IN最大的优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。

NOT操作符,用于否定其后所跟的任何条件,如:

select prod_name,prod_price,vend_id from products where not vend_id in ('dll01','brs01');

用通配符进行过滤

LIKE操作符,为在搜索子句中使用通配符,必须使用LIKE操作符。

利用通配符,可以创建比较特定数据的搜索模式,通配符搜索只能用于文本字段(串),非文本数据类型字段不能使用通配符

%通配符,在搜索串中,%表示任何字符出现任意次数,%代表搜索模式中给定位置的0个、1个或者多个字符。如:

select prod_name,prod_price from products where prod_name like '%doll%';

如上,通配符可在任意位置使用,且可以使用多个通配符。

注:1、%不能匹配NULL。2、注意文本字段后面所跟的空格。

_通配符,用途与%一样,但它只匹配单个字符,而不是多个

非空

is not null 


按特定条件查询:
where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;
mysql> select name, age from students;

更新表中的数据
update 语句可用来修改表中的数据, 基本的使用形式为:
update 表名称 set 列名称=新值 where 更新条件;

删除表中的数据
delete 语句用于删除表中的数据, 基本用法为:
delete from 表名称 where 删除条件;

alter table 语句

用于创建后对表的修改, 基础用法如下:
添加列
基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置];
示例:
在表的最后追加列 address: alter table students add address char(60);
在名为 age 的列后插入列 birthday: alter table students add birthday date after age;
修改列
基本形式: alter table 表名 change 列名称 列新名称 新数据类型;
示例:
将表 tel 列改名为 telphone: alter table students change tel telphone char(13) default "-";
将 name 列的数据类型改为 char(16): alter table students change name name char(16) not null;
删除列
基本形式: alter table 表名 drop 列名称;
示例:
删除 birthday 列: alter table students drop birthday;
重命名表
基本形式: alter table 表名 rename 新表名;
示例:
重命名 students 表为 workmates: alter table students rename workmates;
删除整张表
基本形式: drop table 表名;
示例: 删除 workmates 表: drop table workmates;

删除整个数据库
基本形式: drop database 数据库名;
示例: 删除 samp_db 数据库: drop database samp_db;

清空整张表

基本形式: TRUNCATE TABLE 表名;

示例: 清空 workmates 表: truncate table workmates;

获取表信息的方法:

SHOW COLUMNS FROM XXX;
DESCRIBE XXX;

其中,SHOW COLUMNS可以添加where语句。

返回表中的列名:

select column_name from information_schema.columns where table_name='XXX';

统计数据

统计个数:select count(*) from 表名

统计某项个数:

四舍五入:

round()

某列求和:

sum()

字符串

字符串连接:

CONCAT函数,CONCAT函数支持一个或者多个参数,参数类型可以为字符串类型也可以是非字符串类型,对于非字符串类型的参数MYSQL将尝试将其转化为字符串类型,CONCAT函数会将所有参数按照参数的顺序拼接成一个字符串做为返回值。

例:select CONCAT('123','456')

输出123456

注:在Mysql中,使用“+”进行字符连接时,mysql会尝试将字段值转换为数字类型(如果转换失败,就当做数字0处理)。如’1abc’+’22′,mysql将“1abc”转成数字1在进行运算;将“abc”当做0处理。 

分割:

SUBSTRING_INDEX(str,delim,count)

返回的子字符串str计数前出现的分隔符DELIM。如果计数是正的,左侧的最后一个分隔符(从左边算起)的一切被返回。如果计数为负,一切向右侧的最后一个分隔符(计数从右侧)将被返回。

例:SELECT SUBSTRING_INDEX('abc.efg', '.', 1); 

输出abc

时间

MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:

DATE - 格式 YYYY-MM-DD

DATETIME - 格式: YYYY-MM-DD HH:MM:SS

TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS

YEAR - 格式 YYYY 或 YY

当前时间:

NOW() 返回当前的日期和时间

CURDATE() 返回当前的日期

CURTIME() 返回当前的时间

例:SELECT NOW(),CURDATE(),CURTIME()  #分别显示当前完整时间,当前日期,具体时间

DATE() 提取日期或日期/时间表达式的日期部分

EXTRACT() 返回日期/时间按的单独部分

DATE_ADD() 给日期添加指定的时间间隔

DATE_SUB() 从日期减去指定的时间间隔

DATE_ADD(date,INTERVAL expr type)

DATE_SUB(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。

type 参数可以是下列值:

Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH

DATEDIFF() 返回两个日期之间的天数

DATEDIFF(date1,date2)

date1 和 date2 参数是合法的日期或日期/时间表达式。

DATE_FORMAT() 用不同的格式显示日期/时间

DATE_FORMAT(date,format)

date 参数是合法的日期。format 规定日期/时间的输出格式。

可以使用的格式有:

格式描述
%a缩写星期名
%b缩写月名
%c月,数值
%D带有英文前缀的月中的天
%d月的天,数值(00-31)
%e月的天,数值(0-31)
%f微秒
%H小时 (00-23)
%h小时 (01-12)
%I小时 (01-12)
%i分钟,数值(00-59)
%j年的天 (001-366)
%k小时 (0-23)
%l小时 (1-12)
%M月名
%m月,数值(00-12)
%pAM 或 PM
%r时间,12-小时(hh:mm:ss AM 或 PM)
%S秒(00-59)
%s秒(00-59)
%T时间, 24-小时 (hh:mm:ss)
%U周 (00-53) 星期日是一周的第一天
%u周 (00-53) 星期一是一周的第一天
%V周 (01-53) 星期日是一周的第一天,与 %X 使用
%v周 (01-53) 星期一是一周的第一天,与 %x 使用
%W星期名
%w周的天 (0=星期日, 6=星期六)
%X年,其中的星期日是周的第一天,4 位,与 %V 使用
%x年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y年,4 位
%y年,2 位

WEEKDAY(date) 

返回date的星期索引(0=星期一,1=星期二, ……6= 星期天):

select WEEKDAY('1997-10-04 22:23:00');
-> 5

联结

SQL最强大的功能之一就是能在数据检索查询的执行中联结表。而联结表是基于关系表。为什么要用联结表呢,将数据分解为多个表能够更有效的存储,更方便的处理,并且具有更大的可伸缩性。

连接类型

分为三种:交叉连接、内连接、外连接。

交叉连接 cross join

没有where子句的交叉连接将产生连接表的笛卡尔积。

select * from R cross join S;

结果:和笛卡尔积一样,如上图。

select * from R cross join S where R.C = S.C;

内连接  

内连接分为三种:自然连接、等值连接、非等值连接。   

自然连接 natural join:在连接条件中使用等于=运算符比较被连接列的列值,但删除连接表中重复列。   select * from R natural join S;

等值连接 :使用等于=比较连接列的列值,在查询结果中列出接连表中的所有列,包括其中的重复列。
select * from R join S where R.C = S.C;或select * from R inner join S where R.C = S.C;
非等值连接 :在连接条件中,可以使用其他比较运算符,比较被连接列的列值,如:<、>、!=等。

外连接 

外连接分为三类:全外连接、左外连接、右外连接。   

左外连接 left join / left outer join   select * from R left join S on R.C = S.C;

左外连接要遍历左表的所有记录,右表没有的用null表示。
右外连接 right join / right outer join
select * from R right join S on R.C = S.C;

右外连接要遍历右表所有的记录,左表没有的用null表示。
全外连接 full join / full outer join
select * from R full join S on R.C = S.C;

存储过程(相当于函数)

我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

MySQL存储过程的调用

用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。

事务处理

一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行。换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的。如果在事务的任何操作失败,则整个事务将失败。

几个术语:

事务(transaction)指一组sql语句;

start transaction;

回退(rollback)指撤销指定SQL语句的过程;

rollback to 保留点;

提交(commit)指将未存储的SQL语句结果写入数据库表;在进行显示提交时,使用commit语句。

保留点(savepoint)指事务处理中设置的临时占位符,可以对它发布回退;

例:

start transaction;
savepoint delete1;
delete from custcopy where cust_id = '1000000006';
commit;
rollback to delete1;

直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0   禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!)

游标

(一),认识游标(cursor)
就是一个可读的标识,用来标识数据取到什么地方了。select 语句也许一次性会取出来n条语句,那么游标便可以一次取出来select中的一条记录。每取出来一条,便向下移动一次!可以实现很复杂逻辑!

注:只能在存储过程里面定义游标,否则将出现ERROR CODE1064错误。
(二),游标特性:1,只读;2,不滚动;3,不敏感的
(三),使用游标
需要强调的是,游标必须在定义处理程序之前被定义,但变量必须在定义游标之前被定义,顺序就是变量定义-游标定义-处理程序
1.定义游标
DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个游标。也可以在子程序中定义多个游标,一个块中的每一个游标必须命名唯一。声明游标后也是单条操作的。
2. 游标OPEN
OPEN cursor_name
这个语句打开先前声明的游标。
3. 游标FETCH
FETCH cursor_name INTO var_name [, var_name] ...
这个语句用指定的打开游标读取下一行(如果有下一行的话),并且前进游标指针至该行。
4. 游标CLOSE
CLOSE cursor_name
这个语句关闭先前打开的游标,注意,用完后必须关闭。

例-将用户名全部输出,中间用分隔符隔开:

drop procedure if exists curdemo;
delimiter //
create procedure curdemo()
beginDECLARE done INT DEFAULT FALSE;declare tmpName varchar(20) default '' ;  declare allName varchar(255) default '' ;  declare custCursor cursor for select cust_name from customers where cust_email is null;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;	-- 设置游标的countinue handleropen custCursor;	   -- 打开游标fetch custCursor into tmpName;while (done = false) doset tmpName = concat(tmpName,";");set allName = concat(allName,tmpName);fetch custCursor into tmpName;end while;close custCursor;select allName;
end;//
delimiter ;
call curdemo();

DELIMITER 分隔符

DELIMITER是分割符的意思。一般用于存储过程前声明分隔符。

因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

使用多重语句需要客户端能发送包含语句定界符;的查询字符串。这个符号在命令行客户端被用delimiter命令来处理。改变查询结尾定界符;(比如改变为//)使得; 可被用在子程序体中。 

总结起来就是因为存储过程里包含很多含缺省界定符号“;”的语句,如果不重新定义界定符的话,就只能以“;”为界定符一句一句的发给Mysql服务端解析。

例:delimiter // -- 指定分隔符为//

查看当前数据库的编码格式:

 mysql>status;或者show variables like 'character%' ;

  上面显示server characterset : 数据库服务器编码格式
Db characterset : 数据库编码格式
Client characterset : 数据库客户端编码格式
Conn. characterset : 数据库连接编码格式
设置编码格式:

set names 'gb2312'
通过set命令只能够设置Db、Client、Conn的编码格式,在设置编码格式过程中,如果不知道当前安装的数据库到底有多少种编码格式那么可以通过show character set;命令显示当前数据库的所有编码格式集合。如果想要修改server的编码格式在我看来只能够重装数据库了(目前还不了解如何去设置), 因为有些时候迫使你不得不去重新安装数据库。


文章转载自:

http://RaZc2R4c.rdkgw.cn
http://mJKKBk7d.rdkgw.cn
http://M4JRB0ue.rdkgw.cn
http://H4vCzbKq.rdkgw.cn
http://cTR3ptow.rdkgw.cn
http://2iVK2T0u.rdkgw.cn
http://8vF8O7yY.rdkgw.cn
http://txRrGMmI.rdkgw.cn
http://ajqiTNz4.rdkgw.cn
http://GuVKSidv.rdkgw.cn
http://Kztsyyug.rdkgw.cn
http://D4GLMnf1.rdkgw.cn
http://eMs16tZR.rdkgw.cn
http://fso3gRfg.rdkgw.cn
http://QzoFAk0T.rdkgw.cn
http://bA19cNlN.rdkgw.cn
http://BVpvqXY4.rdkgw.cn
http://l2bXgyYD.rdkgw.cn
http://5jVF4eEE.rdkgw.cn
http://GydOEfFM.rdkgw.cn
http://IawfwAyG.rdkgw.cn
http://TzsOT84Z.rdkgw.cn
http://GD9XHmwF.rdkgw.cn
http://WO5J1mvJ.rdkgw.cn
http://RsdmQ1Lr.rdkgw.cn
http://mZ6r47Ld.rdkgw.cn
http://NeaCC4af.rdkgw.cn
http://rCBeibBU.rdkgw.cn
http://bttCwm6s.rdkgw.cn
http://MhDhHr6v.rdkgw.cn
http://www.dtcms.com/a/386576.html

相关文章:

  • 《智能传感与信息处理》学习1|相机模型
  • 贪心算法应用:冗余备份节点选择问题详解
  • K8S 分层架构
  • CentOS 清除 已安装MySQL
  • Ubuntu Desktop 22.04.5 LTS 使用默认的 VNC 远程桌面
  • 【脚本注入网页】XSS
  • 设计模式之:备忘录模式
  • 网页抓包怎么做?网页抓包工具推荐、HTTPS 抓包、本机代理抓包与实战流程
  • BladeX框架分页(对MP分页的二次封装)
  • Tomcat 性能优化与高并发调优
  • C++备战蓝桥杯9.13-9.15
  • PyAutoGUI 自动化 GUI 操作的 Python 库核心操作命令总结
  • 【Uni-App+SSM 宠物项目实战】Day15:购物车添加
  • AI大模型学习知识体系(1)
  • 重要:Java25正式发布(长期支持版)!
  • OneTerm开源堡垒机实战(二):快速部署与基本使用
  • 网络问题排查
  • linux之套接字Socket
  • 【Uni-App+SSM 宠物项目实战】Day14:商家服务列表
  • MCP 协议客户端与服务端python demo
  • 【Nginx开荒攻略】从命令到实战:Nginx服务启动、停止与重载完全指南
  • Ubuntu系统中在线安装MySQL到指定目录
  • C++工程实战入门笔记16-智能指针
  • 【深度学习新浪潮】什么是太空算力中心?
  • 容器化部署之dockercompose08
  • 卷积神经网络搭建实战(一)——torch云端的MNIST手写数字识别(全解二)
  • [deepseek]Visual Studio 2022创建和使用DLL教程
  • k8s节点网络失联后会发生什么
  • 3分钟掌握C++/Lua双向通信:一个高性能内核 + N个动态脚本
  • Spring MVC小点