本文通过对MySQL进行表查询来学习MySQL的基本操作。
MySQL:
(MySQL的SQL不区分大小写)
登录:
mysql -u root -p
查看数据库
show databases;
选择数据库
use table_name;
查看选定数据库的表
show tables;
创建数据库(删除将create 改为drop)
create database 数据库名;
创建表(删除:DROP TABLE table_name ;)
create table table_name (column_name column_type);
删除数据(删除特定记录)
DELETE FROM table_name [WHERE Clause]
- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
- 你可以在 WHERE 子句中指定任何条件
删除,添加或修改表字段(alter)
比如:
ALTER TABLE test_tbl DROP id;
ALTER TABLE test_tbl ADD id INT FIRST;
ALTER TABLE test_tbl MODIFY name CHAR(10);
-- 修改表名
ALTER TABLE test_tbl RENAME TO alter_tbl;
-- 修改存储引擎:修改为myisam
alter table tableName engine=myisam;
-- 删除外键约束:keyName是外键别名
alter table tableName drop foreign key keyName;
插入数据(通用),如果数据是字符型,必须使用单引号或者双引号,如:“value”。)
insert into table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
查询数据( [ ] 代表可选)
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
- 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
- SELECT 命令可以读取一条或者多条记录。
- 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
- 你可以使用 WHERE 语句来包含任何条件。
- 你可以使用 LIMIT 属性来设定返回的记录数。
- 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
- limit N,M : 相当于 limit M offset N , 从第 N 条记录开始, 返回 M 条记录
一些写在前面的知识(
(示例基于下面的表格)
- 索引是如何工作的?
简单来说,索引分为 hash 和 B-Tree 两种。 hash 查找的时间复杂度为O(1)。 B-Tree 其实是
B+Tree,一种自平衡多叉搜索数,自平衡代表每次插入和删除数据都会需要动态调整树高,以降低平衡因子。B+Tree
只有叶子节点会存储信息,并且会使用链表链接起来。因此适合范围查找以及排序,不过只能搜索最左前缀,如只能索引以a开头的姓名,却无法索引以a结尾的姓名。
另外,Everything is trade off。B+Tree的自平衡特性保证能够快速查找的同时也降低了更新的性能,需要权衡利弊。
- 如何联接多个行的字段?
在mysql中,可以使用group_concat
select group_concat(sname) from student;
- 如何在一个sql语句中插入多行数据?
values 使用逗号相隔,可以插入多行数据
insert into student(sid, sname) values (), (), ()
- 如何在select中使用条件表达式?
示例,在student表中,查询所有人成绩,小于60则显示为0
select sid, cid, if(score < 60, 0, score) score from sc;
- 如何找到重复项?
select sname, ssex, count(*) times from student
group by sname, ssex
having times > 1;
- 什么是SQL注入?
如有一条查询语句为
"select * from (" + table + ");"
当table取值 student); drop table student; --
时,语句变为了以下,会删掉表,造成攻击。
"select * from (student); drop table student; --);"
- sql执行顺序
(1)from
(3) join
(2) on
(4) where
(5)group by(开始使用select中的别名,后面的语句中都可以使用)
(6) avg,sum…
(7)having
(8) select
(9) distinct
(10) order by
接下来为练习题:
通过做题来学习查询技巧
数据表介绍
–1.学生表
Student(SId,Sname,Sage,Ssex)
–SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
–2.课程表
Course(CId,Cname,TId)
–CId 课程编号,Cname 课程名称,TId 教师编号
–3.教师表
Teacher(TId,Tname)
–TId 教师编号,Tname 教师姓名
–4.成绩表
SC(SId,CId,score)
–SId 学生编号,CId 课程编号,score 分数
Student表
create table Student(SId varchar(10) primary key,Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-12-20' , '男');
insert into Student values('04' , '李云' , '1990-12-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-01-01' , '女');
insert into Student values('07' , '郑竹' , '1989-01-01' , '女');
insert into Student values('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2012-06-06' , '女');
insert into Student values('12' , '赵六' , '2013-06-13' , '女');
insert into Student values('13' , '孙七' , '2014-06-01' , '女');
课程表
create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');
教师表 Teacher
create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
成绩表 SC
create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' ,