数据库(二)

数据库数据模型包括:层次模型、网状模型、关系模型和对象模型

主键:primary key   外键:Forergn key  唯一:Unique  auto_increment:自增  默认值:default

关联关系存在三种基本关系类型:一对一,一对多,多对多。

SQL:结构化查询语言

1 数据定义语言:DDL  

create database 创建数据库

drop database 删除数据库

2 数据查询语言:DQL

create/drop/alter/rename  table :创建、删除、修改、重命名 表格

3 数据控制语言: DCL

给予用户访问授权权限的 grant 语句

取消用户访问权限的 revoke语句

关系模型把时间看成实体(Entity)和联系(Rclationship)组成

table表 column列 row行

整数数据类型:tinyint 、smallint 、middleint 、bigint

浮点数据类型:real /float /decimal/numeric/double

字符型:char/varchar

复制表结构:select *into table2 from table1;

修改表:alter table friend add email varchar(20);

创建索引:create index<索引名> on <表名> (<列名>,)

执行流程:from-where-group by -select -having- order by -limit

insert into <表名>(列名列表)values(值列表) 

插入多行可以用逗号隔开

更新表中数据:update<表名> set <列1=新值1,列2= 新值2>where <过滤条件>

update table set name =zhangsan where id = 2;

删除数据:delect from <表名> where <过滤条件>

truncate与delect 的区别

truncate效率比delect高,删除后没法恢复,delect相反

查询:

select* from table

*:表示所有。包含null

all:不包含null的所有

dictinct:去重,非空

like '%mike%'

聚合函数:count/sum/avg/max/min

在子查询中返回使用运算符

exist (存在)如果条件为真,则返回整个结果,如果为假,返回空白

all 运算符 any运算符

union运算符;链接2个表

insert into 添加数据到数据库

CREATE TABLE t_people(
	p_id INT PRIMARY KEY AUTO_INCREMENT,
	p_name VARCHAR(100),
	p_sex CHAR(2) DEFAULT '男',
	p_phone VARCHAR(20)
);
SELECT * FROM t_people;

/*
insert into 添加数据到数据库
*/
INSERT INTO t_people(p_name,p_sex,p_phone) VALUES('隔壁老王','男','1355589001');
INSERT INTO t_people VALUES(2,'小芳','女','9090910');

#一次添加多条语句
INSERT INTO t_people VALUES(3,'小明','男','123456'),(4,'小明2','男','123456'),(5,'小明3','男','123456');

CREATE TABLE t_people2(
	p_id INT PRIMARY KEY AUTO_INCREMENT,
	p_name VARCHAR(100),
	p_sex CHAR(2) DEFAULT '男',
	p_phone VARCHAR(20)
);

#数据的复制
INSERT INTO t_people2 SELECT * FROM t_people;
SELECT * FROM t_people2;



/*
更改数据
update
*/
UPDATE t_people2 SET p_sex = '女';

SELECT * FROM t_people2;

UPDATE t_people2 SET p_sex = '男' WHERE p_id=2 AND p_name="小芳";

#修改多个列
UPDATE t_people2 SET p_name="小小芳",p_phone='123' WHERE p_name="小芳";

/*
删除语句
delete
*/
DELETE FROM t_people2;
SELECT * FROM t_people2;

DELETE FROM t_people2 WHERE p_name="隔壁老王";

#删除一个区间的数据
DELETE FROM t_people2 WHERE p_id BETWEEN 2 AND 4;

DELETE FROM t_people2 WHERE p_id>=2 AND p_id<=4;

#直接删除所有的数据,
TRUNCATE TABLE t_people2;

/*
select
*/

#投影  列别名  表别名
SELECT peo.p_phone AS '电话',peo.p_sex AS '性别' FROM t_people AS peo;   #通配符,匹配所有


#计算列
SELECT * FROM t_people;
SELECT p_id+1 FROM t_people;

#将列拼接起来用concat函数
SELECT CONCAT(p_name,"-",p_id) FROM t_people;



#排除重复数据,查看数据种类
SELECT DISTINCT p_sex FROM t_people;


#返回限定的数目
SELECT * FROM t_people LIMIT 0,5;   #0表示下标 5表示返回的条数
SELECT * FROM t_people LIMIT 5,5;

SELECT * FROM t_people LIMIT 8;  #写一个数默认从0开始


