MySQL基础语句【学习笔记】
放在这里,以备后查。
1. 数据库, 数据库服务器, 数据库语言
数据库,是持久性数据的集合,供给定企业的应用程序系统使用,并且由一个数据库管理系统来管理;
数据库服务器,又称数据库管理系统,用来管理数据库(高效地存储、查询、更新数据库,并维护数据库的完整性状态);
数据库语言,是应用程序用来向数据库服务器发送命令并从中取出所需要数据的特定语言。
2. 系统变量
查询系统变量: SELECT @@系统变量名 , eg. SELECT @@DATADIR
显示所有系统变量: SHOW VARIABLES , SHOW VARIABLES LIKE 'pattern'
设置系统变量: SET @@GLOBAL(LOCAL,SESSION).varname=值 ;
(1) 数据库目录: DATADIR ; (2) 日志: LOG_WARNINGS
(3) 最大用户连接数: MAX_USER_CONNECTIONS ; (4) 版本: VERSION
3. 系统数据库和表
(1) MYSQL.USER : 存放数据库用户登陆信息的表。
(2) INFORMATION_SCHEMA : 存放目录数据的数据库
4. 查看数据库详细信息: HELP SHOW ;SHOW WARNINGS ; SHOW STATUS ;
5. mysql 基本语句:
(1) 创建和查看用户、权限、数据库
创建用户: CREATE USER 'username'@'hostname' IDENTIFIED BY 'password'
创建数据库: CREATE DATABASE database_name ;
授予权限:GRANT 【操作权限,比如,select, update, delete, all】 ON database_name.table_name to 'username'@'host'
查看权限: SHOW GRANTS ; 查看数据库创建定义:SHOW CREATE DATABASE database_name ;
显示当前用户所拥有的所有数据库: show databases ; 选择要使用的数据库: USE database_name ;
显示当前数据中的所有表: show tables ;
(2) 创建表和表操作
创建表: CREATE TABLE table_name ( 属性名1 属性类型1 约束1,... 属性名n 属性类型n 约束n, PRIMARY KEY(属性名i,j,...,p)) ENGINE=引擎名 DEFAULT CHARACTER SET 字符集名 COLLATE 校对名
A. 约束: 是否允许为空值(NOT NULL, 默认允许空值);是否有默认值(DEFAULT 默认值)
B. 主键值: 若不想指定,则用 NULL 代替, 由系统自动生成相应值进行填充
C. 多个列作为主键: 使用逗号隔开的多个列名的列表
D. 引擎类型:InnoDB(可靠事务处理), MyISAM(性能高,支持全文搜索,但不支持事务处理), MEMORY(速度特别快)
E. 指明所使用字符集;可以对单个列进行指定。
查看表创建定义: SHOW CREATE TABLE 表名; 查看表的字段定义: desc table_name ;
重命名表: RENAME TABLE 旧表名 TO 新表名
更改表结构:
ALTER TABLE 表名 (ADD 列名 列名类型) [添加列] | (DROP COLUMN 列名) [删除已有列] |
(ADD CONSTRAINT 约束名 FOREIGN KEY (外键名) REFERENCES 外键所在表名 (外键所在表的相应主键名))[添加外键]
查看表创建定义: SHOW CREATE TABLE 表名; 查看表的字段定义: desc table_name ;
插入数据: INSERT INTO table_name values (数据1, 数据2,... 数据n) ; 插入数据必须与对应属性名的属性类型匹配
删除数据: DELETE FROM table_name WHERE CONDITIONS
更新数据: UPDATE table_name SET 属性名=新值 WHERE CONDITIONS
创建索引: ADD (UNIQUE) INDEX 索引名 ON 表名(属性名)
创建视图: CREATE VIEW 视图名(属性名i, ... 属性名j) AS SELECT 查询语句
(3) 删除操作
删除数据库: DROP DATABASE database_name ;
删除视图: DROP VIEW 视图名
删除表: DROP TABLE 表名
删除索引: DROP INDEX 索引名
6. 查询与过滤数据
表定义[见 mysql 必知必会]:
a. 客户表 customers: cust_id(PK), cust_name, cust_email, others
b. 供货商表: vendors: vend_id(PK), vend_name, vend_country, others
c. 产品表 products: prod_id(PK), vend_id(FK), prod_name, prod_price, prod_desc
d. 客户订单表 orders: order_num(PK), order_date, cust_id(FK)
e. 订单信息表 orderitems: (order_num, order_item)(PK), prod_id(FK), quantity, item_price
(1) 基本查询与过滤:
SELECT [DISTINCT] [OP1] FROM [OP2]
WHERE [COND_CLAUSE]
ORDER BY [ OP3] <DESC>
LIMIT offset, lineNum
---> OP1: 单个列名或列名表达式,或多个用逗号隔开的列名或列名表达式。
---> OP2:一个或多个表名,用逗号隔开 ;
---> OP3: 一个或多个列名,用逗号隔开;
---> ORDER BY: 对检索结果排序,按照指定列名顺序依次排序;默认升序排列;DESC 指明降序排列;
---> LIMIT offset, lineNum : 从第 offset 行 [下标从零数起] 开始的 lineNum 行; 若行数不足 lineNum, 则检索能够得到的最大行数。
---> COND_CLAUSE: 由一个或多个条件子句组成。
-----> 条件子句结构为 '表名.列名 操作符 值或值集'
-----> 空值查询: IS NULL;
-----> 集合操作符:IN (值的集合) ; 表示仅在括号中给定的值集中取值;
-----> 通配操作符:LIKE [BINARY] 'text' ; text 为通配符文本。
通配符: % 任意多个任意字符 ; _ 任意单个字符
-----> 正则表达式:REGEXP [BINARY] 'regexText' ; regexText 为正则表达式文本
正则表达式: . 匹配任意单个字符 ; OR | 或 ;范围匹配 [0-9], [a-zA-Z] ;
//c , // 转义符,比如匹配字符点号 //. ;
* 零个或多个 ; + 一个或多个 ; {n} 恰好 n 个 ;{n,} N>=n ; {n,m} n<=N<=m
^ 文本开始 ; $ 文本末尾
-----> 可以使用逻辑操作符 AND, OR 将多个条件子句连接起来,形成多重过滤条件。
AND 优先级高于 OR ; 为确保正确的次序,尽量多使用括号来表明优先级;
NOT 可对条件字句的结果取反(F->T, T->F)。
---> 关键字: BINARY 搜索区分大小写 ; DISTINCT 去除重复行
(2) 生成新字段: 上述查询语句中,[OP1] 还可以是任何合法的列名表达式:
A. 由多个列名及字符串拼接而成的字段。 例如 SELECT Concat(列名1, ' *** ', 列名2) FROM 表名.
B. 列名的四则运算。 例如 SELECT (prod_price * quantity) FROM items;
C. 列名的函数。 例如, SELECT Concat(YEAR(order_date), '/', Month(order_date)) FROM orders;
D. AS alias_name: 可以用来给新生成的字段命名。
(3) 分组数据: 可以在WHERE 字句后加入分组子句 ; WHERE 子句在分组前过滤数据, HAVING 子句在分组后过滤数据。
SELECT [OP1] FROM [OP2] [WHERE 子句] GROUP BY 一个或多个列名 HAVING 条件子句
(4) 子查询: 子查询可以用来替代任何有值或值集的地方,尤其是与 in 连用。例如
SELECT cust_name FROM customers WHERE cust_id IN
( SELECT cust_id FROM orders WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30') ;
(5) 表联结:
A. 基本的表联结: 主要是使用笛卡尔乘积和 WHERE 子句来进行。 例如,找出所有的产品名称及供货商名称:
SELECT prod_name , vend_name FROM products, vendors Where products.vend_id = vendors.vend_id; 或者
SELECT prod_name , vend_name FROM products INNER JOIN vendors on products.vend_id = vendors.vend_id;
B. 多个表联结: 方法不变,为了避免出错,可以先在文本文件把语句写好,再复制粘贴过去以检验。
例如,找出客户所下订单的信息:
SELECT cust_name, orders.order_num, prod_name, vend_name, quantity, prod_price, item_price*quantity AS order_price
FROM customers, vendors, orders, products, orderitems
WHERE products.prod_id = orderitems.prod_id
AND orderitems.order_num = orders.order_num
AND customers.cust_id = orders.cust_id
AND products.vend_id = vendors.vend_id;
技巧: 分三步进行: a. 在 SELECT 中在多个表中选择想要显示的列名或构造列名表达式;
b. 在 FROM 中列出所有涉及到的表名;
c. 根据表中的外键及WHERE相等子句条件建立联结。
C. 自联结: 在单个 SELECT中 多次引用和联结同一张表,需要使用表别名来消除歧义性。
例如,查询生产产品ID为 'DTNTR' 的供应商生产的其它产品:
SELECT p1.vend_id, p1.prod_id FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR'
D. 外联结:在自然联结的基础上附加没有被关联的行(请自行查阅相关数据库理论书籍)
SQL: SELECT ... FROM 表名1 LEFT[RIGHT] OUTER JOIN 表名2 ON ...
(6) 组合查询: 将多个 SELECT 查询组合成单个查询结果
----> SQL : SELECT ... UNION [ALL] SELECT ... [ORDER BY DESC]
----> UNION ALL: 包含多个查询结果中重复出现的行;默认是不包含重复行的;
----> ORDER BY: 必须在最后一个 SELECT 语句之后,对整个组合查询的结果进行排序。
7. 数据库维护:
(1) 执行SQL文件: /. <filename> 或者 source <filename> ; mysql -u username -p database_name < xxx.sql
(2) 备份和恢复数据表: select * into outfile '/var/lib/mysql/user.bak' from tblname;
load data infile '/var/lib/mysql/user.bak' replace into table tblname ;
(3) 备份和恢复数据库或表:
mysqldump -uxtools -h127.0.0.1 -pxtool dbname tablename > /tmp/tbl.bak.sql