CREATE TABLE USER(
id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT "编号",
password VARCHAR(256) NOT NULL COMMENT '密码',
nickName VARCHAR(32) NOT NULL COMMENT '昵称',
bio VARCHAR(256) COMMENT '简介'
PRIAMRY KEY(id)
)
ALTER TABEL 原表名 RENAME 新表名
ATTER TABLE table_name ADD cloumn_name datatype
例如:
ALTER TABLE USER ADD sid VARCHAR(128) NOT NULL COMMENT 'Cookie'
ALTER TABLE table_name DROP COLUNM column_name
ALTER TABLE table_name DROP INDEX index_name
例如:
ALTER TABLE USER DROP COLUMN sid1
ALTER TABLE table_name ALTER COLUMN column_name datatype
例如:
ALTER TABLE USER MODIFY COLUMN bio int COMMENT '简介'
ALTER TABLE table_name CHANGE COLUMN column_name new_column_name datatype
例如:
ALTER TABLE USER CHANGE COLUMN id id1 INT UNSIGNED NOT NULL COMMENT '编号'
*删除数据库/表
DROP DATABASE 数据库名
DROP TABLE 表名
TRUNCATE TABLE 表名
DROP TABLE 表名
DELETE FROM 表名 WHERE……
INSERT INTO 表名 VALUES(value1,value2,value3……)
例如:
INSERT INTO USER VALUES('KyLin','123456')
INSERT INTO 表名(列1,列2……) VALUES(值1,值2……)
INSERT INTO User(id,nickName,password,email,votes) VALUES(1,'KyLin','123456','[email protected]',1)
UPDATE 表名 SET 列名1=新值1,列名2=新值2…… WHERE 条件
例如:
UPDATE USER SET nickName='overload',sid='you guess guess' WHERE id=1
DELETE FROM 表 WHERE 条件
例如:
DELETE FROM USER WHERE id=1
DELETE FROM USER
SLECT DISTINCT 列名 FROM 表
SELECT 列名 FROM 表 WHERE 列 运算符 值(条件)
运算符
= != > >= < <= BETWEEN(在某个范围内) LIKE(某种搜索方式)
例如:
SELECT id FROM USER WHERE nickName='overload'
AND和OR同时使用:
选出姓为'Thomas'或者为'William'并且名为'Carter'的人的信息
SELECT * FROM Persons WHERE (FirstName='Thomas' or FirstName=='William') AND LastName='Carter'
小建议:尽可能的减少or的使用(用in代替),因为使用了or,效率呈指数型下降
可以对多个列进行不同的排序,满足的条件是从左往右依次选择
例如:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC,OrderNumber ASC
结果:
先对所有的结果集按照Company降序排序,如果有相同的Company结果,则按照OrderNumber升序排序
SELECT * FROM book_borrow_history LIMIT 0,5
SELECT * FROM USER WHERE nickName LIKE '广%'
通配符 | 描述 |
---|---|
% | 代替一个或者多个字符 |
_ | 仅代替一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist]或者[!charlist] | 不在字符列中的任何单一字符 |
"Persons" 表中选取名字的第一个字符之后是 "eorge" 的人:
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:
SELECT * FROM Persons WHERE City LIKE '[ALN]%'
选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:
SELECT * FROM Persons WHERE City LIKE '[!ALN]%'
SELECT * FROM TABLE WHERE COLUMN_NAME IN (value1,value2……)
例如: 选取姓氏为 Adams 和 Carter 的人
SELECT *FROM Persons WHERE FirstName IN('Adams','Carter')
则只要是满足这个条件(相当于OR)的都会显示出来
SELECT * FROM TABLE WHERE COLUNM_NAME BETWEEN VALUE1 AND VALUE2
注意:mysql的是[value1,value2) 是这样一种范围
如果想表示不在这个范围内,则加上NOT即可
当BETWEEN……AND的值是文本的时候,则表明选取的是表中在这个范围之间的记录
例如:
SELECT * FROM Persons WHERE lastName BETWEEN 'Adams' ADN 'Carter'
则选取出来的结果就是 Adams和Bush这两条的记录
Persons表
lastName | firstName |
---|---|
Adams | John |
Bush | George |
Carter | Thomas |
Gates | Bill |
SELECT b.book_name AS BOOKNAME,b.stu_id AS ID FROM book_borrow_history AS b WHERE b.stu_id='1506200043'
SELECT CLOUMN_NAME(S) FROM TABLE_NAME1 INNER JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN
关键字:INNER JOIN……ON 条件
查询用户的订单,没有用户的订单不显示
SELECT user.name,orders.* FROM user INNER JOIN orders ON user.id=orders.user_id
SELECT COLUMN_NAME(S) FROM TABLE_NAME1 LEFT JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN ORDER BY COLUMN_NAME DESC(ASC)
关键字:LEFT JOIN……ON 条件
查询所有用户的订单详情——即是以用户为主体,所有的用户都要显示
SELECT user.name,orders.* FROM user LEFT JOIN orders ON user.id=orders.user_id
SELECT COLUMN_NAME(S) FROM TABLE_NAME1 RIGHT JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN
SELECT COLUMN_NAME(S) FROM TABLE_NAME1 FULL JOIN TABLE_NAME2 ON TABLE_NAME1.COLUMN=TABLE_NAME2.COLUMN
一行一列(单个值):使用 =
SELECT id FROM Users WHERE NAME='张三'
SELECT * FROM Orders WHERE user_id='张三的id'
整合:
SELECT *FROM Orders WHERE user_id=(SELECT id FROM Users WHERE NAME='张三')
一行多列(多个值):使用 IN
SELECT user_id FROM Orders WHERE price>300
SELECT *FROM Users WHERE id='从订单表获取到的user_id'
整合:
SELECT *FROM Users WHERE id in(SELECT user_id FROM Orders WHERE price>300)
多行多列(相当于另外一个表)
SELECT Orders.* FROM Orders WHERE price>300
整合在一起(基本写法)
SELECT Temp.*,Users.* FROM Users,(SELECT Orders.* FROM Orders WHERE price>300) AS Temp WHERE Temp.user_id=Users.id
内连接写法:
SELECT Orders.*,Users.* from Orders INNER JOIN Users ON Users.id=Orders.user_id and orders.price>300;
SELECT COLUMN_NAME(S) FROM TABLE_NAME1
UNION
SELECT COLUMN_NAME(S) FROM TABLE_NAME2
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
Employees_China:
E_ID | E_NAME |
---|---|
01 | Zhang, Hua |
02 | Wang, Wei |
03 | Carter, Thomas |
04 | Yang, Ming |
Employees_USA:
E_ID | E_NAME |
---|---|
01 | Adams, John |
02 | Bush, George |
03 | Carter, Thomas |
04 | Gates, Bill |
则如果想获取两个表的所有雇员的话
SELECT E_NAME FROM Employees_China
UNION
SELECT E_NAME FROM Employees_USA
这样会对重复的名字进行任意的选取其中之一,若想显示全部的话UNION ALL
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME)
注释:"COLUMN_NAME" 规定需要索引的列。
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name ON table_name (column_name)
例如:
如果希望以降序索引某个列中的值,可以在列名称之后添加保留字 DESC:
CREATE INDEX PersonIndex On Person(firstName DESC)
如果希望索引不止一个列,可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX PersonIndex ON Person (lastName, firstName)
VIEW视图
希望查找每个客户的订单总额
错误:
SELECT Customer,SUM(OrderPrice) FROM Orders
错误原因:首先SUM(OrderPrice)返回的是一个值,如果没有使用group by
的话,那么就是计算的所有客户的订单的总额
正确:
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
正确原因:因为使用的GROUP BY,那么相同客户的订单(一个客户可以有多个订单)就会合并在一起,那么SUM()出来的就是每个客户自己的订单的总额
扩展:
也可以对多个列进行GROUP BY操作
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate
SELECT column_name,aggregate_function(column_name),FROM table_name where column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) OPERATOR VALUE
找出订单总金额少于2000元的客户
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000
希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额
SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer in("Bush","Adams") GROUP BY Customer HAVING SUM(OrderPrice)>1500