三、SQL子查询
1.从内往外,查到的值作为条件输入
2.相关子查询,涉及到列名有多义性,需要用完全限定列名,如orders.cust_id
3.创建计算字段,并命名为orders
SELECT cust_name,
(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS orders
四、SQL联结
1.关系型数据库,可伸缩性好
2.创建联结,一定要有WHERE语句
3.笛卡儿积:没有联结条件的返回值,等于第一个表行数乘以第二个表行数
4.叉联结:有联结条件的返回值
5.联结可以和子查询等价,比子查询速度快
SELECT cust_name,cust_contact
FROM customers,oders
WHERE customers.cust_id = orders.cust_id
6.联结的分类
- 1)等值联结/内部联结
一个列在多个表中出现,返回所有数据,列会重复出现只返回有关联行的行
SELECT customers.cust_id,order.order_num
FROM customers INNER JOIN orders
ON customer.cust_id = order.cust_id;
- 2)自联结
在同一张表中查询,表的多次命名
SELECT p1.prod_id,p1.prod_name
FROM products AS p1,products AS p2
WHERE p1.ven_id = p2.vend_id
AND p2.prod_id = 'aaaa';
- 3)自然联结
每一列只出现一次,排除重复列。只对第一个表所有列都列出,其他表明确列出列名
SELECT c.*,o.order_num,o.order_date
FROM customers AS c, orders AS o
WHERE c.cust_id = o.cust_id
- 4)外联结
左外联结/右外联结,包括没有关联的行也列出,左/右可以通过颠倒FROM和WHERE进行转换
SELECT customers.cust_id,orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = order.cust_id;
五、SQL高级操作
1 UNION 复合查询
1)UNION在两条SELECT语句之间,包含相同的列/表达式/聚集函数,自动去除重复的行,相当于WHERE。
2)如果要返回所有行,用UNION ALL,能完成WHERE完成不了的工作。
3)只能在最后有一条ORDER BY,对所有SELECT排序
2 INSERT 插入数据
1)不产生输出,指定表名(若指明列名更准确)和被插入的值,没有值用NULL代替
2)将过滤后的数据重新插入表格中INSERT SELECT
INSERT INTO 表名(列名1,列名2)
VALUES(列值1,列值2);
3 UPDATE 更新数据
1)以表名开始,SET将新值赋值给更新的列,以WHERE结尾,否则更新所有的行
2)用NULL去掉列中的值
UPDATE 表名
SET 列名=更新列值
WHERE 查询条件;
4 DELETE 删除数据
DELETE FROM 表名
WHERE 删除的行
六、数据表的相关操作
1 CREATE TABLE 创建表
1)自动增量AUTO_INCREMENT,一个表只有一个,必须被索引
2)DEFAULT 1 表示默认值为1
3)PRIMARY KEY定义主键
4)引擎ENGINE,主要是一下几种:
a. InnoDB: 可靠的事务处理引擎,不支持全文本搜索
b.MEMORY:数据存储在内存中,速度快,适合临时表
c. MyISAM:支持全文本搜索,不支持事务处理
CREATE TABLE 表名
(
列名 int NOT NULL AUTO_INCREMENT,
列名 datetime NULL,
列名 int NOT FULL DEFAULT 1,
PRIMARY KEY(列名),
)ENGINE=InnoDB;
七、视图
1.MYSQL5之后加入
2.包含的是动态查询语句,虚拟表,不包括任何列
3.创建视图CREATE VIEW,之后直接FROM 视图
CREATE VIEW 视图名 AS
SELECT 语句;
八、存储过程
1.执行存储过程CALL
可以有返回值,所有变量必须以@开始
CALL 存储名称(@变量名,@变量名);
2.创建存储过程
没有参数也要加(),
OUT参数从存储过程传出的值,
IN 传给存储过程,
INTO保存变量的关键字
CREATE PROCEDURE 存储名称(
out pl DECIMAL(8,2),
IN pa INT
)
BEGIN
SELECT MIN(price)
INTO pl
FROM products;
SELECT MAX(price)
INTO pa
FROM products;
END;
3.删除存储过程
DROP PROCEDURE 存储名称;
4.检查存储过程
SHOW CREATE PROCEDURE 存储名称;
九、游标
1.定义:存储在MYSQL服务器上的数据库查询,被SELECT检索出来的结果集
2.使用原因:在检索出来的行中前进或后退一行或多行
3.创建游标DECLARE,打开游标OPEN,关闭游标CLOSE,从第一行开始检索变量FETCH
4.循环检索游标
5.查询游标
SELECT *
FROM 游标名;
十、SQL中的数据类型
1.串数据类型
定长字符串CHAR,变长字符串TEXT
电话号码/邮政编码这些有0的字段,应该存在字符串中,而不是数值字段里,用单引号括起来
2.数值数据类型
UNSIGNED表示非负,正向可以扩大两倍
货币类型用DECIMAL(8,2)
3.时间数据类型
4.二进制数据类型
可以存储各种类型的数据