SQL: 结构化查询语言(Structured Query Language)
查询创建数据库的语句
show create database mzk_test;
+----------+-------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------+
| mzk_test | CREATE DATABASE `mzk_test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------------+
查询创建表的语句
mysql> show create table 1_items\G;
*************************** 1. row ***************************
Table: 1_items
Create Table: CREATE TABLE `1_items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SQL语句大小写, SQL语句不区分大小写, 很多SQL开发人员习惯把SQL关键字大写, 列名和表名使用小写, 方便代码阅读
假如我们想排查相同结果的列应该如何做,
现有数据
mysql> select iid from 1_items_links;
+-----+
| iid |
+-----+
| 1 |
| 1 |
| 1 |
| 2 |
+-----+
排除相同数据
mysql> SELECT DISTINCT iid from 1_items_links;
+-----+
| iid |
+-----+
| 1 |
| 2 |
+-----+
tips: DISTINCT 应用于所有列, 而不只是前置它的列
当DISTINCT后面跟着多个字段, 则需多个字段的value都一样才算重复值
SELECT prod_name FROM products LIMIT 5,7
表示从第6(默认值为0, 第一行为行0)行开始, 检索7个符合结果的列(包括第6行)
但这个从0行开始算比较容易弄混淆, 一般都用OFFSET表示从第几行开始
OFFSET制定的数字就是从第1行开始
SELECT prod_name FROM products LIMIT 7 OFFSET 6
6.2.1 检查某个值 字符串
=
和!=
比较是忽略大小写的
SELECT prod_name FROM products WHERE prod_name = 'fuses';
这个SQL能匹配fuses
也能匹配Fuses
6.2.3 范围值检查
SELECT prod_name FROM products Where prod_price BETWEEN 5 AND 10
找出prod_price
大于等于5和小于等于10的列
6.2.4 空值检查
创建表时, 可以设定表是否可以不包含值, 不包含的话就是NULL
找出空值
select prod_name from products where prod_price is NULL;
��> 7.1.3 计算次序
当包含任意数目的OR
和AND
, 会先处理AND操作, 然后再处理OR操作, 没有()
的情况下
8.1.2 下划线
_
通配符
_
表示只匹配单个字符
9.2.2 进行OR匹配
select prod_name from products where prod_name regexp '[123] Ton'
9.2.5匹配特殊字符
为了匹配特殊字符, 必须用\\
作为前导, \\-
为了找-
, \\.
为了找.
GROUP BY用于分组数据, 可以用HAVING过滤分组
HAVING和WHERE非常类似, WHERE过滤的是行, HAVING过滤的是分组
例如要过滤加个大于10的商品, 最后的分组要过滤大于2个的分组
SELECT vend_id, count(*) as num prods
from products
where prod_price >= 10
group by vend_id
having count(*) >=2;
- select
- from
- where
- group by
- having
- order by
- limit
15.2.2 内部联结
基于两张表之间相等测试, 这种联结称为内部联结
select vend_name, prod_name, prod_price
from vendors inner join products
on vendors.vend_id = products.vend_id
一般情况下 自联结的查询速度会比子查询要快很多
16.2.3 外部联结
以下场景会使用到外部联结
- 每个客户下了多少订单进行计数, 包括至今未下单的从客户
- 列出所有产品以及订购数量, 包括没人订购的产品
包含了那些相关表中没有关联行的行, 称为外部链接
外部联结有外部左链接和外部右联结
外部联结还包括没有关联行的行, 外部左联结表示会左边表里的所有行
select customers.cust_id, orders.order_num
from customers right outer join orders
on orders.cust_id = customers.cust_id;
以下两种基本情况, 需要使用组合查询
- 在单个查询中从不同的表返回类似结构的数据
- 对单个表执行多个查询, 按单个查询返回数据
- UNION中每个查询必须包含相同的列, 表达式或聚合函数(次序可不同)
- 列数据类型必须兼容, 类型不必完全相同, 但必须是DBMS可以隐式转换的类型
17.2.3 包含或取消重复的行
UNION和WHERE的OR一样 都会去掉重复的行
要不取消冲的行则使用UNION ALL
17.2.4 对组合查询结果排序
UNION组合查询时, ORDER BY只能出现一次, 而且必须在最后一个SELECT中
MyISAM支持全文本搜索而InnoD不支持
如果插入优先级低, 而查询优先级高则可以使用INSERT LOW_PRIORITY INTO
mysql单条insert语句多个插入比使用多条INSERT语句要快
利用SELECT语句把结果插入表里
insert into customers(cust_id, cust_contact)
SELECT cust_id, cust_contact from custnew;
MyISAM不支持事务, InnoDB支持事务
- 事务: transaction 指一组SQL语句
- 回退: rollback 指撤销指定SQL语句的国产
- 提交: commit 指将未存储的SQL语句结果写入数据库表
- 保留点: savepoint 指事务处理中设置的临时占位符, 可以对它发布回退
不能回退CREATE或DROP操作, 事务中可以使用者两个操作, 但回退时不会被撤销
当COMMIT或ROLLBACK语句执行后, 事务会自动关闭
start transaction;
DELETE from orderitems where order_nul = 1;
DELETE from orders where order_num = 20010;
commit
使用保留点
savepoint delete1;
rollback to delete1;
- 字符集: 字母和符号的集合
- 编码: 为某个字符集成员的内部表示
- 校对: 为规定字符如何比较的指令
-- 查看所有字符集列表
show character set;
-- 输出所有支持校对的完整列表
show collation
_cs
结尾表示一次区分大小写_ci
结尾表示一次不区分大小写
create table mytable
(
col int,
col2 varchar(10)
col3 varchar(10) character set latin1 collate latin1_general_ci
) DEFAULT character set hebrew
collate hebrew_general_ci;