#选择返回的数据
SELECT * FROM t_people WHERE p_sex = "男" AND p_name="小明";
SELECT * FROM t_people WHERE p_sex <> "男";


SELECT * FROM t_people WHERE p_id BETWEEN 2 AND 5;

#in 表匹配一个集合
SELECT * FROM t_people WHERE p_id IN (1,2,3);
#not in
SELECT * FROM t_people WHERE p_id NOT IN (1,2,3);

SELECT * FROM t_people WHERE p_name = "隔壁老王"  #精确匹配


#模糊查询
SELECT * FROM t_people WHERE p_name LIKE "%隔壁"   #匹配零个到多个字符

SELECT * FROM t_people WHERE p_name LIKE "___";    #_表示一个字符

SELECT * FROM t_people WHERE p_name LIKE "隔壁__" 

SELECT * FROM t_people WHERE p_name IS NULL;


#排序 order by
SELECT * FROM t_people ORDER BY p_phone;
SELECT * FROM t_people ORDER BY p_id;


#
SELECT * FROM t_people ORDER BY p_phone,age;
ALTER TABLE t_people ADD age INT;


SELECT * FROM t_people ORDER BY p_phone DESC   #降序排列
SELECT * FROM t_people ORDER BY p_phone ASC   #默认就是 升序


SELECT * FROM t_people WHERE p_name LIKE "%隔壁%" ORDER BY age DESC LIMIT 0,2;

SELECT * FROM t_people;

/*
count()函数统计所有行
*/
# *统计null的行
SELECT COUNT(*) FROM t_people;

CREATE TABLE t_test(
	id INT,
	NAME VARCHAR(20)
);
SELECT * FROM t_test;

SELECT COUNT(*) FROM t_test;

#all
SELECT COUNT(ALL NAME) FROM t_test;  #默认就all不统计空行

#distinct
SELECT COUNT(DISTINCT p_sex) FROM t_people;   #distinct统计非空并且不重复的数据

SELECT COUNT(*) FROM t_people WHERE age IS NULL;  #统计所有的空行

/*
sum 函数统计年龄的总和 all  distinct
*/

SELECT SUM(ALL age) FROM t_people;


/*
avg   统计平均值可以sum/count
*/
SELECT AVG(age) FROM t_people;   #avg求平均值自求非空的平均值
SELECT SUM(age)/COUNT(*) FROM t_people; 
SELECT * FROM t_people;

/*
max
*/

SELECT MAX(ALL age) FROM t_people;
SELECT MIN(ALL age) FROM t_people;


/*
分组
*/
SELECT p_phone,age,COUNT(*) FROM t_people GROUP BY p_phone,age;

DROP TABLE t_student;

CREATE TABLE t_student(
	s_id INT PRIMARY KEY AUTO_INCREMENT,
	s_name VARCHAR(20),
	s_sex CHAR(2) DEFAULT '男',
	s_tid INT,
	CONSTRAINT fore_id FOREIGN KEY(s_tid) REFERENCES t_teacher(t_id)  #外键约束
);

DROP TABLE t_teacher
CREATE TABLE t_teacher(
	t_id INT PRIMARY KEY AUTO_INCREMENT,
	t_name VARCHAR(20)
);

CREATE TABLE t_subject(
	sub_id INT PRIMARY KEY AUTO_INCREMENT,
	sub_name VARCHAR(30)
);

SELECT * FROM t_student;
SELECT * FROM t_teacher;

DROP TABLE t_teacher;  #有外键约束的表不能直接删除

#删除外键
ALTER TABLE t_student DROP FOREIGN KEY fore_id;

#通过alter语句动态增加外键
ALTER TABLE t_student ADD CONSTRAINT for_id FOREIGN KEY (s_tid) REFERENCES t_teacher(t_id);



/*多对多*/
SELECT * FROM t_subject;
SELECT * FROM t_student;

CREATE TABLE t_stu_sub(
	ss_id INT PRIMARY KEY AUTO_INCREMENT,
	ss_stuid INT,
	ss_subid INT,
	FOREIGN KEY (ss_stuid) REFERENCES t_student(s_id),
	FOREIGN KEY (ss_subid) REFERENCES t_subject(sub_id)
);

SELECT * FROM t_student;
SELECT * FROM t_subject;
SELECT * FROM t_stu_sub;

