1和2和3章:
ORDER BY line1,line2 DESC/ASC
排序,order用在 select语句的最后一行
LIMIT 5 OFFSET 5
从第5条开始取5条
4和5过滤数据
.where语句操作
=等于 | >大于 |
<>不等于 | >=大于等于 |
!=不等于 | !>不大于 |
<小于 | BETWEEN两个值之间 |
<=小于等于 | IS NULL为null值 |
!不等于 | IN |
AND优先级比OR大,用()括号确定优先级
NOT操作符不单独使用,否定后面跟的任何条件
例如:SELECT * FROM product WHERE NOT vendid='DLL01';
NOT和IN语句在子查询中十分有用
6.通配符
用LIKE匹配时,%可匹配多个字符,_为一个字符,[]里为字符集
7.计算字段
CONCAT()用于连接,TRIM()用于去掉空格,NOW()当前时间,列类型为数字时可用+-*/
例如:SELECT CONCAT(name, '(' , contry , ')' ) FROM vendors;
AS
SELECT NAME AS '姓名' FROM HW_NAME;
8.使用数据处理函数
SUBSTRING()取子串,CONVERT()类型转换,UPPER(),LOWER(),LENGTH(),TRIM()
CURDATE(),YEAR()
ABS(),EXP(),SQRT()
9.汇总数据
AVG(),COUNT(),MAX(),MIN(),SUM()
AVG()忽略null的行,聚集函数默认ALL,可用DISTINCT
AVG(DISTINCT price) AS 价格
10.分组数据
GROUP BY
HAVING
HAVING支持所有的where操作,where相当于分组前过滤,having是分组后过滤
11.运用子查询进行过滤
SELECT cust_name,cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Order
WHERE order_num ='1');
格式
12和13.联结表
INNER JOIN 等值联结,把不匹配的不显示
使用表别名SELECT CONCAT(TRIM(vend_name),'(',vend_contry,')') AS title FROM vendor ;
还有LEFT JOIN ,RIGHT JOIN.形成笛卡尔乘积形式
用联结时,要用on进行选择
14.组合查询
UNION组合多条SQL语句。
如想获得名叫‘james’的数据和家在'UN'的人的数据,也可用OR来获得,当表多时UNION可以体现优势
UNION从查询结果集中自动去除了重复的行。
想要重复的话用UNION ALL。
15.插入数据
INSERT INTO Customers(cu_id,cu_name) VALUES('100','ysg');指定行,提高可移植性
从其他表插入INSERT INTO Customers(name,age) SELECT aname,grade FROM CustNew;
16.更新和删除数据
UPDATE Cust_order
SET name='ysg' where id=12;
DELETE FROM CUST WHERE ID=13;更新和删除都要用where,否则就会导致全部变化。
TRUNCATE TABLE Cust;更快速的全删表的内容。因为不记录数据的变动
17.创建表更改表
CREATE TABLE Order(
num char(20) not null default 1;
);
ALTER TABLE Order
ADD name char(20);
ALTER TABLE Order
DROP COLUMN name;
18.使用视图
CREATE VIEW Orderview AS
SELECT * FROM ORDER
WHERE name='ysg';方便,简化操作
重用sql语句,保护数据.视图不能索引.
19.使用存储过程
封装,简化客户端操作,安全,存储过程以编译过的形式存储提高性能
CALL AddNewPro('ysg',12,23);
下面是一个使用OUT参数的简单的存储程序的例子。例子为,在 程序被定义的时候,用mysql客户端delimiter命令来把语句定界符从 ;变为//。这就允许用在 程序体中的;定界符被传递到服务器而不是被mysql自己来解释。
mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
OUT param1 INT的意思是,param1的是向外传参,IN是向内传参,INOUT是既向内也向外传参。
INTO param1 进入param参数。[begin_label:] BEGIN[statement_list]END [end_label]存储子程序可以使用BEGIN ... END复合语句来包含多个语句。statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。
复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的。
20.事物管理
START TRANSACTION或BEGIN语句可以开始一项新的事务。COMMIT可以提交当前事务,是变更成为永久变更。ROLLBACK可以 回滚当前事务,取消其变更。SET AUTOCOMMIT=0语句可以禁用autocommit模式,用于当前连接。
START TRANSACTION;SELECT @A:=SUM(salary) FROM table1 WHERE type=1;UPDATE table2 SET summary=@A WHERE type=1;COMMIT;
SAVEPOINT step1;占位符,可用于部分回退。ROLLBACK TO step1;
21.使用游标
游标检索结果集,相当于迭代器。只读,不能删改。
并不适合web开发。
22.高级SQL特性
外键:引用完整性,数据安全
唯一约束:值唯一,UNIQUE
检查约束:例CHECK(num>0)只能大于0,content CHECK(content LIKE '[MK]')只能是M或K
索引:排序数据以加快搜索和排序操作的速度。索引改善查找速度,但降低数据插入,修改删除的性能;索引数据要占据大量空间。CREATE INDEX prod_name_ind ON Product(pro_name);索引列只能是一个。