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)
%p AM 或 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

这个语句声明一个游标。也可以在子程序中定义多个游标,一个块中的每一个游标必须命名唯一。声明游标后也是单条操作的。

  1. 游标OPEN

OPEN cursor_name

这个语句打开先前声明的游标。

  1. 游标FETCH

FETCH cursor_name INTO var_name [, var_name] ...

这个语句用指定的打开游标读取下一行(如果有下一行的话),并且前进游标指针至该行。

  1. 游标CLOSE

CLOSE cursor_name

这个语句关闭先前打开的游标,注意,用完后必须关闭。

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

sql 复制代码
drop procedure if exists curdemo;
delimiter //
create procedure curdemo()
begin
	DECLARE 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 handler
 	open custCursor;	   -- 打开游标
    fetch custCursor into tmpName;
    while (done = false) do
		set 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的编码格式在我看来只能够重装数据库了(目前还不了解如何去设置), 因为有些时候迫使你不得不去重新安装数据库。

相关推荐
牛奶咖啡133 小时前
关系数据库MySQL的常用基础命令详解实战
数据库·mysql·本地远程连接到mysql·创建mysql用户和密码·修改mysql用户的密码·设置mysql密码的使用期限·设置和移除mysql用户的权限
古译汉书3 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
没有bug.的程序员4 小时前
MVCC(多版本并发控制):InnoDB 高并发的核心技术
java·大数据·数据库·mysql·mvcc
2301_800050995 小时前
DNS 服务器
linux·运维·笔记
汇能感知5 小时前
光谱相机的未来趋势
经验分享·笔记·科技
什么半岛铁盒6 小时前
C++项目:仿muduo库高并发服务器-------Channel模块实现
linux·服务器·数据库·c++·mysql·ubuntu
Java-xy²7 小时前
AlmaLinux release 9.6服务器离线安装MySQL8.0.27详细步骤
运维·服务器·adb
muxin-始终如一7 小时前
MySQL与Redis面试问题详解
数据库·redis·mysql
风已经起了8 小时前
FPGA学习笔记——图像处理之对比度调节(直方图均衡化)
图像处理·笔记·学习·fpga开发·fpga