Heim > Datenbank > MySQL-Tutorial > Hauptteil

Mysql基础笔记

WBOY
Freigeben: 2016-06-07 16:38:37
Original
1160 Leute haben es durchsucht

update: 2013-08-11, 笔记录了一半不到,还没码完....update: 2013-11-23, DONE mysql速查 参考: Mysql必知必会,网络blog, stackoverflow 注; 基础部分sql参考 《mysql必知必会》, 还不错的一本书,菜鸟入门级,需要的话可以入手 在浏览器中使用查找 寻找

update: 2013-08-11, 笔记录了一半不到,还没码完....>

mysql速查

参考: 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
Nach dem Login kopieren

基本概念

数据库基础:

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

数据库-database

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

表-table

某种特定类型数据的结构化清单
Nach dem Login kopieren

模式-schema

关于数据库和表的布局及特性的信息
Nach dem Login kopieren

列-column

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

数据类型-datatype

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

行-row

表中的一个记录
Nach dem Login kopieren

主键-primary key

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

mysql命令行

进入

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

命令格式和说明:

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

可以用GUI工具

MySQL Administrator
MySQL Query Browser
Nach dem Login kopieren

use

创建库:

>CREATE DATABASE MYSQLDATA
Nach dem Login kopieren

使用某个库

use db_name
Nach dem Login kopieren

show

查看所有数据库

show databases;
Nach dem Login kopieren

列出库中所有表

use db_name;
show tables;
Nach dem Login kopieren

列出表的所有列信息

show columns from table_name;
or
desc table_name;
Nach dem Login kopieren

显示创建的sql语句

show create database db_name;
show create table table_name;
Nach dem Login kopieren

其他

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

查询

SELECT子句顺序

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
Nach dem Login kopieren

select

检索单个列

>SELECT col FROM tb_name;
Nach dem Login kopieren

多个列

>SELECT col1, col2
 FROM tb_name
Nach dem Login kopieren

检索所有列

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

检索去重

>SELECT DISTINCT col
 FROM tb_name
Nach dem Login kopieren

限制结果数

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

order by

按某个字段排序

>SELECT col1
 FROM tb_name
 ORDER BY col1
Nach dem Login kopieren

按多列排序

>SELECT col1, col2, col3
 FROM tb_name
 ORDER BY col1, col2
Nach dem Login kopieren

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

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

where

过滤

>SELECT col1, col2
 FROM tb_name
 WHERE col1 = 2.5;
Nach dem Login kopieren

过滤不匹配

>SELECT col1, col2
 FROM tb_name
 WHERE col1  1000
Nach dem Login kopieren

范围检查

>SELECT col1, col2
 FROM tb_name
 WHERE col1 BETWEEN 5 AND 10
Nach dem Login kopieren

空值检查

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

多条件,组合and

>SELECT col1
 FROM tb_name
 WHERE col1=100 AND col2 
<p>多条件, 组合or</p>
<p class="codehilite"></p><pre class="brush:php;toolbar:false">>SELECT col1
 FROM tb_name
 WHERE col1=100 OR col2 
