前言
自己在工作中经常会写sql语句,用的多了就想总结一下以便以后需要用到时候查看。同时也希望对大家有用~
// 1.select 从表中选取数据
select 列名称 from 表名称
select * from 表名称
// 2.distinct 消除结果中重复的数据
select distinct 列名称 from 表名称
// 3.order by 根据制定的列对结果集进行排序(升序:ASC 降序:DESC )
(默认按升序对记录进行排序) 如果希望按照降序使用DESC关键字
order by number DESC 某一个字段从大到小排列
order by number ASC 某一个字段从小到大排列
案例:
select distinct(去掉重复的) GPA.* from 表名 (表名简写) order by 表名.字段
select distinct GPA.* from GD_PROJECT_APPLY GPA order by GPA.pro_actionid
案例:
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
以字母逆序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
以字母逆序显示公司名称,并以数字顺序显示顺序号:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
// 4.where 有条件的从表中选取数据(先执行from再执行where)
select 列名称 from 表名称 where 列 运算符 值
SELECT * FROM Persons WHERE City='Beijing'
操作符描述
------------------------------------
= 等于
<>或!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式(模糊查询)
优先级运算符
------------------------------------
1所有比较运算符
2NOT
3AND
4OR
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
SELECT * FROM Persons WHERE FirstName='Bush'
SELECT * FROM Persons WHERE Year>1965
// 5.AND & OR 运算符
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则OR 运算符显示一条记录。
案例:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
我们也可以把AND 和 OR 结合起来(使用圆括号来组成复杂的表达式):
案例:
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'
// 6.INSERT INTO 语句 用于向表格中插入新的行
INSERT INTO 表名称 VALUES (值1, 值2,....)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
我们也可以指定所要插入数据的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
// 7.Update 语句 用于修改表中的数据
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
// 8.DELETE 语句 用于删除表中的行
DELETE FROM 表名称 WHERE 列名称 = 值
// 9.AS 语句 设置列名的别名
SELECT id as pro_id from table
// 10.BETWEEN 选取介于两个值之间的数据范围.这些值可以是数值、文本或者日期
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
如需使用上面的例子显示范围之外的人,请使用NOT 操作符
// 11.IN 操作符 使用IN运算符,判断列的值是否在指定的集合中
格式:SELECT FROM table_name WHERE 列名 IN (值1,值2....)
案例:SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
// 12.IS NULL:判断列的值是否为空
格式:WHERE 列名 IS NULL;
// 13.LIKE运算符执行通配查询(模糊查询)
%:通配符:可表示零或多个字符。
_:通配符:可表示一个字符。
案例:
SELECT * FROM Persons WHERE City LIKE 'N%' 以N开头
SELECT * FROM Persons WHERE City LIKE '%g' 以g结尾
SELECT * FROM Persons WHERE City LIKE '%lon%' 包含lon
// 14.LIMIT分页查询
格式:
SELECT * FROM table_name LIMIT ?,?
SELECT * FROM table_name LIMIT beginIndex,pageSize
beginIndex = (currentPage-1) * pageSize
第一个?: 表示本页,开始索引(第多少个,从0开始)
第二个?: 每页显示的条数
案例:
规定:每页显示3条数据. pageSize = 3
第一页: SELECT * FROM `product` LIMIT 0, 3
第二页: SELECT * FROM `product` LIMIT 3, 3
第三页: SELECT * FROM `product` LIMIT 6, 3
第N页: SELECT * FROM `product` LIMIT (N-1)*3, 3
// 15.CONCAT(str1,str2,...)
1,返回结果为连接参数产生的字符串。
2,如有任何一个参数为NULL ,则返回值为 NULL
3,允许有一个或多个参数
为方便用户浏览查询的结果数据,有时需要设置显示格式,可以使用CONCAT函数来连接字符串。
需求:查询商品的名字和零售价。
格式:xxx商品的零售价为:xxx
SELECT CONCAT(productName,'商品的零售价为:',salePrice) AS productSalePrice FROM product;
// 16.聚集函数
函数说明
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
AVG()函数
SELECT AVG(prod_price) AS avg_price FROM Products;
AVG()也可以用来确定特定列或行的平均值。SELECT AVG(prod_price) AS avg_price FROM Products WHERE pro_id = '02';
COUNT()函数
(1).COUNT(*) 对表中行的数目进行计数,不管表中列包含空值(NULL)还是非空值 (警告:DISTINCT 不能用于COUNT(*))
(2).COUNT(column) 对特定列中具有值的行进行计数,忽略NULL值
SUM()函数
SELECT SUM(quantity) AS items_ordered FROM OrderItems WHERE order_num = 200;
// 17.GROUP BY 分组查询
可以使用GROUP BY 子句将表中的数据分成若干组,再对分组之后的数据做统计计算,一般使用聚集函数才使用GROUP BY.
语法格式:
SELECT ,聚集函数 FROM table_name WHERE 条件 GROUP BY 列名 HAVING 分组之后的条件
注意:GROUP BY 后面的列名的值要有重复性分组才有意义。
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
查找每个客户的总金额(总订单)
// 18.内连接查询
内连接查询:是相对于外连接。
内连接分为:隐式内连接、显示内连接(推荐),其查询效果相同,仅仅只是语法不同而已。
-----------------------------------------------
隐式内连接:
SELECT
FROMA ,B WHERE A.列 = B.列
-----------------------------------------------
显示内连接(推荐写法):
SELECT
FROMA [INNER] JOIN B ON A.列 = B.列
-----------------------------------------------
需求:查询所有商品的名称和分类名称:
隐式内连接: SELECT p.productName,pd.dirName FROM product p,productdir pd WHERE p.dir_id = pd.id
显示内连接: SELECT p.productName,pd.dirName FROM product p INNER JOIN productdir pd ON p.dir_id = pd.id
显示内连接: SELECT p.productName,pd.dirName FROM product p JOIN productdir pd ON p.dir_id = pd.id
-----------------------------------------------
在做等值连接的时候,若A表中和B表中的列名相同. 则可以简写:
SELECT
FROMA [INNER] JOIN B USING(同名的列)
前提:在emp和dept表中都有deptno列. 并且是外键关系。
如: SELECT * FROM emp JOIN dept USING (deptno)
// 19.自连接查询
把一张表看成两张来做查询.
需求: 查询每个商品分类的名称和父分类名称:
隐式内连接:
SELECT sub.dirName,super.dirName FROM productdir super,productdir sub WHERE sub.parent_id = super.id
显示内连接:
SELECT sub.dirName,super.dirName FROM productdir super JOIN productdir sub ON sub.parent_id = super.id
// 20.外连接查询
外连接:解决内连接的数据丢失问题;
外连接分为:左连接,右连接,全连接;
左连接:
SELECT table1.column, table2.column FROM table1 LEFT [OUTER] JOIN table2 ON (table1.column_name = table2.column_name);
在左连接中,会返回所有左边表table1中的行,即使在右边的表中没有可对应的列值。即对连接中左边的表中的记录不加限制
右连接:
SELECT table1.column, table2.column FROM table1 RIGHT [OUTER] JOIN table2 ON (table1.column_name = table2.column_name);
RIGHT OUTER JOIN中会返回所有右边表table2中的行,即使在左边的表中没有可对应的列值。即对连接中右边的表中的记录不加限制
SQL的执行顺序(重点):
1.先执行FROM子句: 确定查询哪一张表
2.接着执行WHERE : 过滤筛选条件
3.接着做SELECT : 确定选择的列
4.最后做ORDER BY: 对结果集按照某列排序
在WHERE子句中不能使用SELECT中的别名
多表查询:
单表查询:从一张表中查询数据
SELECT FROM table_name
多表查询:从多张表中联合查询出数据
SELECT FROM 表名A,表名B,表名C
数据库对象_约束
1.非空约束(NK):NOT NULL,不允许某列的内容为空。
2.设置列的默认值:DEFAULT。
3.唯一约束(UK):UNIQUE,在该表中,该列的内容必须唯一。
4.主键约束:PRIMARY KEY, 非空且唯一。
5.主键自增长:AUTO_INCREMENT,从1开始,步长为1。
6.外键约束:FOREIGN KEY,A表中的外键列.A表中的外键列的值必须参照于B表中的某一列(B表主键)。
注意:在MySQL中,InnoDB支持事务和外键.
修改表的存储引擎为InnoDB: ALTER TABLE 表名 ENGINE='InnoDB'