DQL(数据查询语言)

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的统计

猜你喜欢

转载自blog.csdn.net/qq_36194262/article/details/82940943