-
导入示例数据库
教程 -
SQL是什么?MySQL是什么?
2.1 SQL
SQL(/ˈsiːkwəl/,Structured Query Language,结构化查询语言),用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。
SQL的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。
SQL在1986年成为美国国家标准学会(ANSI)的一项标准,在1987年成为国际标准化组织(ISO)标准。虽然有这一标准的存在,但大部分的SQL代码在不同的数据库系统中并不具有完全的跨平台性。
2.2 MySQL
MySQL原开发者为瑞典的MySQL AB公司,该公司于2008年被Sun Microsystems收购。2009年,Oracle收购Sun Microsystems。
特点:开源 ;关系型;规模小、功能有限。 -
查询语句 SELECT FROM
3.1 语句解释
从表中选择数据
SELECT attribute_name, ...
FROM table_name
3.2 查重语句
SELECT
attribute_name
FROM
table_name
GROUP BY
attribute_name
HAVING
COUNT(attribute_name) > 1;
3.3 前N个语句
SELECT *
FROM table_name
ORDER BY attribute_anme DESC
LIMIT n
OFFSET n
3.4 CASE…END判断语句
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
WHEN 条件3 THEN 结果3
.........
WHEN 条件N THEN 结果N
END
- 筛选语句 WHERE
4.1 语法
SELECT attribute_name
FROM table_name
WHERE attribute_name operator value
属性名不要求相同。
4.2 运算符/通配符/操作符
operator 描述
= 等于
<> 不等于
大于
< 小于
= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
- 分组语句 GROUP BY
5.1 语句解释
GROUP BY语句根据一个或多个列对结果集进行分组。
SELECT attribute_name
FROM table_name
WHERE attribute_name operator value
GROUP BY attribute_name
属性名不要求相同。
5.2 HAVING子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
示例:
SELECT attribute_name, aggregate_function(attribute_name)
FROM table_name
WHERE attribute_name operator value
GROUP BY attribute_name
HAVING aggregate_function(attribute_name) operator value
- 排序语句 ORDER BY
ORDER BY语句用于根据指定的列对结果集进行排序。默认按照升序,添加DESC关键字可改成降序。
6.1 正序、逆序
SQL默认按照升序(ASC),添加DESC关键字可改成降序。
- 函数
7.1 时间函数
dayofweek():返回date为星期几,odbc标准,周天为1
weekday():返回date为星期几
dayofmonth():月中第几日
dayofyear():年中第几日
month():返回月份
dayname():星期英文名
monthname():月份英文名
quarter():一年的第几个季度
week(date,first):为一年的第几周,default:first:=0,周日开始,1为从周一开始…
year():返回年份
hour():返回小时
minute():返回分钟
second():返回秒数
period_add():增加月份
period_diff():相差的月份
date_add(date,interval expr type):增加对应的时间单位
date_sub(date,interval expr type):减去对应的时间单位
date_format():字符串格式化date
now():返回当前datetime
curdate():当前date
curtime():当前time
7.2 数值函数
abs(x):绝对值
ceil(x):大于数值的最大整数
floor(x):小于数值的最大整数
mod(x, y):取余
rand():[0,1)区间的随机小数
round(x, y):返回参数x四舍五入后的有y位小数的结果
truncate(x, y):返回参数x截断为y位小数的结果
7.3 字符串函数
concat():连接字符串
insert():替换子串内容
lower():所有字母小写
upper():所有字母大写
left():返回最左边的字符
right():返回最右边的字符
lpad():最左端填充n个长度的字符串
rpad():最右端填充n个长度的字符串
ltrim():去左边空格
rtrim():去右边空格
trim():去左右空格
repeat():返回重复n次的字符串
replace():替换子串内容
strcmp():比较两个字符串
substring():取子串
- SQL注释
SQL语句中的单行注释使用–,多行注释采用/…/
- SQL代码规范
- 作业
10.1 查找重复的电子邮箱(难度:简单)
创建表,表名accounts。再输入records。
CREATE TABLE email (
ID INT NOT NULL PRIMARY KEY,
Email VARCHAR(255)
);
INSERT INTO email VALUES('1','a@b.com');
INSERT INTO email VALUES('2','c@d.com');
INSERT INTO email VALUES('3','a@b.com');
查重
SELECT Email
FROM accounts
GROUP BY Email
HAVING COUNT(Email)>1;
10.2 查找大国
建表,表名world。再输入records。
CREATE TABLE World (
name VARCHAR(50) NOT NULL,
continent VARCHAR(50) NOT NULL,
area INT NOT NULL,
population INT NOT NULL,
gdp INT NOT NULL
);
INSERT INTO World
VALUES('Afghanistan','Asia',652230,25500100,20343000);
INSERT INTO World
VALUES('Albania','Europe',28748,2831741,12960000);
INSERT INTO World
VALUES('Algeria','Africa',2381741,37100000,188681000);
INSERT INTO World
VALUES('Andorra','Europe',468,78115,3712000);
INSERT INTO World
VALUES('Angola','Africa',1246700,20609294,100990000);
查找大国(条件:国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万))
SELECT name, population, area
FROM world
WHERE area > 3000000 OR (population > 25000000 and GDP > 20000000);