<p>优先级 and 大于 or, 先处理的and,所以应该适当使用括号</p>
<p class="codehilite"></p><pre class="brush:php;toolbar:false">select prod_id from products where (prod_price  1;
Nach dem Login kopieren

指定查询范围, in操作符

>SELECT col1
 FROM tb_name
 WHERE col1 IN (1001,1002)
Nach dem Login kopieren

取反,not操作符

>SELECT col1
 FROM tb_name
 WHERE col1 NOT IN (1001,1002)
Nach dem Login kopieren

操作符

=

!=

>=
between A and B
Nach dem Login kopieren

like

通配

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

单个字符

>SELECT col1
 FROM tb_name
 WHERE col1 LIKE ‘_ ton anvil’
Nach dem Login kopieren

数据过滤regexp

正则搜索

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

进行or匹配

>SELECT col1
 FROM tb_name
 WHERE col1 REGEXP ‘1000|2000’
Nach dem Login kopieren

几个之一

select prod_id from products where prod_name regexp '[1|2]000';
Nach dem Login kopieren

匹配范围

select prod_id from products where prod_name regexp '[1-5]000';
Nach dem Login kopieren

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

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

like和 regexp

like整列匹配
regexp 列值内匹配
Nach dem Login kopieren

concat

拼接字符

>SELECT Concat(name, ‘ ----‘, age)
 FROM tb_name
Nach dem Login kopieren

去除空白

>SELECT Rtrim(name)
 FROM tb_name
Ltrim() Trim()
Nach dem Login kopieren

使用列名

>SELECT Concat(name, ‘---‘, age) AS info
 FROM tb_name
Nach dem Login kopieren

算术计算

>SELECT quantity * item_price AS total_price
 FROM tb_name
支持+ - * /
Nach dem Login kopieren

文本函数

文本处理函数

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

eg

>SELECT Upper(name)
FROM tb_name
Nach dem Login kopieren

日期函数

日期和时间处理函数

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

eg

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

常用日期和时间函数

Date()返回日期时间的日期部分
Day()返回日期的天数部分
Nach dem Login kopieren

数值函数

数值处理函数

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

聚集函数

avg 平均

>SELECT AVG(price) AS avg_price
 FROM tb_name
Nach dem Login kopieren

count 计数

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

max 最大

>SELECT MAX(price) AS max_price
 FROM tb_name
Nach dem Login kopieren

min 最小

>SELECT MIN(price) AS min_price
 FROM tb_name
Nach dem Login kopieren

sum 求和

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

group

group

>SELECT id, COUNT(*) AS num_prods
 FROM tb_name
 GROUP BY id
Nach dem Login kopieren

注意:

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

过滤分组

>SELECT cust_id, COUNT(*) AS orders
 FROM orders
 GROUP BY cust_id
 HAVING COUNT(*) > 2
Nach dem Login kopieren

where和having区别

where在分组前过滤,having在分组后过滤
Nach dem Login kopieren

子查询

1.用于过滤

>SELECT cust_id
 FROM orders
 WHERE order_num IN (SELECT order_num
                    FROM orderitems)
Nach dem Login kopieren

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
Nach dem Login kopieren

联结表

1.创建联结

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

可进行联结多个表

2.内部联结

>SELECT vend_name,prod_name,prod_price
 FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id
Nach dem Login kopieren

高级联结表

1.自联结

>SELECT prod_id, prod_name
 FROM products
 WHERE vend_id = (SELECT vend_id FROM products
                WHERE prod_id = ‘DTNTR’)
Nach dem Login kopieren

等价于

>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’
Nach dem Login kopieren

2.外部联结

>SELECT customers.cust_id, orders.order_num
 FROM customers LEFT OUTER JOIN orders
      ON customers.cust_id = orders.cust_id
Nach dem Login kopieren

组合查询

1.UNION

>SELECT vend_id, prod_id, prod_price
 FROM products
 WHERE prod_price 
<p>2.放在UNION后的排序语句</p>
<p class="codehilite"></p><pre class="brush:php;toolbar:false">对所有SELECT生效
Nach dem Login kopieren

全文本搜索

MyISAM 支持全文本搜索

InnoDB不支持全文本搜索

1.启用

>CREATE TABLE productnotes(
 note_id int NOT NULL AUT_INCREMENT,
 note_text text NULL,
 FULLTEXT(note_text)
Nach dem Login kopieren

2.进行全文本搜索

>SELECT note_text
 FROM tb_name
 WHERE Match(note_text) Against(‘rabbit’)
Nach dem Login kopieren

3.布尔文本搜索

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

插入数据

1.基本插入

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

2.插入多行

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

3.插入检索出来的数据

>INSERT INTO customers(cust_name,
                     cust_address)
 SELECT cust_name, custaddress
 FROM custnew;
Nach dem Login kopieren

更新

1.更新行

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

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

>UPDATE IGNORE customers
Nach dem Login kopieren

删除

1.删除数据

>DELETE FROM customers
 WHERE cust_id = 10006
Nach dem Login kopieren

表操作

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
Nach dem Login kopieren

2.更新表

加字段

>ALTER TABLE vendors
 ADD vend_phone CHAR(20)
Nach dem Login kopieren

删除某个字段

>ALTER TABLE tb1 DROP COLUMN names;
Nach dem Login kopieren

改变列类型

>ALTER TABLE infos CHANGE list list tinyint NOT NULL DEFAULT '0'
Nach dem Login kopieren

加主键

>ALTER TABLE tb1 ADD primary key(id)
Nach dem Login kopieren

删除一个字段

>ALTER TABLE tb1 DROP field_name
Nach dem Login kopieren

增加自增长主键

alter table customers change id id not null auto_increment primary key;
Nach dem Login kopieren

增加新字段并设置为主键

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
Nach dem Login kopieren

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

3.删除表

>DROP TABLE customers2;
Nach dem Login kopieren

4.清空表数据

>DELETE FROM mytable;
Nach dem Login kopieren

5.重命名表

>RENAME TABLE customers2 TO customers;
 ALTER TABLE 'oldname' RENAME TO 'newname'
Nach dem Login kopieren

视图操作

1.创建视图

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

2.使用视图

>SELECT cust_name, cust_contact
 FROM productcustomers
 WHERE prod_id = ‘TNT2’
Nach dem Login kopieren

存储过程

1.创建简单存储过程

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

调用:CALL productpricing()

2.删除存储过程

>DROP PROCEDURE productpricing
Nach dem Login kopieren

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;
Nach dem Login kopieren

调用:

>CALL ordertotal(200005, @total;
>SELECT @total;
Nach dem Login kopieren

3.检查存储过程

>SHOW CREATE PROCEDURE ordertotal;
Nach dem Login kopieren

游标

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;
Nach dem Login kopieren

触发器

1.创建触发器

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

2.删除触发器

>DROP TRIGGER newproduct;
Nach dem Login kopieren

3.INSERT触发器

>CREATE TRIGGER neworder AFTER INSERT ON orders
 FOR EACH ROW SELECT NEW.order_num
Nach dem Login kopieren

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;
Nach dem Login kopieren

5.UPDATE触发器

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

事务

基本概念

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

1.事务

>START TRANSACTION
 DELETE FROM ordertotals;
 SELECT * FROM ordertotals;
>ROLLBACK
回退
>COMMIT
提交
Nach dem Login kopieren

2.设立保留点

>SAVEPOINT delete1;
>ROLLBACK TO delete1;
Nach dem Login kopieren

导入导出

1.导入

用文本形式插入数据

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

导入.sql

>use database;
>source d:/mysql.sql
Nach dem Login kopieren

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

INSERT INTO tab1(f1,f2)
SELECT a.f1, a.f2
FROM a WHERE a.f1='a'
Nach dem Login kopieren

2.备份

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

mysqldump [OPTIONS] database [tables]
Nach dem Login kopieren

备份MySQL数据库的命令

mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql
Nach dem Login kopieren

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

mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql
Nach dem Login kopieren

直接将MySQL数据库压缩备份

mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz
Nach dem Login kopieren

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

mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
Nach dem Login kopieren

同时备份多个MySQL数据库

mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql
Nach dem Login kopieren

仅仅备份数据库结构

mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
Nach dem Login kopieren

备份服务器上所有数据库

mysqldump –all-databases > allbackupfile.sql
Nach dem Login kopieren

还原

还原MySQL数据库的命令

mysql -hhostname -uusername -ppassword databasename 
<p>还原压缩的MySQL数据库</p>
<p class="codehilite"></p><pre class="brush:php;toolbar:false">gunzip 
<p>将数据库转移到新服务器</p>
<p class="codehilite"></p><pre class="brush:php;toolbar:false">mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename
Nach dem Login kopieren

将查询结果导入外部文件

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
Nach dem Login kopieren

性能研究

1.什么情况下无法使用索引?
Nach dem Login kopieren

实时监控

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

命令: show processlist;
或者 # mysqladmin -uroot -p密码 processlist
Nach dem Login kopieren

当前状态

命令: show status;
或者 # mysqladmin -uroot -p密码 status
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!