#创建数据库
create database if not exists test;
#使用数据库并指定字符集
use test character set utf8;
-- 创建学生表
create table student(seque int,student_name varchar(20),Student_ID int(11));
单列插入+全行数据
sql复制代码
-- 单行插入
insert into 表名 (列名,列名,列名,...) values(值,值,值,...);
-- 多行插入
insert into 表名 (列名,列名,列名,...)
values(值,值,值,...),
(值,值,值,...),
(值,值,值,...);
注意:
对于全行数据插入时,列名可以省略不写
对于指定列插入时,需要在表后写相应的列名,并且在输入值的时候要对于相应的列名输入值。
在插入数据的时候,表中有多少列,相应插入的value值就要有多少个。(在没有指定列的情况下)
示例:
sql复制代码
-- 单行插入+全列
insert into student values(6,"李逵",11223);
-- 单行插入+指定列
insert into student (student_name,Student_ID) values("宋江",11267);
-- 多行插入+全列输入
insert into student values(2,"猪八戒",1123),
(3,"孙悟空",1124);
-- 多行插入+指定列
insert into student (student_name,Student_ID)
values("李四",1125),
("王五",1126);
-- 查看全列
select * from student;
-- 查看学生名和学号
select student_name,Student_ID from student;
2.查询字段为表达式
sql复制代码
-- 表达式不包含字段
SELECT id, name, 10 FROM exam_result;
-- 表达式包含一个字段
SELECT id, name, english + 10 FROM exam_result;
-- 表达式包含多个字段
SELECT id, name, chinese + math + english FROM exam_result
3.别名
为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称,语法:
sql复制代码
SELECT column [AS] alias_name [...] FROM table_name;
示例:
sql复制代码
-- 创建一个学生表来记录成绩
create table students(id int,name varchar(20),Chinese decimal,Math decimal,English decimal);
-- 在表中插入数据
insert into students values(1,"张三",78,88,75),
(2,"李四",87,78,90),
(3,"王五",88,86,73),
(4,"赵敏",98,88,76);
-- 查询学生的成绩总分,并给将三科总分起别名exam_result
select id,name,Chinese+Math+English as exam_result from students;
-- 查看学生表中学生的数学成绩
select math from students;
-- 进行去重
select distinct math from students;
5.排序
在查看表中数据时,返回的数据都是无序的,观赏度差,可能使用ORDER BY进行排序。
sql复制代码
SELECT 列名,列名,... FROM 表名 ORDER BY 列名 ASC/DESC;
ASC为升序,DESC 为降序,默认升序。
没有ORDER BY 的子句查询,返回的顺序都是无序的,不能依赖此顺序;
NULL数据排序,视为比任何值都小,升序时出现在最上面,降序时出现在最下面。
示例:
1.根据列名进行排序
以学生表为例,按照数学成绩进行排序
sql复制代码
-- 按照数学成绩进行排序
select * from students order by Math;
2.使用表达式 及别名进行排序
以学生表为例,按照三科总分进行升序,并将总分为设为exam_result;
sql复制代码
select id,Chinese+Math+English as exam_result from students order by exam_result;
3.可以对多个字段进行排序,排序优先级随书写顺序
sql复制代码
-- 查找学生表,依次按语文降序,数学升序,英语升序的方式进行查询
select id,name,Chinese,Math,English from students order by Chinese desc ,Math,English;
6.条件查询:WHERE
1.比较操作符
2.逻辑运算符
注意:
WHERE条件可以使用表达式,但不能使用别名。
AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分。
示例:
1.基本查询
sql复制代码
-- 查询数学成绩大于80的同学
select name,Math from students where Math>80;
-- 查询语文成绩小于90的同学
select name,Chinese from students where Chinese<90;
-- 查询英语成绩大于80的同学
select name,English from students where English>80;
2.AND&&OR查询
sql复制代码
-- 查询数学成绩大于80,并且英语成绩大于80的同学
select name,Math from students where Math>80 and English>80;
-- 查询语文成绩小于90,或者数学成绩小于80的同学
select name,Chinese from students where Chinese<90 or Math<80;
-- 观察AND 与 OR 的优先级
select * from students where Chinese > 80 or Math > 90 and English > 80;
select * from students where (Chinese > 80 or Math > 80) and English >80;
3.范围查询
between...and..
sql复制代码
-- 查询数学成绩在80到90的同学
select * from students where Math between 80 and 90;
-- 查询英语成绩在70到90的同学
select * from students where English between 70 and 90;
IN
sql复制代码
-- 查询数学成绩为88,78,50,76的同学
select * from students where Math in(88,78,50,76);
LIKE (模糊匹配)
sql复制代码
-- 查找张姓的名字
select * from students where name like "张%";
-- 查找张姓,两个字的名字
select * from students where name like "张_";
NULL的查询
sql复制代码
-- 查找没写名字的同学
select * from students where name is NULL;
-- 查询名字不为空的同学,并且数学成绩在80以上
select * from students where name is not NULL and Math>80;
-- 起始下标为 0
-- 从0开始,筛选n条结果
SELECT ... FROM TABLE_NAME [WHERE ... ] [ORDER BY ... ] LIMIT n;
-- 从 s 开始,筛选 n条结果
SELECT ... FROM TABLE_NAME [WHERE ... ] [ORDER BY ... ] LIMIT s,n;
--从 s 开始,筛选 n条结果,比第二种结果更明确,建议使用
SELECT ... FROM TABLE_NAME [WHERE ... ] [ORDER BY .. ] LIMIT n OFFSET s;
示例:按照id分页,每页记录3条,分别显示1,2,3页
sql复制代码
-- 第 1 页
SELECT id, name, Math, English, Chinese FROM students ORDER BY id LIMIT 3
OFFSET 0;
-- 第 2 页
SELECT id, name, Math, English, Chinese FROM students ORDER BY id LIMIT 3
OFFSET 3;
-- 第 3 页,如果结果不足 3 个,不会有影响
SELECT id, name, Math, English, Chinese FROM students ORDER BY id LIMIT 3
OFFSET 6;
-- 查询张三的成绩
select name,score from student inner join score on id=score.student_id and name="张三";
select name,score from student,score where id=score.student_id and name="张三";
-- 左外连接,表1完全显示
select 字段名 from 表1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;
示例:
查询所有同学的成绩,及同学的个人信息,如果该同学没有成绩,也需要显示
sql复制代码
-- 创建一个学生表
create table students (id int auto_increment,name varchar(20));
-- 创建一个成绩表,记录学生成绩
create table score(student_id int,score decimal);
-- 在学生表中添加数据
insert into students (name) values("张三"),("李四"),("王五"),("孙悟空");
-- 在成绩表中添加数据
insert into score values(1,90),(2,76),(5,35),(4,88);
-- 左外连接
select name,score from students left join score on students.id=score.student_id;
显示所有成绩
javascript复制代码
-- 右外连接
select name,score from students right join score on students.id=score.student_id;
-- 创建一个课程表
create table course(id int,name varchar(20));
-- 创建一个成绩表
create table score(score decimal,student_id int,course_id int);
-- 在课程表中插入数据
insert into course values(1,"Java"),(2,"中国传统文化"),(3,"语文"),(4,"英文"),(5,"高数");
-- 在成绩表中插入数据
insert into score values(87,1,1),(99,1,3),(98,1,5),
(88,2,2),(78,2,5),(89,3,1),
(78,3,2),(97,3,5),(40,4,1),
(89,4,5),(88,5,1),(90,5,5);
-- 在课程表中查看java和高数的序号
select * from course where name="Java" or name="高数";
-- 将两张表进行连接
select * from score as s1,score as s2;
-- 筛选出java和高数的成绩
select * from score as s1,score as s2 where s1.student_id=s2.student_id and s1.course_id=1 and s2.course_id=5;
-- 筛选出高数成绩比java成绩高的学生
select * from score as s1,score as s2 where s1.student_id=s2.student_id and s1.course_id=1 and s2.course_id=5 and s2.score>s1.score;
-- 合并查询
select 字段名 from 表名 union select 字段名 from 表名;
select * from course where id<3
union
select * from course where name='英文';
-- 或者使用or来实现
select * from course where id<3 or name='英文';
-- 可以看到结果集中出现重复数据
select * from course where id<3
union all
select * from course where name='英文';
11.子表查询(了解)
子表查询是指嵌入在其他SQL语句中的select语句中,也叫嵌套查询
单行子查询:返回一行记录的子查询
示例:查询与张三同班的同学。
sql复制代码
select * from student where class_id=(select class_id from student where name="张三");
多行子查询:返回多行记录的子查询
示例:
sql复制代码
-- 查询'语文'或'英语'的成绩
-- 使用 IN
select * from score where course_id in (select id from course where
name='语文' or name='英文');
-- 使用 NOT IN
select * from score where course_id not in (select id from course where
name!='语文' and name!='英文');
-- 修改张三的英语成绩,将其改为90
update students set English=90 where name="张三";
-- 将李四的数学改为60
update students set Math=60 where name="李四";
-- 将为空值的学生三科成绩都设为60
update students set Chinese = 60 ,Math=60,English = 60 where name is null;
-- 将总成绩倒数前三的3位同学的数学成绩加上20分
update students set Math=Math+20 order by Chinese + English + Math limit 3;
-- 将所有同学的语文成绩更新为80分
update students set Chinese = 80;
-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id
INT NOT NULL PRIMARY KEY,
sn
INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
qq_mail VARCHAR(20)
)
-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id
INT PRIMARY KEY auto_increment,
sn
INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
qq_mail VARCHAR(20)
);
-- 创建班级表,有使用MySQL关键字作为字段时,需要使用``来标识
DROP TABLE IF EXISTS classes;
CREATE TABLE classes (
id INT PRIMARY KEY auto_increment,
name VARCHAR(20),
`desc` VARCHAR(100)
);
-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT PRIMARY KEY auto_increment,
sn INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
qq_mail VARCHAR(20),
classes_id int,
FOREIGN KEY (classes_id) REFERENCES classes(id)
);
5.默认值约束(DEFAULT)
定义:如果在插入新记录时没有为某一列指定值,那么该列将自动被赋予预先定义的默认值。
在建表的时候,也可以修改默认值
sql复制代码
-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT NOT NULL,
sn INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
qq_mail VARCHAR(20)
);