SQL简介2

一、数据完整性
1、实体完整性
2、域完整性(列完整性约束):
指数据库表的列(即字段)必须符合某种特定的数据类型或约束。

	约束:
		类型约束:  id int 
		长度约束:	id int(3)      插入数据 520438
		非空约束:	username varchar(10) NOT NULL 必须有值
		唯一约束:	idcardnum varchar(18) UNIQUE 可以为null,有的话必须唯一
		
		用户名:一般网站用户名必须有,且唯一(不让他作为主键)
			username varchar(100) NOT NULL UNIQUE
		
	
	示例:
		CREATE TABLE user(
			id int PRIMARY KEY,
			username varchar(20) NOT NULL UNIQUE,
			idcardnum varchar(18) UNIQUE,
			gender varchar(10) NOT NULL
		);
		
	专题:整数类型的主键自动增长。由数据库自己自动插入主键的值
		CREATE TABLE t1(
			id int PRIMARY KEY auto_increment,#主键自动增长
			name varchar(100)
		);
		INSERT INTO t1 (id,name) VALUES(1,'A');
		INSERT INTO t1 (name) VALUES('B');  (推荐)
		INSERT INTO t1 VALUES (null,'C');
		
	建议:尽量不要让数据库维护主键。(不是所有的数据库都有自动增长这个功能)
	由应用来维护主键
		
3、参照完整性(重点:多表.外键)
	3.1多表的设计
		a、一对多(出现频率最高)
			CREATE TABLE department(
				id int PRIMARY KEY,
				name varchar(100),
				addr varchar(100)
			);
			CREATE TABLE employee(
				id int PRIMARY KEY,
				name varchar(100),
				gender varchar(10),
				salary float(8,2),
				depart_id int,
				CONSTRAINT depart_id FOREIGN KEY(depart_id) REFERENCES department(id)
			);
			
			外键定义语法:
			CONSTRAINT 外键名称 FOREIGN KEY(外键字段) REFERENCES 主表名称(主键字段);
			外键名称:随便定义,当前库中必须唯一
			外键字段:当前表中那个字段是外键
			
		b、多对多(出现频率其次)
			CREATE TABLE teacher(
				id int PRIMARY KEY,
				name varchar(100),
				salary float(8,2)
			);
			CREATE TABLE student(
				id int PRIMARY KEY,
				name varchar(100),
				grade varchar(10)
			);
			#定义关系表
			CREATE TABLE teacher_student(
				t_id int,
				s_id int,
				PRIMARY KEY(t_id,s_id),
				CONSTRAINT t_id_fk FOREIGN KEY(t_id) REFERENCES teacher(id),
				CONSTRAINT s_id_fk FOREIGN KEY(s_id) REFERENCES student(id)
			);
			
			INSERT INTO teacher VALUES(1,'WYJ',10000);
			INSERT INTO teacher VALUES(2,'DH',10001);
			INSERT INTO student VALUES(1,'WF','A');
			INSERT INTO student VALUES(2,'QHS','A');
			INSERT INTO teacher_student VALUES(1,1);
			INSERT INTO teacher_student VALUES(1,2);
			INSERT INTO teacher_student VALUES(2,1);
			INSERT INTO teacher_student VALUES(2,2);
		c、一对一(出现频率几乎没有)
			CREATE TABLE person(
				id int PRIMARY KEY,
				name varchar(100)
			);
			CREATE TABLE id_card(
				id int PRIMARY KEY,
				num varchar(18),
				CONSTRAINT id_fk FOREIGN KEY(id) REFERENCES person(id)
			);

二、多表的查询

1、连接查询
	基本语法:select XXX from t1 连接类型 t2 [on 连接条件][where 筛选条件]
		约定:t1在连接类型的左边,称之为左表 t2就是右表
			  连接类型:
				cross join:交叉连接
				inner join:显式内连接
				
				left outer join:左外连接
				right outer join:右外连接
		
	1.1交叉连接(了解):cross join
		SELECT * FROM customer CROSS JOIN orders;
		返回的结果是:返回的是两张表结果的笛卡尔积。即表1有5条,表2有7条,返回的5*7=35条
	1.2内连接:inner join(自然连接)
		a、隐式内连接:不使用on关键字(即不明确指定连接条件),使用的是where
			查询有订单的客户的信息和订单信息
			SELECT * FROM customer c,orders AS o WHERE c.id=o.customer_id;
		b、显式内连接:使用on关键字
			查询有订单的客户的信息和订单信息
			SELECT * FROM customer c INNER JOIN orders o ON c.id=o.customer_id;
			查询订单金额在200元以上的客户的信息和订单信息
			SELECT * FROM customer c INNER JOIN orders o ON c.id=o.customer_id WHERE o.price>=200;
	1.3外连接:outer join
		a、左外连接:返回满足连接条件的结果,同时返回左表中剩余的其他记录
			查询客户信息,同时显示他的订单
			SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.id=o.customer_id;
			查询所有的员工,打印所在的部门名称
			SELECT * FROM employee e LEFT OUTER JOIN department d ON e.depart_id=d.id;
		b、右外连接:返回满足连接条件的结果,同时返回右表中剩余的其他记录
			查询客户信息,同时显示他的订单
			SELECT * FROM orders o RIGHT OUTER JOIN customer c ON c.id=o.customer_id;
			查询所有订单,同时显示他的客户信息
			SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.id=o.customer_id;
