update: 2013-08-11, 笔记录了一半不到,还没码完….>< update: 2013-11-23, DONEmysql速查

参考: Mysql必知必会,网络blog, stackoverflow

注; 基础部分sql参考 《mysql必知必会》, 还不错的一本书,菜鸟入门级,需要的话可以入手

在浏览器中使用查找

寻找一个好的mysql开源gui工具

环境配置

ubuntu安装mysql

sudo apt-get install mysql-server mysql-client
netstat -nltp | grep mysql
配置文件 /etc/mysql/my.conf

基本概念

数据库基础:

InnoDB是一个可靠地事务处理引擎,不支持全文本搜索
MyISAM是一个性能极高的引擎,支持全文本搜索,不支持事务处理

数据库-database

保存有组织的数据的容器(通常是一个文件或一组文件)

表-table

某种特定类型数据的结构化清单

模式-schema

关于数据库和表的布局及特性的信息

列-column

表中的一个字段,所有表都是由一个或多个列组成的

数据类型-datatype

所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据

行-row

表中的一个记录

主键-primary key

一列或一组列,其值能够唯一区分表中的每个行

mysql命令行

进入

输入: mysql
或者 mysql -u ken
mysql -u ken -p -h myserver -P 9999 【给出用户名,主机名,端口】 获取帮助: mysql --help

命令格式和说明:

1.命令必须;或\g结束,仅Enter不执行明林
2.help 或\h获得帮助
3.quit或exit退出

可以用GUI工具

MySQL Administrator
MySQL Query Browser

USE

创建库:

>CREATE DATABASE MYSQLDATA

使用某个库

use db_name

SHOW

查看所有数据库

show databases;

列出库中所有表

use db_name;
show tables;

列出表的所有列信息

show columns from table_name;
or
desc table_name;

显示创建的sql语句

show create database db_name;
show create table table_name;

其他

show status  服务器状态信息
show grants 显示授权用户
show errors/show warnings 显示服务器错误或警告信息

查询

SELECT子句顺序

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT

SELECT

检索单个列

>SELECT col FROM tb_name;

多个列

>SELECT col1, col2
FROM tb_name

检索所有列

>SELECT *
FROM tb_name;
#除非确认要用到所有列

检索去重

>SELECT DISTINCT col
FROM tb_name

限制结果数

>SELECT col1
FROM tb_name
LIMIT 5;
返回不多于五行 >SELECT col1
FROM tb_name
LIMIT 5, 5
第一个为开始位置,初始为0.第二个为显示个数
等价于LIMIT 5 OFFSET 5

ORDER BY

按某个字段排序

>SELECT col1
FROM tb_name
ORDER BY col1

按多列排序

>SELECT col1, col2, col3
FROM tb_name
ORDER BY col1, col2

指定排序方向(升序降序)

>SELECT col1, col2
FROM tb_name
ORDER BY col1 DESC;【默认ASC】
注意:如果想在多个列上排序,必须对每个列使用DESC
注意:ORDER BY必须放在LIMIT之前

WHERE

过滤

>SELECT col1, col2
FROM tb_name
WHERE col1 = 2.5;

过滤不匹配

>SELECT col1, col2
FROM tb_name
WHERE col1 <> 1000

范围检查

>SELECT col1, col2
FROM tb_name
WHERE col1 BETWEEN 5 AND 10

空值检查

>SELECT col1
FROM tb_name
WHERE col2 IS NULL
NULL, 无值,它与字段包含0,空字符串或仅仅包含空格不同

多条件,组合and

>SELECT col1
FROM tb_name
WHERE col1=100 AND col2 <= 10

多条件, 组合or

>SELECT col1
FROM tb_name
WHERE col1=100 OR col2 <= 10

优先级 and 大于 or, 先处理的and,所以应该适当使用括号

select prod_id from products where (prod_price < 2.5 or vend_id = 1000) and prod_price > 1;

指定查询范围, in操作符

>SELECT col1
FROM tb_name
WHERE col1 IN (1001,1002)

取反,not操作符

>SELECT col1
FROM tb_name
WHERE col1 NOT IN (1001,1002)

操作符

=
<>
!=
<
<=
>
>=
between A and B

LIKE

通配

>SELECT col1
FROM tb_name
WHERE col1 LIKE ‘jet%’ %匹配0个或多个字符

单个字符

>SELECT col1
FROM tb_name
WHERE col1 LIKE ‘_ ton anvil’

数据过滤REGEXP

正则搜索

>SELECT col1
FROM tb_name
WHERE col1 REGEXP ‘1000’ REGEXP ‘.000’
REGEXP对列值匹配

进行or匹配