INSERT INTO t_stu_sub(ss_stuid,ss_subid)VALUE(3,3);

#自增长默认从1000开始
ALTER TABLE t_student AUTO_INCREMENT =1000;

CREATE DATABASE j123_day03;
USE j123_day03;
CREATE TABLE t_stu(
	s_id INT,
	s_name VARCHAR(20),
	s_subject VARCHAR(20),
	s_grade INT,
	s_classId INT,
	FOREIGN KEY(s_classId) REFERENCES t_class(c_id)
);

DROP TABLE t_stu;
CREATE TABLE t_class(
	c_id INT PRIMARY KEY AUTO_INCREMENT,
	c_name VARCHAR(20)
);

INSERT INTO t_class VALUES (1,"一班"),(2,"二班");
INSERT INTO t_class VALUES (3,"三班"),(4,"四班");
INSERT INTO t_stu VALUES(1,);

INSERT INTO t_stu VALUES(1,'张三','计算机基础',60,1),(1,'张三','c语言',88,1),(1,'张三','数据库',90,1);

INSERT INTO t_stu VALUES(2,'李四','计算机基础',80,2),(2,'李四','c语言',70,2),(2,'李四','数据库',55,2);

INSERT INTO t_stu VALUES(3,'王五','计算机基础',67,3),(3,'王五','数据库',90,3);

SELECT * FROM t_stu;
SELECT * FROM t_class;


#子查询嵌套在select中,子查询返回的内容必须是单行单列的值
SELECT s_name,(SELECT c_name FROM t_class c WHERE c.c_id = s.s_classId) '班级' FROM t_stu s;


SELECT * FROM (SELECT * FROM t_stu) AS ntable;


#嵌套在from中的子查询,返回的内容可以是多行多列
SELECT MAX(sumgrade) FROM 
(SELECT s_name,SUM(s_grade) sumgrade FROM t_stu GROUP BY s_name) AS netable;


#嵌套在where 条件中的子查询
SELECT * FROM t_stu WHERE s_grade >=ALL
(SELECT s_grade FROM t_stu WHERE s_name = '王五') AND s_name!='王五';

#in 表示一个范围
SELECT * FROM t_stu WHERE s_grade NOT IN 
(SELECT s_grade FROM t_stu WHERE s_name='张三') AND s_name !="张三";



#all匹配子查询里面每一个

SELECT * FROM t_stu WHERE s_grade >=ALL 
(SELECT s_grade FROM t_stu WHERE s_name = "王五") AND s_name !="王五";

SELECT * FROM t_stu WHERE s_grade >=
(SELECT MAX(s_grade) FROM t_stu WHERE s_name = "王五") AND s_name!="王五";

#any  匹配其中一个数据

SELECT * FROM t_stu WHERE s_grade >=ANY
(SELECT s_grade FROM t_stu WHERE s_name = "王五") AND s_name !="王五";


#exists
SELECT * FROM t_stu WHERE NOT EXISTS 
(SELECT * FROM t_stu WHERE s_grade >
(SELECT s_grade FROM t_stu WHERE s_name = '张三' AND s_subject = "数据库"));



# 找一下比c语言的平均成绩高的学科的名称
# 找一下平均成绩最高的班级的名称。
SELECT DISTINCT s_subject FROM t_stu WHERE s_grade >
(SELECT AVG(s_grade) FROM t_stu WHERE s_subject="c语言") AND s_subject!="c语言";

# 找出平均成绩比c语言科目的平均成绩要高的科目名称
SELECT s_subject FROM 
(SELECT s_subject,AVG(s_grade) AS avgs FROM t_stu WHERE s_subject !="c语言" GROUP BY s_subject) AS ntable
WHERE avgs>(SELECT AVG(s_grade) FROM t_stu WHERE s_subject='c语言');

SELECT MAX(avgs),(SELECT c_name FROM t_class cl WHERE tt.s_classId = cl.c_id) '班级名称' FROM 
(SELECT s_classId,AVG(s_grade) avgs FROM t_stu GROUP BY s_classId) AS tt;


SELECT *,(SELECT c_name FROM t_class t WHERE s.s_classId = t.c_id) AS className FROM t_stu s;

  

 

posted @ 2016-06-10 23:26  psbyking888  阅读(180)  评论(0编辑  收藏  举报