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
这个语句声明一个游标。也可以在子程序中定义多个游标,一个块中的每一个游标必须命名唯一。声明游标后也是单条操作的。
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的编码格式在我看来只能够重装数据库了(目前还不了解如何去设置), 因为有些时候迫使你不得不去重新安装数据库。