>SELECT col1
FROM tb_name
WHERE col1 REGEXP ‘1000|2000’

几个之一

select prod_id from products where prod_name regexp '[1|2]000';

匹配范围

select prod_id from products where prod_name regexp '[1-5]000';

匹配特殊字符,\ 进行转义

必须使用\\为前导。 \\-
>SELECT col1
FROM tb_name
WHERE col1 REGEXP ‘\\.’

like和 regexp

like整列匹配
regexp 列值内匹配

CONCAT

拼接字符

>SELECT Concat(name, ‘ ----‘, age)
FROM tb_name

去除空白

>SELECT Rtrim(name)
FROM tb_name Ltrim() Trim()

使用列名

>SELECT Concat(name, ‘---‘, age) AS info
FROM tb_name

算术计算

>SELECT quantity * item_price AS total_price
FROM tb_name 支持+ - * /

文本函数

文本处理函数

left()  串左边字符
length() 串长度
locate() 找出串的一个子串
lower() 转为小写
ltrim() 去掉左边空格
right() 返回串右边字符
rtrim() 去掉串右边空格
soundex() 返回字符串soundex值
upper() 大写

eg

>SELECT Upper(name)
FROM tb_name

日期函数

日期和时间处理函数

adddate() 增加一个日期-天或周
addtime() 增加一个时间
curdate() 返回当前日期
curtime() 返回当前时间
date() 返回日期时间的日期部分
datediff() 计算两个日期差
date_add() 高度灵活的日期运算函数
date_format() 返回一个格式化的日期或时间串
day() 返回一个日期的天数部分
dayofweek() 对于一个日期,返回对应的星期几
hour()
minute()
month()
now() 当前日期和时间
second()
time() 当前日期时间的时间部分
year()

eg

>SELECT col1
FROM tb_name
WHERE Date(order_date) = ‘2005-09-01’

常用日期和时间函数

Date()返回日期时间的日期部分
Day()返回日期的天数部分

数值函数

数值处理函数

abs()
cos()
exp() 指数
mod()
pi() 返回圆周率
rand() 随机数
sin()
sqrt()
tan()

聚集函数

avg 平均

>SELECT AVG(price) AS avg_price
FROM tb_name

count 计数

select count(*) from products; #无论Null还是非空,均纳入计数
select count(prod_id) from products; #计数有值记录,忽略NULL值

max 最大

>SELECT MAX(price) AS max_price
FROM tb_name

min 最小

>SELECT MIN(price) AS min_price
FROM tb_name

sum 求和

>SELECT SUM(quantity) AS total
FROM tb_name
#sum函数忽略值为NULL的行

GROUP

group

>SELECT id, COUNT(*) AS num_prods
FROM tb_name
GROUP BY id

注意:

1.group by 可以包含任意数目的列
2.group by 中每个列都必须是检索列或有效的表达式(但不能使聚集函数)
3.除聚集函数外,select语句中的每个列都必须在group by子句中出现
4.如果分组列有Null值,Null将作为一个分组返回
5.group by 子句必须出现在where子句之后, order by 之前

过滤分组

>SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) > 2

where和having区别

where在分组前过滤,having在分组后过滤

子查询

1.用于过滤

>SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems)

2.作为字段

>SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name

联结表

1.创建联结

>SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;

可进行联结多个表

2.内部联结

>SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id

高级联结表

1.自联结

>SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id FROM products
WHERE prod_id = ‘DTNTR’)

等价于

>SELECT p1.prod_id, p1.prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = ‘DTNTR’

2.外部联结

>SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id

组合查询

1.UNION

>SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <=5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002) UNION自动去除重复行
UNION ALL 保留

2.放在UNION后的排序语句

对所有SELECT生效

全文本搜索

MyISAM 支持全文本搜索

InnoDB不支持全文本搜索

1.启用

