1、创建表
在创建表之前要先选择数据库,在选择的数据库下创建表。选择数据库在上一篇博文中已经提及到(use 数据库名)。
create table table_name(属性名 属性类型[完整性约束],
属性名 属性类型[完整性约束],
......
属性名 属性类型[完整性约束]
);
注意:创建表的时候选取合适的数据类,给定字段完整性约束,比如:逐渐、外键、非空
约束条件 | 说明 |
PRIMARY KEY | 修饰的属性是该表的主键 |
FOREIGN KEY | 修饰的属性是该表的外键(是另一张表的之间,和当前表建立连接) |
NOT NULL | 表示该属性不能为NULL |
UNIQUE | 表示该属性的值具有唯一性 |
AUTO_IINCREMENT | 表示该属性的值是自增的,整数类型(MYSQL的特色) |
DEFAULT | 给属性设置默认值 |
2、查看表
2.1 通过desc关键字查看表的字段名称、类型、是否为Null、约束条件、默认值、备注信息
desc table_name;
2.2 展示创建表的SQL语句,并且打印了存储引擎以及字符集编码(默认的是拉丁码)
show create table table_name;
2.3 展示添加进表中的内容
select * from table_name;
3、删除表
delect table table_name;
4、插入数据
insert into table_name(属性1,属性2,...,属性n) values
(v1,v1,...vn);
5、删除数据
delecte from table_name[where 属性名=values];
6、修改表
在使用过程中不满足使用情况下修改,用alter命令修改
6.1 修改表名
alter table old_name RENAME new_table;
6.2 修改属性类型
alter table table_name MODIFY 属性名 属性类型
6.3 修改属性名
alter table table_name CHANGE 旧属性名 新属性名 属性类型
6.4 增加字段
alter table table_name ADD 属性名 属性类型[完整性约束]
6.5 删除字段
alter table table_name DROP 属性名;
6.6 修改属性排列位置
alter table table_name MODIFY 属性名 属性类型 FIRST;//将当前属性放在表的第一个位置
alter table table_name MODIFY 属性名1 属性类型1 AFTER 属性名2;//将属性1 排列在属性2的后面
6.7 修改表的存储引擎
alter table table_name ENGINE=存储引擎名;
7、查询表
select 属性列表 from table_name[where 条件表达式1]
7.1 带int的子查询
[not] in(元素1,元素2,...,元素n);
7.2 带between and的范围查询
[not]between 取值1 and 取值2;
7.3 带like的通配符匹配字符串
[not]like '字符串';
通配符:%:表示0个或任意长度的字符串
_:表示一个字符
7.4 空值查询
is [not]null;
7.5 带and的多条件查询
条件表达式1 and 条件表达式2[... and 条件表达式n];
7.6 带or的多条件查询
条件表达式1 or条件表达式2[... or 条件表达式n];
7.7 去重复查询
select distinct 属性名;
7.8 分组查询
group by 属性名[having 表达式];
7.9 对结果排序
order by 属性名[desc/asc];
7.10 union联合查询
select 属性列表 from table_name1[where 条件表达式] union
select 属性列表 from table_name2[where 条件表达式]
联合查询默认的结果数据进行了去重(相当于dinstict)
7.11 limit分页查询
select * from table_name limit len;//一个参数指的是从起始0号位置开始读取指定长度len的数据
select * from table_name limit start,len;//第一个参数指的是起始位置start,第二个参数指的是读取指定长度len的数据
7.12 联合查询
左连接:select * from table_name1 a left join table_name1 b on a.属性名=b.属性名;//a,b是表的别名
左连接返回的是左边表的所有数据以及右边表和左边表相同的数据
内连接:select * from table_name1 a inner join table_name1 b on a.属性名=b.属性名;//a,b是表的别名
内连接返回的是左右表都同时存在的数据
右连接:select * from table_name1 a right join table_name1 b on a.属性名=b.属性名;//a,b是表的别名
右连接返回的是右边表的所有数据以及左边表和右边表相同的数据
8、SQL练习题
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 分数
学生表:
编号 姓名 年龄 性别
1 赵雷 20 男
2 钱电 20 男
3 孙风 21 男
4 吴兰 18 女
5 孙兰 17 女
课程表:
课程号 课程名称 教师编号
1 语文 2
2 数学 1
3 英语 3
教师表:
教师编号 教师名
1 张三
2 李四
3 王五
成绩表:
学生编号 课程编号 分数
1 1 80
1 2 71
1 3 87
2 1 88
2 2 70
2 3 89
3 1 68
3 2 78
3 3 87
4 1 67
4 2 58
4 3 89
5 1 56
5 2 89
6 3 38
首先创建这四个表。
1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数
select a.*,b.score as ‘01课程分数’,c.score as ‘02课程分数’ from Student a,SC b,SC c where a.SID = b.SID and a.SID = c.SID and b.CID = 1 and c.CID = 2 and b.score > c.score;
2、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
select a.SID , a.Sname ,avg(b.score) avg_score from Student a,SC b where a.SID = b.SID group by a.SID having avg(b.score) >= 60;
3、查询在sc表中不存在成绩的学生信息。
select * from Student where SID not in (select distinct SID from SC);
4、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
select a.SID, a.Sname,count(b.CID) as count, sum(b.score) as sum_score
from Student a, SC b where a.SID = b.SID group by a.SID;
5、查询"李"姓老师的数量
select count(TID) from Teacher where like '李%';
6、查询学过"张三"老师授课的同学的信息
select * from Student where SID in (
select distinct SID from SC where SID in(
select distinct CID from Course where TID in(
select TID from Teacher where Tnamec like '张三')));
更多SQL的练习可以参考:http://www.cnblogs.com/luo813/p/8993727.html