DQL(数据查询语言)
查
查询所有的列
SELECT * FROM student;
SELECT id, name FROM student;
查看表结构
DESC student;
SHOW CREATE TABLE student;
结果:
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`age` int(11) NOT NULL DEFAULT '18',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
引擎:默认innodb,默认字符集为utf-8,一个汉字占3个字节,gbk占2个字节
【函数】
【数学函数】
求绝对值
SELECT ABS(-5);
求比这个数大的最小整数
SELECT CEILING(-6.1);
SELECT CEIL(-6.1);
求比这个数小的最大整数
SELECT FLOOR(-6.1);
求最大值
SELECT GREATEST(100,5,13);
求最小值
SELECT LEAST(5,3,7);
求模 %
SELECT MOD(10, 6);
四舍五入
SELECT ROUND(10.5);
SELECT ROUND(10.516, 2);
截断
SELECT TRUNCATE(10.51999, 2);
求随机数
SELECT RAND();
SELECT RAND(5);
求平方根
SELECT SQRT(100);
【字符串函数】
字符串长度
SELECT LENGTH('hello');
SELECT LENGTH('你好');
Utf-8编码格式,一个汉字占3个字节
全部小写
SELECT LCASE('hELlo');
SELECT LOWER('hELlo');
全部大写
SELECT UCASE('hELlo');
SELECT UPPER('hELlo');
子串位置 - MYSQL中索引从1开始
SELECT POSITION('a' IN 'java');
替换
SELECT REPLACE('yesy','y','hh');
插入 - 从第2个位置开始的1个字符 替换成 xx
SELECT INSERT ('hello', 2, 1, 'xx');
拼接 -
SELECT CONCAT('hello','my','sql');
间隔符拼接
SELECT CONCAT_WS(',', 'hello','my','sql');
取左边的字符
SELECT LEFT('hello', 3);
取右边的字符
SELECT RIGHT('hello', 3);
往左边填充字符
SELECT LPAD('hello',10,'x');
往右边填充字符
SELECT RPAD('hello',10,'y');
去左边空格
SELECT LTRIM(' h e ll o ');
去右边空格
SELECT RTRIM(' h e ll o ');
去左右空格
SELECT TRIM(' h e ll o ');
子串
从第3位开始取, 取5个
SELECT SUBSTRING('51testing', 3, 5);
从第3位开始取, 取到底
SELECT SUBSTRING('51testing', 3);
【日期时间函数】
当前系统时间
SELECT SYSDATE();
SELECT NOW();
当前日期
SELECT CURRENT_DATE();
当前时间
SELECT CURRENT_TIME();
当前时间戳
SELECT CURRENT_TIMESTAMP();
获取年份
SELECT YEAR('98/9/3');
获取月份
SELECT MONTH('2018-9-3');
获取月份的名字
SELECT MONTHNAME('2018-9-3');
日期加法
SELECT DATE_ADD(NOW(),INTERVAL 3 MONTH);
【聚合函数】
求平均值
SELECT AVG(age) FROM student;
求最大值
SELECT MAX(age) FROM student;
求最小值
SELECT MIN(age) FROM student;
求和
SELECT SUM(age) FROM student;
求记录数
SELECT COUNT(age) FROM student;
【建表】
学生表
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT DEFAULT 18,
height DOUBLE);
课程表
CREATE TABLE lesson(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
teacher VARCHAR(255) DEFAULT '陈老师');
分数表
CREATE TABLE score(
sid INT,
lid INT,
score INT NOT NULL,
CONSTRAINT fk_sid FOREIGN KEY (sid) REFERENCES student(id),
CONSTRAINT fk_lid FOREIGN KEY (lid) REFERENCES lesson(id),
-- 联合主键
CONSTRAINT pk_sid_lid PRIMARY KEY (sid, lid));
加入数据
INSERT INTO student VALUES (1, '张三', 18, 169);
INSERT INTO student VALUES (2, '李四', 16, 160);
INSERT INTO student VALUES (3, '王五', 19, 181);
INSERT INTO student VALUES (4, '赵六', 29, 175);
INSERT INTO student VALUES (5, '田七', 37, 170);
INSERT INTO student VALUES (6, '王八', 108, 16);
INSERT INTO lesson VALUES (1, '前置课程', '陈老师');
INSERT INTO lesson VALUES (2, 'javaSE', '陈老师');
INSERT INTO lesson VALUES (3, '数据库', '钱老师');
INSERT INTO lesson VALUES (4, '网页制作', '董老师');
INSERT INTO lesson VALUES (5, 'javaEE', '朱老师');
INSERT INTO lesson VALUES (6, 'javaSE', '韩老师');
单表查询
SELECT * FROM student;
SELECT id, name, age, height FROM student;
别名查询(AS可以省略)
SELECT id AS 学号, name AS 姓名, age AS 年龄, height AS 身高 FROM student;
SELECT id 学号, name 姓名, age 年龄, height 身高 FROM student;
去重查询
查询所有课程的种类
SELECT DISTINCT name FROM lesson;
查询所有参加考试的学生学号
SELECT DISTINCT sid FROM score;
运算查询
SELECT score + 10 FROM score;
SELECT id, name, age + 10, height FROM student;
条件记录查询
保留170以上的
SELECT * FROM student WHERE height > 170;
保留[160, 170]
SELECT * FROM student WHERE height >= 160 AND height <= 170;
SELECT * FROM student WHERE height BETWEEN 160 AND 170;
空值查询
查询身高是空的学生信息
SELECT * FROM student WHERE height IS NULL;
查询身高不是空的学生信息
SELECT * FROM student WHERE height IS NOT NULL;
集合中记录查询
查询分数是59 69 79分的记录
SELECT * FROM score WHERE score IN (59, 69 ,79);
查询分数不是59 69 79分的记录
SELECT * FROM score WHERE score NOT IN (59, 69 ,79);
模糊查询
查询所有姓王的学生记录 _ 匹配一个字符 % 可以匹配任意多字符
SELECT * FROM student WHERE name LIKE '王_';
SELECT * FROM student WHERE name LIKE '王%';
排序查询
按照年龄排序 默认是升序
SELECT * FROM student ORDER BY age (ASC);
按照年龄降序
SELECT * FROM student ORDER BY age DESC;
多字段排序
年龄排序, 年龄相同时按照身高排序
SELECT * FROM student ORDER BY age DESC, height;
从成绩表中查找记录, 按照成绩降序排序, 成绩相同按照课程id升序排序, 成绩和课程id都相同, 按照学号升序排序
SELECT * FROM score ORDER BY score DESC, lid ASC, sid ASC;
限制数量查询(重点)
只看前5条
SELECT * FROM student LIMIT 5;
前2条不要了, 再拿5条
SELECT * FROM student LIMIT 2,5;
分页查询(重点)
每页显示2条
第1页
SELECT * FROM student LIMIT 0,2;
第2页
SELECT * FROM student LIMIT 2,2;
第3页
SELECT * FROM student LIMIT 4,2;
第4页
SELECT * FROM student LIMIT 6,2;
规律: 后面一个参数就是每页显示个数, 前面一个参数是 (页数-1)*每页显示个数
分组查询
SELECT lid, AVG(score) FROM score GROUP BY lid;
SELECT lid, score FROM score GROUP BY lid;
多表查询
SELECT * FROM student;
SELECT * FROM score;
1. 交叉连接 8 * 4 , 7 * 3 -> 56 , 7
SELECT * FROM student, score;
SELECT * FROM student CROSS JOIN score;
2. 内连接 - 只能保留两个表都有的数据
SELECT * FROM student, score WHERE student.id = score.sid;
SELECT * FROM student INNER JOIN score WHERE id = sid;
查询所有学生的学号 姓名 考试科目 任课老师和考试分数
SELECT student.id, student.name, lesson.name, lesson.teacher, score.score
FROM student, lesson, score
WHERE student.id = score.sid AND score.lid = lesson.id;
3. 外连接
左外连接 - 保留左表全部数据的前提下, 把右表拼接上来
SELECT *
FROM student LEFT JOIN score
ON student.id = score.sid;
SELECT *
FROM score LEFT JOIN student
ON student.id = score.sid;
右外连接 - 保留右表全部数据的前提下, 把左表拼接上来
SELECT *
FROM score RIGHT JOIN student
ON student.id = score.sid;
子查询
单行单列子查询
查询年龄比张三大的学生信息
SELECT *
FROM student
WHERE age > (SELECT age FROM student WHERE name = '张三');
查询考了100分的学生信息
SELECT *
FROM student
WHERE id = (SELECT sid FROM score WHERE score = 100);
SELECT student.*
FROM student,score
WHERE id = sid AND score = 100;
查询年龄和身高都和张三一样的学生信息
SELECT *
FROM student
WHERE age = (SELECT age FROM student WHERE name = '张三')
AND height = (SELECT height FROM student WHERE name = '张三')
单行多列子查询
SELECT *
FROM student
WHERE (age, height) = (SELECT age, height FROM student WHERE name = '张三');
多行单列子查询
查询考了59分的学生信息
1. IN 关键字 - 查询的条件是在子查询的查询结果中
SELECT *
FROM student
WHERE id IN (SELECT sid FROM score WHERE score = 59);
查询所有参加过考试的学生信息
SELECT *
FROM student
WHERE id IN (SELECT DISTINCT sid FROM score);
2. ANY 关键字 - 查询的条件满意子查询返回结果的任意一条记录
查询比张三, 李四, 王五中任意一个人年龄大的学生信息
SELECT *
FROM student
WHERE age > ANY (SELECT age FROM student WHERE name IN('张三', '李四', '王五'));
SELECT *
FROM student
WHERE age > (SELECT MIN(age) FROM student WHERE name IN('张三', '李四', '王五'));
3. ALL 关键字 - 查询的条件满足子查询返回结果的所有记录
查询比张三,李四,王五年龄都大的学生信息
SELECT *
FROM student
WHERE age > ALL (SELECT age FROM student WHERE name IN ('张三','李四','王五'));
SELECT *
FROM student
WHERE age > (SELECT MAX(age) FROM student WHERE name IN('张三','李四','王五'));
4. EXISTS 关键字: 查询时遍历外表, 每次查询都会执行exists子句, 存在记录时为真
SELECT * FROM student WHERE age > 20;
查询参加过考试的学生
SELECT *
FROM student
WHERE EXISTS (
SELECT *
FROM score
WHERE student.id = score.sid);
SELECT *
FROM score
WHERE 4 = score.sid
疑点
select 要显示的结果,可以带聚合函数
From
Where 在记录之前就对记录进行过滤
Group by 分类聚合的字段
Having :对聚合(分组)后的记录过滤
select count(*)和select count(1)的区别
一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的
假如表沒有主键(Primary key), 那么count(1)比count(*)快,
如果有主键的話,那主键作为count的条件时候count(主键)最快
如果你的表只有一个字段的话那count(*)就是最快的
count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column) 是不包括NULL的统计