SQL简介
什么是 SQL?
- SQL 指结构化查询语言
- 使我们有能力访问数据库
- SQL 是一种 ANSI 的标准计算机语言(ANSI,美国国家标准化组织)
SQL 能做什么?
- SQL 面向数据库执行查询
- SQL 可从数据库取回数据
- SQL 可在数据库中插入新的纪录
- SQL 可更新数据库中的数据
- SQL 可从数据库删除记录
- SQL 可创建新数据库
- SQL 可在数据库中创建新表
- SQL 可在数据库中创建存储过程
- SQL 可在数据库中创建视图
- SQL 可以设置表、存储过程和视图的权限
结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
SQL 语法
一个数据库通常包含一个或多个表。每个表由一个名字标识(例如“客户”或者“订单”)。表包含带有数据的记录(行)。
下面的例子是一个名为 "user" 的表:
上面的表包含四条记录(每一条对应一个人)和六个列(id、姓名、性别、年龄、邮箱、qq)。
需要在数据库上执行的大部分工作都由 SQL 语句完成。 下面的语句从表中选取 name 列的数据:
SELECT name FROM user(作用:查询“user”表里“name”这列的所有内容)
返回结果集如下:
重要事项 一定要记住,SQL语句对大小写不敏感!
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
- INSERT INTO - 向数据库表中插入数据
SQL SELECT 语句
SELECT 语句用于从表中选取数据,结果被存储在一个结果表中(称为结果集)。
SQL SELECT 语法
SELECT 列名称 FROM 表名称或者SELECT * FROM 表名称(星号(*)是选取所有列的符号)
注意:SQL 语句对大小写不敏感。SELECT 等效于 select。
//获取user表中name列和email数据列
SELECT name,email FROM user
SQL SELECT DISTINCT 语句
在表中可能会包含重复值。这并不成问题,不过,有时希望仅仅列出不同(distinct)的值,关键词 DISTINCT 用于返回唯一不同的值。
语法: SELECT DISTINCT 列名称 FROM 表名称
SELECT distinct age FROM user
SQL WHERE 子句
WHERE 子句用于规定选择的标准。 WHERE 子句 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
语法:SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在 WHERE 子句中使用:
注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=
//查询年龄在28周岁的人员信息
SELECT * FROM user WHERE age=28
//查询年龄不等于28的人员信息
SELECT * FROM user WHERE age<>28
//查询年龄大于28的人员信息
SELECT * FROM user WHERE age>28
//查询年龄小于28的人员信息
SELECT * FROM user WHERE age<28
//查询年龄在28以上48以下的人员信息
SELECT * FROM user WHERE age BETWEEN 28 AND 48
//模糊匹配查询
SELECT * FROM user WHERE email LIKE '%qq%'
引号的使用
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,建议不要使用引号。
文本值:
这是正确的:
SELECT * FROM user WHERE name='霍建华'
这是错误的:
SELECT * FROM user WHERE name=霍建华
SQL AND & OR 运算符
AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。AND 和 OR 运算符 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
//两个条件同时成立
SELECT * FROM user WHERE age=28 AND sex=2
//成立其中一个条件
SELECT * FROM user WHERE age=28 OR age=38
SQL ORDER BY 子句
ORDER BY 语句用于对结果集进行排序。
ORDER BY 语句用于根据指定的列对结果集进行排序。 如果希望按照降序对记录进行排序,可以使用 DESC 关键字。 如果希望按照升序对记录进行排序,可以使用 ASC 关键字。
//升序
SELECT * FROM user ORDER BY age ASC
//降序
SELECT * FROM user ORDER BY age DESC
SQL GROUP BY 字句
GROUP BY 语句用于对结果集进行分组。
“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
//Group By
SELECT * FROM user GROUP BY age
//Group By 和 Order By
SELECT * FROM newtable GROUP BY age ORDER BY age ASC
SQL INSERT INTO 语句
INSERT INTO 语句用于向数据表中插入新的行。
语法:INSERT INTO 表名(列名1,列名2......) VALUES(值1,值2,....)
INSERT INTO user(name,sex,age,email,qq) values('李易峰',1,18,'liyifeng@163.com',69854521)
SQL UPDATE 语句
Update语句用于修改表中的数据
语法:UPDATE 表名 SET 列名 = 新值 WHERE 列名 = 值
UPDATE user SET name='鹿晗' WHERE id=5
注意:修改表中数据时一定要带上where表达式,否则将是毁灭性的灾难,导致表中数据全部修改;
SQL DELETE 语句
DELETE语句用于删除表中的行。
语法:DELETE FROM 表名 WHERE 列名 = 值
DELETE FROM newtable WHERE id=5
注意:删除表中数据时一定要带上where表达式,否则将是毁灭性的灾难,导致表中数据全部 ;
SQL语句的规范
1.SQL语句的保留字都大写
2.SQL命令本身是不区分大小写的,但是PHP区分,所以字段名,表名之类的都按真实的大小写来写。
3.分号是一条SQL命令的结束。PHP里面单条语句一般不需要写。
4.整型值一般不需要加引号,加了也不为错。
5.-- 代表SQL语句的注释
6.写UPDATE语句和DELETE语句时,最好先写WHERE条件,避免对数据造成灾难性的破坏。
SQL常用的运算符和函数
AND 并且
IN 包含的值,例如:WHERE ID IN(1,2,3,8,10)
OR 或者
=等于
!=不等于
<>不等于
大于
< 小于
BETWEEN 数值 AND 数值
RAND() 用在ORDER BY 的后面,随机表中数据
DISTINCT(字段名) -- SELECT DISTINCT age FROM user --去掉重复值的结果
COUNT(字段名) --统计行数,一般字段为主键
MAX(字段名)
MIN(字段名)
ASC(正序),DESC -- 排序,默认情况下都是ASC
字符串连接函数:
CONCAT_WS('分隔符',第一个字符串或字段名,第2个字符串或字段名,第3个...)
说明:连接后的字符会按前后顺序串在一起.
取平均值函数:AVG
SELECT AVG(字段名) FROM table_name
UCASE转换成大写字母:
LCASE转换成小写字母:
SELECT UCASE(字段名) FROM tb_users
SING()返回数值的符号,如果是负数,返回-1
类似三元运算符的操作方法:
SELECT CASE WHEN sex<age THEN sex ELSE age END FROM USER
select (case when sex>age then sex else age end),(case when qq>age then qq else age end) from user
SQL常用的查询语句
SELECT fname,id FROM ttt WHERE id=1;
SELECT fname,id FROM ttt WHERE fname='bbb';
SELECT fname,id FROM ttt WHERE fname='bbb' OR fname='aaa';
SELECT fname,id FROM ttt WHERE fname IN('bbb' ,'aaa');
SELECT fname,id FROM ttt WHERE fname LIKE '%b%';
SELECT fname,id FROM ttt WHERE fname LIKE '%b';
SELECT fname,id FROM ttt WHERE fname LIKE '%b_';
SELECT Fname from ttt where id>1;
SELECT fname FROM ttt WHERE id>1 AND id<3; == SELECT fname FROM ttt WHERE id=2;
SELECT * FROM ttt ORDER BY id ASC或者DESC --排序功能,ASC正序,DESC倒序
SELECT * FROM ttt ORDER BY RAND() --随机取值
SELECT * FROM ttt ORDER BY RAND() LIMIT 1; --随机并且每次只显示一条
SELECT * FROM ttt LIMIT 1; --只显示一条
SELECT * FROM ttt ORDER BY id DESC LIMIT 1;
SELECT * FROM ttt LIMIT 3,2;
SELECT * FROM ttt ORDER BY id DESC LIMIT 3,1;
SELECT * FROM ttt ORDER BY id DESC,Fnum ASC;
SELECT * FROM test ORDER BY CONVERT(Fname USING gbk); 中文排序
SELECT * FROM TTT GROUP BY Fnum;
//类似PHP的函数in_array()的功能
SELECT * FROM ttt WHERE FIND_IN_SET(1,Fcateids);
//AS后面的名称自定义,即别名
SELECT COUNT(id) AS totals FROM ttt;
SELECT * FROM tb_school WHERE id IN(select fid from tb_users);
SQL常用的添加语句
INSERT INTO 表名(字段列表) VALUES(字段值列表,与字段名一定要一一对应);
例如:
INSERT INTO ttt(name,num) VALUES('小崔',1);
INSERT INTO ttt(name,num) VALUES('小王',1);
INSERT INTO ttt(name,num) VALUES('小李',1);
SQL常用的更新语句
UPDATE 表名 SET 字段名='字段值' WHERE 条件
例如:
UPDATE ttt SET name='小崔' WHERE 条件;
UPDATE ttt SET name='小崔';
UPDATE ttt SET name='cccc' WHERE id=4; --不存在的数据,表不会被做任何更改
UPDATE ttt SET num=num+1 WHERE id=1;
SQL常用的删除语句
DELETE FROM 表名 WHERE条件 --清空表,删除数据,不是删除表
拓展
- 有主从关系查询语句
SELECT A.id,B.name,B.sex FROM product_category_test A,t2 B WHERE A.Fid=B.Fid;
SELECT * FROM 一表 JOIN 二表 WHERE 一表.id = 二表.uid;
- 无主从关系查询语句
SELECT 字段名 FROM 一表 UNION SELECT 字段名 FROM 二表;
-
去重统计
select account,sum(price) as priceAll from betting where (account,price) in (select account,price from betting)
任务
复习今日所讲内容,反复练习SQL语句,熟练为止;