>CREATE TABLE productnotes(
note_id int NOT NULL AUT_INCREMENT,
note_text text NULL,
FULLTEXT(note_text)

2.进行全文本搜索

>SELECT note_text
FROM tb_name
WHERE Match(note_text) Against(‘rabbit’)

3.布尔文本搜索

>SELECT note_text
FROM productontes
WHERE Match(note_text) Against(‘heavy’ IN BOOLEAN MODE)

插入数据

1.基本插入

>INSERT INTO customers(cust_name,
cust_address)
VALUES(‘Pep’, ‘100 main street’)

2.插入多行

>INSERT INTO customers(cust_name,
cust_address)
VALUES(‘Pep’, ‘100 main street’),
(‘Tim’, ‘200 main Street’);

3.插入检索出来的数据

>INSERT INTO customers(cust_name,
cust_address)
SELECT cust_name, custaddress
FROM custnew;

更新

1.更新行

>UPDATE customers
SET cust_email = ‘a@fudd.com’
WHERE cust_id = 10005

2.即使发生错误也继续进行而不是退出

>UPDATE IGNORE customers

删除

1.删除数据

>DELETE FROM customers
WHERE cust_id = 10006

表操作

1.创建表

>CREATE TABLE customers(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL,
vend_city char(50) NULL,
quantity int NOT NULL DEFAULT 1,
PRIMARY KEY(cust_id)
)ENGINE=InnoDB

2.更新表

加字段

>ALTER TABLE vendors
ADD vend_phone CHAR(20)

删除某个字段

>ALTER TABLE tb1 DROP COLUMN names;

改变列类型

>ALTER TABLE infos CHANGE list list tinyint NOT NULL DEFAULT '0'

加主键

>ALTER TABLE tb1 ADD primary key(id)

删除一个字段

>ALTER TABLE tb1 DROP field_name

增加自增长主键

alter table customers change id id not null auto_increment primary key;

增加新字段并设置为主键

Alter TABLE tablename ADD new_field_id int(5) default 0 not null auto_increment ADD primary key(new_field_id)

ALTER TABLE example ADD ID INT NOT NULL;
ALTER TABLE example ADD UNIQUE(url) >ALTER TABLE vendors
DROP COLUMN vend_phone

alter table syntax: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

3.删除表

>DROP TABLE customers2;

4.清空表数据

>DELETE FROM mytable;

5.重命名表

>RENAME TABLE customers2 TO customers;
ALTER TABLE 'oldname' RENAME TO 'newname'

视图操作

1.创建视图

>CREATE VIEW productcustomers AS
SELECT cust_name, cust_contact
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id

2.使用视图

>SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = ‘TNT2’

存储过程

1.创建简单存储过程

>CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(price) AS priceavg
FROM products;
END;

调用:CALL productpricing()

2.删除存储过程

>DROP PROCEDURE productpricing

3.使用参数

>CREATE PROCEDURE ordertotal(
IN onumber INT,
OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT Sum(item_price*quality)
FROM orderitems
WHERE order_num = onumber
INTO ototal;
END;

调用:

>CALL ordertotal(200005, @total;
>SELECT @total;

3.检查存储过程

>SHOW CREATE PROCEDURE ordertotal;

游标

1.创建游标

>CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_number FROM orders; BEGIN ordernumbers; FETCH ordernumbers INTO o; CLOSE ordernumbers;
END; DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET done=1;
REPEAT
FETCH ordernumbers INTO o;
END;

触发器

1.创建触发器

>CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT ‘Product added’

2.删除触发器

>DROP TRIGGER newproduct;

3.INSERT触发器

>CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num

4.DELETE触发器

>CREATE TRIGGER deleteorder BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
INSERT INTO archive_orders(order_num, order_date, cust_id)
VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);
END;

5.UPDATE触发器

>CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors
FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);

事务

基本概念

ACID
A,原子性,食物是一个原子操作单元,其对数据的修改,要么全执行,要么全不执行
C.一致性,事务开始和完成的时候,数据必须都保持一致状态(所有相关数据规则和内部数据结构)
I.隔离性,保证事务不受外部并发操作影响,即事务处理中间过程状态对外不可见
D.持久性,事务完成后,对数据修改时永久性的,及时出现系统故障也能够保持

1.事务

>START TRANSACTION
DELETE FROM ordertotals;
SELECT * FROM ordertotals; >ROLLBACK
回退 >COMMIT
提交

2.设立保留点

>SAVEPOINT delete1;

>ROLLBACK TO delete1;

导入导出

1.导入

用文本形式插入数据

>LOAD DATA LOCAL INFILE 'd:/mysql.txt' INTO TABLE mytable;

导入.sql

>use database;
>source d:/mysql.sql

从另外一张表往这张表插入

INSERT INTO tab1(f1,f2)
SELECT a.f1, a.f2
FROM a WHERE a.f1='a'

2.备份

导出要用到MySQL的mysqldump工具,基本用法是:

mysqldump [OPTIONS] database [tables]

备份MySQL数据库的命令

mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql

备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。

mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql

直接将MySQL数据库压缩备份

mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz

备份MySQL数据库某个(些)表

mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql

同时备份多个MySQL数据库

mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql

仅仅备份数据库结构

mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql

备份服务器上所有数据库

mysqldump –all-databases > allbackupfile.sql

还原

还原MySQL数据库的命令

mysql -hhostname -uusername -ppassword databasename < backupfile.sql
mysql -hhostname -ppassword databasename tablename < backuptablefile.sql

还原压缩的MySQL数据库

gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename

将数据库转移到新服务器

mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename

将查询结果导入外部文件

SELECT a,b,a+b
FROM test_table
INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n' 或者 mysql -u you -p -e "SELECT ..." > file_name

性能研究

1.什么情况下无法使用索引?

实时监控

查看mysql数据库的当前连接数

命令: show processlist;
或者 # mysqladmin -uroot -p密码 processlist

当前状态

命令: show status;
或者 # mysqladmin -uroot -p密码 status 转帖自 http://ourmysql.com/archives/1461

mysql基础知识笔记的更多相关文章

  1. 初学MySQL基础知识笔记--01

    本人初入博客园,第一次写博客,在今后的时间里会一点点的提高自己博客的水平,以及博客的排版等. 在今天,我学习了一下MySQL数据库的基本知识,相信关于MySQL的资料网上会有很多,所以我就不在这里复制 ...

  2. 初学MySQL基础知识笔记--02

    查询部分 1> 查询数据中所有数据:select * from 表名 2> 查询数据中某项的数据:eg:select id,name from students; 3> 消除重复行: ...

  3. mysql基础知识大全

    前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 数据库和数据库软件 数据库是 ...

  4. mysql基础知识语法汇总整理(二)

    mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...

  5. mysql基础知识语法汇总整理(一)

    mysql基础知识语法汇总整理(二)   连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...

  6. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

  7. JS基础知识笔记

    2020-04-15 JS基础知识笔记 // new Boolean()传入的值与if判断一样 var test=new Boolean(); console.log(test); // false ...

  8. Java多线程基础知识笔记(持续更新)

    多线程基础知识笔记 一.线程 1.基本概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是 ...

  9. MySQL基础知识:启动管理和账号管理

    整理.记录常用的MySQL基础知识:时间久了,很多就忘记了. 操作系统环境为MacOS Catalina, MySQL版本为: 8.0.13 MySQL Community Server - GPL. ...

随机推荐

  1. Numpy 的数学和统计方法

    可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算.sum.mean以及标准差std等 聚合计算(aggregation, 通常叫做约简(reduction))既可以当做数组的实例方法 ...

  2. VIM下的普通模式的相关知识

    什么为一次操作? 从进行插入模式开始,直到返回普通模式为止,在此期间的任何修改都视为一次操作:   使用 u 可以撤销最新的修改: 所以呢,控制好在插入模式的操作就可以控制好撤销命令的粒度: 另外,最 ...

  3. JDBC创建数据库实例

    在本教程将演示如何在JDBC应用程序中创建数据库. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式中创建数据库. 要执行以下示例,需要用实际用户名和密码替换这里用 ...

  4. Spring JDBC删除数据

    以下示例将展示如何使用Spring jdbc执行删除数据库表中的记录,这里演示如何删除指定student表中的记录. 语法: String deleteQuery = "delete fro ...

  5. (原)linux下利用cmake来编译jthread开源库

    其实上次在用hisi3531平台的时候,就已经编译过一次这个库了,这次换了平台环境,交叉编译器变成了arm-hisiv100-linux-工具链,所以,没办法只能重新来过. 因为之前编译过,所以这次还 ...

  6. 关于sdl_ttf使用字体库加载失败的问题

    今天同事拿着前期阶段开发的视频绘图库给另外一个同事的电脑上测试,结果发现老是出现打开字体库失败,但从打印的日志信息看,路径下确实存在字体库啊,这是什么原因? 于是没办法,搬到自己本级上再测试下,从他机 ...

  7. 某软件大赛C#版考题整理——【单选题】

    多选题:http://www.cnblogs.com/zxlovenet/p/3525849.html 编程题:http://www.cnblogs.com/zxlovenet/p/3525854.h ...

  8. Xianfeng轻量级Java中间件平台:一期开发计划

    关于Xianfeng轻量级Java中间件平台,考虑到需要控制开发周期,通过分期开发的方式来实现一些基础的.常用的功能,这样有利于跟踪开发计划.一期的开发计划,主要实现的目标如下: 系统架构: 1.确定 ...

  9. linux 上安裝lnmp

    1.確保有一台服務器可以正常運行 2.熟練知道一些基本的命令 3.這裡我以lnmp集成環境為例 https://lnmp.org/install.html 4.安裝大約30分鐘左右 5.安裝完畢,訪問 ...

  10. javascript对数据处理

    数组去重 法一: // 遍历数组,建立新数组,利用indexOf判断是否存在于新数组中,不存在则push到新数组,最后返回新数组 function unique(ar) { var ret = []; ...