2、子查询(简单):
	子查询:嵌套查询(内部语句)。一个查询语句是另外一个查询语句的条件。子查询的语句必须放在小括号之内
		select * from t1 where id=(select id from t2);
		
		查询id为2的老师教过的学生姓名
		方式一:多条语句
			select s_id from teacher_student where t_id=2;
			select * from student where id in (1,2);
		方式二:连接查询
			select s.* from teacher_student ts,student s where ts.s_id=s.id and ts.t_id=2;
		方式三:子查询(一个单列结果)
			select * from student where id in (select s_id from teacher_student where t_id=2);
	
		查询名字为'陈冠希'的所有订单信息(子查询)
			select * from orders where customer_id=(select id from customer where name='陈冠希');
	
3、联合查询:UNION
	联合查询能够合并两条查询语句的查询结果,去掉其中的重复数据行,然后返回没有重复数据行的查询结果。
	
	取多条语句的并集(没有重复记录)
	查询客户id=1并且订单金额>=200的订单信息
	
	SELECT * from orders where price>=200 and customer_id=1;
	
	查询客户id=1或者订单金额>=200的订单信息
	SELECT * from orders where price>=200 or customer_id=1;
	使用联合查询:查询客户id=1或者订单金额>=200的订单信息
	SELECT * FROM orders WHERE price>=200 UNION SELECT * FROM orders WHERE customer_id=1;
	
4、报表查询(数据库的内置函数)
	报表查询对数据行进行分组统计
	[select …] from … [where…] [ group by … [having… ]] [ order by … ]
	group by:按照那些字段进行分组
	having:对分组后的内容进行过滤(不能使用where)
	
	
	统计一个班级共有多少学生?
	mysql>SELECT count(*) FROM student;
	统计数学成绩大于90的学生有多少个?
	mysql>SELECT COUNT(*) FROM student where math>90;
	统计总分大于250的人数有多少?
	mysql>SELECT COUNT(*) FROM student where (math+chinese+english)>250;
	统计一个班级数学总成绩?
	mysql>SELECT SUM(math) FROM student;
	统计一个班级语文、英语、数学各科的总成绩
	mysql>SELECT SUM(math),SUM(chinese),SUM(english) FROM student;
	统计一个班级语文、英语、数学的成绩总和
	mysql>SELECT SUM(math+chinese+english) FROM student;
	统计一个班级语文成绩平均分
	mysql>SELECT SUM(chinese)/COUNT(*) FROM student;
	
	求一个班级数学平均分?
	mysql>SELECT AVG(math) FROM student;
	求一个班级总分平均分
	msyql>SELECT AVG(math+chinese+english) FROM student;
	
	求班级语文最高分和最低分
	mysql>SELECT MAX(chinese) FROM student;
	mysql>SELECT MIN(chinese) FROM student;
	
	注意:不能使用关键字作为表名或列名,如果必须使用,请使用反引号`(ESC按键下面)引起来
	
	对订单表中商品归类后,显示每一类商品的总价
	mysql>SELECT product,sum(price) FROM orders GROUP BY product;
	查询购买了几类商品,并且每类总价大于100的商品
	mysql>SELECT product,sum(price) FROM orders GROUP BY product HAVING sum(price)>100;

三、数据库的备份与恢复(MySQL)
1、备份数据库(表结构和表中数据)
c:/>mysqldump -h localhost -u root -p mydb1>d:/mydb1.sql

2、恢复数据库:数据库名必须手工创建,并选择
	方式一:在MySQL内部导入数据
		mysql>create database mydb1;
		mysql>use mydb1;
		mysql>source d:/mydb1.sql;
	方式二:不进入mysql进行数据的恢复
		c:/>mysql -u root -p mydb1<d:/mydb1.sql
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值