1. 初识sql
MySQL通过命令行导入sql脚本
- 下载示例数据库(
yiibaidb
) - 通过命令行创建数据库并导入
// 登录
➜ mysql -uroot -p
// 创建数据库, 切换的到新创建的库
➜ CREATE DATABASE IF NOT EXISTS yiibaidb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
➜ use yiibaidb;
// 导入刚下载的脚本
➜ source ~/Documents/MySQL/source/yiibaidb/yiibaidb.sql;
// 导入完毕后,查询导入的数据
➜ select city,phone,country from `offices`;
2. 什么是SQL, 什么是MySQL?
SQL是一种用于操作数据库的语言。SQL是用于所有数据库的基本语言。不同数据库之间存在较小的语法更改,但基本的SQL语法基本保持不变。SQL是S tructured Q uery Language 的简短缩写。SQL是操作关系数据库管理系统的标准语言。
MySQL是MYSQL是数据库软件。使用MYSQL存储,检索,修改和管理数据库的RDBMS。
3. 常用SQL语句
查询,解释语句
解释语句关键: explain
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。(QEP:sql生成一个执行计划query Execution plan)
# 查询语法
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
# 示例
select * from runoob_tbl;
# 解释语句
explain select * from servers;
去重语句关键字:DISTINCT
SELECT DISTINCT name, id FROM users;
SELECT *, COUNT(DISTINCT name) FROM table GROUP bY name
查询前n条数据 LIMIT
SELECT id, name FROM users LIMIT n; // 查询前n条数据
SELECT id, name FROM users LIMIT 1, 4; // 查询2、3、4条数据
CASE … WHEN语句
# 语法
CASE <单值表达式>
WHEN <表达式值> THEN <SQL语句或者返回值>
WHEN <表达式值> THEN <SQL语句或者返回值>
...
WHEN <表达式值> THEN <SQL语句或者返回值>
ELSE <SQL语句或者返回值>
END
# 示例
select *,(CASE sex WHEN '1' THEN '男' WHEN '0' THEN '女' ELSE '保密' END) as sex_text from user
条件查询 WHERE
SELECT select_list FROM table_name WHERE search_condition;
通配符 | 描述 |
---|---|
% | 替代 0 个或多个字符 |
_ | 替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或 [!charlist] | 不在字符列中的任何单一字符 |
操作符 | 描述 |
---|---|
+ | 加法运算 |
_ | 减法运算 |
* | 字符列中的任何单一字符 |
/ | 不在字符列中的任何单一字符 |
% | 求余运算,返回余数 |
比较运算符 | 描述 |
---|---|
== | 加法运算 |
<=> | 安全的等于 |
<> 或者 != | 不等于 |
<= | 小于等于 |
>= | 大于等于 |
> | 大于 |
< | 小于 |
IS NULL | 值是否为NULL |
IS NOT NULL | 值是否不为NULL |
LEAST | 当有2个或多个参数时,返回最小值 |
GREATEST | 当有2个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
IN | 判断一个值是否在两个值之中 |
LIKE | 通配符匹配 |
REGEXP | 正则匹配 |
GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
使用 WITH ROLLUP
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
# 语法
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
# 示例
SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
ORDER BY , ASC 是升序,DESC是降序,默认情况是按升序排列。
SELECT column1, column2,...
FROM tbl
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC],...
4. 作业练习
-- 创建数据库
CREATE DATABASE db_demo;
-- # 任务1
-- 创建数据表
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');
-- 查找重复的邮箱
-- 思路:现将数据根据Email分组,并统计数量,数量大于1的则为重复数据
SELECT Email
FROM email
GROUP BY Email
HAVING COUNT(*) > 1;
-- # 任务2
-- 创建数据表
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);
参考地址: