-- 结果集中会自动去重复数据 SELECTDISTINCT Company FROM Orders ;
-- 表 Persons 字段 Id_P 等于 Orders 字段 Id_P 的值, -- 结果集显示 Persons表的 LastName、FirstName字段,Orders表的OrderNo字段 SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P;
-- gbk 和 utf8 中英文混合排序最简单的办法 -- ci是 case insensitive, 即 “大小写不敏感” SELECT tag, COUNT(tag) from news GROUPBY tag orderbyconvert(tag using gbk) collate gbk_chinese_ci; SELECT tag, COUNT(tag) from news GROUPBY tag orderbyconvert(tag using utf8) collate utf8_unicode_ci;
UPDATE
Update 语法 语句用于修改表中的数据。
1
UPDATE 表名称 SET 列名称1= 值1, 列名称2= 值2, ... WHERE 条件;
1 2 3 4 5 6
-- update语句设置字段值为另一个结果取出来的字段 UPDATEuserset name = (SELECT name from user1 WHERE user1.id =1 ) WHERE id = (SELECT id from user2 WHERE user2.name='小帆');
-- 更新表 orders 中 id=1 的那一行数据更新它的 title 字段 UPDATE `orders` set title='这里是标题'WHERE id=1;
-- 列出所有在中国表(Employees_China)和美国(Employees_USA)的不同的雇员名 SELECT E_Name FROM Employees_China UNIONSELECT E_Name FROM Employees_USA
-- 列出 meeting 表中的 pic_url, -- station 表中的 number_station 别名设置成 pic_url 避免字段不一样报错 -- 按更新时间排序 SELECT id,pic_url FROM meeting UNIONALL SELECT id,number_station AS pic_url FROM station ORDERBY update_at;
-- 通过 UNION 语法同时查询了 products 表 和 comments 表的总记录数,并且按照 count 排序 SELECT'product'AS type, count(*) as count FROM `products` union select'comment'as type, count(*) as count FROM `comments` orderby count;
UNION ALL 不会去重!
BETWEEN
BETWEEN 语法 运算符选择给定范围内的值
1
SELECT 列名称(s) FROM 表名称 WHERE 列名称 BETWEEN 值1AND 值2;
-- 列出表 Orders 字段 OrderPrice 列最大值, -- 结果集列不显示 OrderPrice 显示 LargestOrderPrice SELECTMAX(OrderPrice) AS LargestOrderPrice FROM Orders
-- 显示表 users_profile 中的 name 列 SELECT t.name from (SELECT*from users_profile a) AS t;
-- 表 user_accounts 命名别名 ua,表 users_profile 命名别名 up -- 满足条件 表 user_accounts 字段 id 等于 表 users_profile 字段 user_id -- 结果集只显示mobile、name两列 SELECT ua.mobile,up.name FROM user_accounts as ua INNERJOIN users_profile as up ON ua.id = up.user_id;
JOIN
JOIN 子句用于根据两个或多个表之间的相关列组合来自两个或多个表的行。
JOIN: 如果表中有至少一个匹配,则返回行
INNER JOIN:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行(MySQL 是不支持的,通过 LEFT JOIN + UNION + RIGHT JOIN 的方式 来实现)
INNER JOIN
INNER JOIN 语法 选择在两个表中具有匹配值的记录。
1 2 3 4
SELECT 列名称(s) FROM 表1 INNERJOIN 表2 ON 表1.列名称 = 表2.列名称;
1 2 3 4 5 6 7 8
-- 选择包含 Customers 的所有 Orders: SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNERJOIN Customers ON Orders.CustomerID = Customers.CustomerID;
-- [JOIN 三张表] 选择包含 Customers 和 Shippers 的所有 Orders: SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName FROM Orders INNERJOIN Customers ON Orders.CustomerID = Customers.CustomerID) INNERJOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
LEFT JOIN
LEFT JOIN 语法 返回左表 (表1) 中的所有记录,以及右表 (表2) 中的匹配记录
1 2 3 4
SELECT 列名称(s) FROM 表1 LEFTJOIN 表2 ON 表1.列名称 = 表2.列名称;
1 2 3 4
-- 将选择所有 Customers 以及他们可能拥有的任何 Orders: SELECT Customers.CustomerName, Orders.OrderID FROM Customers LEFTJOIN Orders ON Customers.CustomerID = Orders.CustomerID ORDERBY Customers.CustomerName;
RIGHT JOIN
RIGHT JOIN 语法 返回右表 (表2) 中的所有记录,以及左表 (表1) 中的匹配记录
1 2 3 4
SELECT 列名称(s) FROM 表1 RIGHTJOIN 表2 ON 表1.列名称 = 表2.列名称;
1 2 3 4
-- 返回所有 Employees 以及他们可能下的任何 Orders: SELECT Orders.OrderID, Employees.LastName, Employees.FirstName FROM Orders RIGHTJOIN Employees ON Orders.EmployeeID = Employees.EmployeeID ORDERBY Orders.OrderID;
FULL OUTER JOIN
FULL OUTER JOIN 语法 当左(表1)或右(表2)表记录中存在匹配时,关键字返回所有记录
1 2 3 4 5
SELECT 列名称(s) FROM 表1 FULLOUTERJOIN 表2 ON 表1.列名称 = 表2.列名称 WHERE 条件;
SQL 函数
COUNT
COUNT 语法 返回与指定条件匹配的行数
1
SELECTCOUNT(列名称) FROM 表名称 WHERE 条件;
1 2 3 4 5 6 7 8 9
-- 表 Store_Information 有几笔 store_name 栏不是空白的资料。 -- "IS NOT NULL" 是 "这个栏位不是空白" 的意思。 SELECTCOUNT (Store_Name) FROM Store_Information WHERE Store_Name ISNOT NULL;
-- 获取 Persons 表的总数 SELECTCOUNT(1) AS totals FROM Persons;
-- 获取表 station 字段 user_id 相同的总数 select user_id, count(*) as totals from station groupby user_id;
AVG
AVG 语法 返回数值列的平均值
1
SELECTAVG(列名称) FROM 表名称 WHERE 条件;
1 2
-- 查找 Products 表中所的 Price 平均值: SELECTAVG(Price) FROM Products;
SUM
SUM 语法 返回数值列的总和
1
SELECTSUM(列名称) FROM 表名称 WHERE 条件;
1 2
-- 查找 OrderDetails 表中 Quantity 字段的总和: SELECTSUM(Quantity) FROM OrderDetails;
MAX
MAX 语法 返回所选列的最大值
1
SELECTMIN(列名称) FROM 表名称 WHERE 条件;
1 2 3
-- 列出表 Orders 字段 OrderPrice 列最大值, -- 结果集列不显示 OrderPrice 显示 LargestOrderPrice SELECTMAX(OrderPrice) AS LargestOrderPrice FROM Orders
MIN
MIN 语法 返回所选列的最小值
1
SELECTMIN(列名称) FROM 表名称 WHERE 条件;
1 2
-- 查找 Products 表中 Price 字段最小值,并命名 SmallestPrice 别名: SELECTMIN(Price) AS SmallestPrice FROM Products;
创建后表的修改
添加列
语法:alter table 表名 add 列名 列数据类型 [after 插入位置];
示例:
1 2 3 4 5 6 7 8
-- 在表students的最后追加列 address: alter table students add address char(60);
-- 在名为 age 的列后插入列 birthday: alter table students add birthday date after age;
-- 在名为 number_people 的列后插入列 weeks: alter table students addcolumn `weeks` varchar(5) not nulldefault "" after `number_people`;
修改列
语法:alter table 表名 change 列名称 列新名称 新数据类型;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-- 将表 tel 列改名为 telphone: alter table students change tel telphone char(13) default "-";
-- 将 name 列的数据类型改为 char(16): alter table students change name name char(16) not null;
-- 修改 COMMENT 前面必须得有类型属性 alter table students change name name char(16) COMMENT '这里是名字';
-- 修改列属性的时候 建议使用modify,不需要重建表 -- change用于修改列名字,这个需要重建表 alter table meeting modify `weeks` varchar(20) NOT NULLDEFAULT'' COMMENT '开放日期 周一到周日:0~6,间隔用英文逗号隔开';
-- `user`表的`id`列,修改成字符串类型长度50,不能为空,`FIRST`放在第一列的位置 alter table `user` modify COLUMN `id` varchar(50) NOT NULLFIRST ;
删除列
语法:alter table 表名 drop 列名称;
1 2
-- 删除表students中的 birthday 列: alter table students drop birthday;
重命名表
语法:alter table 表名 rename 新表名;
1 2
-- 重命名 students 表为 workmates: alter table students rename workmates;