zoukankan      html  css  js  c++  java
  • mysql表间的关系和查询

    mysql间的关系及查询
    多对一
    # 先创建被关联的表dep				 
    create table dep(id primary key auto_increment,
    				 dep_name char(10),
    				 dep_comment char(60))
    				 
    # 后创建关联表emp				 
    create table emp(id int primary key auto_increment,
    				 name char(15),
    				 gender enum('male','femael')not null default 'male',
    				 de_id int,
    				 foreign key(dep_id),references dep(id));
    				 
    # 先向被关联的表dep中插入值
    insert into dep(dep_name,dep_comment) values('教学部','给学生上课',
    											 '外交部','代表学生的良好形象',
    											 '技术部','维护教学设备'));
    											 
    # 再向关联表emp中插入值
    insert into emp(name,gender,de_id) values(('aaa','male',1),
                                              ('bbb','male',2),
                                              ('ccc','female',3),
                                              ('ddd','male',2)
    											);
    
    多对多关系

    表一:book

    id book_name price
    1 九阴真经 100
    2 葵花宝典 200
    3 吸星大法 300

    表二:press

    id press_name phone
    1 人民出版社 123
    2 青春文学 234
    3 北京邮电出版社 345

    一本书可以是多个出版社出版的,所以需要单独建一个关系表出来

    id book_id p_id
    1 1 1
    2 1 3
    3 2 1
    创建表
    # 创建表1
    create table book(id int primary key auto_increment,
    				  book_name char(15),
    				  price int(5));
    # 创建表2
    create table press(id int primary key auto_increment,
    				   press_name char(20),
    				   phone int(11));				   
    # 创建关系表
    create table b_p(id int primary key auto_increment,
    				 book_id int(3),
    				 p_id int(3),
                    foreign key(book_id) references book(id) on update cascade on delete cascade,
                    foreign key(p_id) references press(id) on update cascade on delete cascade);
    
    # 插入值
    insert into book values(1,'九阴真经',100),(2,'九阳神功',200),(3,'吸星大法',300);
    
    insert into press(press_name) values('人民出版社'),('青春文学'),('北京邮电出版社');
    
    insert into b_p(book_id,p_id) values(1,1),(1,3),(2,1);
    
    修改表和复制表
    # 修改表名
    	alter table 表名 rename 新表名;
    	
    	
    # 增加新字段
    	alter table 表名 add 字段名 数据类型[约束条件];
    	
    
    # 删除字段
    	alter table 表名 drop 字段名
    	
    	
    # 修改字段
    	alter table 表名 modify 字段名 数据类型[约束条件];
    	
    	alter table 表名 change 旧字段名 新字段名 旧数据类型[约束条件];
    	
    	alter table 表名 change 旧字段名 新字段名 新数据类型[约束条件];
        
        
    # 复制表
    	create table book_copy select *from book;
    	
    
    单表查询
    select id,name from emp
    	where id >1 and name like'%on%'
    	group by dep_id
    	having 分组后的过滤条件
    	order by 排序依据
    	limit n;
    
    group by & 聚合函数
    # 设置sql_mode 为 only_full_group_by
    
    select 字段1 from 表名 group by 字段1		# 注意前后两个字段名要相同
    
    # 每个部门员工的最高工资
    select post,max(salary) from emp group by post;
    
    select post,min(salary) from emp group by post;
    
    select post,avg(salary) from emp group by post;
    
    select post,sum(salary) from emp group by post;
    
    select post,count(gender) from emp group by post;
    
    select post,avg(salary) from emp where age>=30 group by post;
    
    group_concat & 拼接字符串
    select post,group_concat(name) from emp group by post;
    
    select post,group_concat(name,'sb')from emp group by post;
    
    select post,group_concat(name,":",salary)from emp group by post;
    
    concat & as
    select concate('姓名',name) from emp ;
    
    select name,salary*12 as annual_salary from emp;
    
    select concate('姓名',name) as 姓名  from emp;
    
    having
    # 1. having 的语法给是与where一模一样,但是having是在group by之后进行一步过滤
    # 2. where不能用聚合函数,但是having可以用聚合函数
    
    # 统计个部门年龄在30岁以上的员工的平均工资,并且保留平均工资大于10000的部门
    select post,avg(salary) from emp
    						where age>=30
        					group by post
            				having avg(salary)>10000;
                
    # 强调: having必须在group by后用
    
    distinct
    # 去重,执行顺序在having之后
    select distinct post,avg(salary) from emp
    		where age>=30
    		group by post
    		having avg(salary)>10000;
    
    order by
    select * from emp order by salary;		# 默认升序(asc)排
    
    select * from emp order by salary desc;	# 降序排
    
    select * from emp order by age desc,salary asc;	# 多个排序标准,
    
    # 统计个部门年龄大于10岁,平均工资大于1000,且升序排列
    select distinct post,avg(salary)from emp where age >10 
    			group by post
        		having avg(salary) > 1000
            	order by post;
    
    limit
    # 限制显示条数
    
    select * from emp limit 3;
    
    # 选择工资前三的员工信息
    select * from emp order by salary desc limit 3;
    
    # 分页显示
    select * from emp limit 5,5;
    
    正则匹配
    select * from emp where name regexp '^jin.*(n|g)$';
    
    # $表示结束
    # regexp关键字
    
    多表连接
    建表
    create table department(id int,name varchar(20));
    
    create table employee(id int primary key auto_increment,
    					  name varchar(20),sex enum('male','female')not null default 'male',age intm dep_id int);
    
    
    笛卡尔积查询
    select * from emp,dep where emp.dep_id = dep.id
    
    内连接
    select * from emp inner join dep on emp.dep_id = dep.id;
    
    左连接
    select * from emp left join dep on emp.dep_id = dep.id;
    
    右连接
    select * from right join dep on emp.dep_id = dep.id;
    
    全连接
    select * from emp left join dep on emp.dep_id = dep.id
    union
    select * from right join dep on emp.dep_id = dep.id;
    
    子查询
    select * from emp inner join dep on demp.dep_id = dep.id
    select name from emp where dep_id = (select id from dep where name = '技术');
    
  • 相关阅读:
    给XML文件定义DTD
    详探TextRange对象用execCommand()执行命令
    获取屏幕,浏览器,网页高度宽度
    花点时间搞清top、postop、scrolltop、scrollHeight、offsetHeight
    DataView数据组件
    回调实现无刷新级联下拉框(.net)
    ASP.NET的简单数据绑定
    详探TextRange对象查找与选择
    方维系统常用的jquery库以及各个库的含义
    方维购物分享系统 给店铺品牌加喜欢收藏的功能
  • 原文地址:https://www.cnblogs.com/hello-yuanjing/p/10022483.html
Copyright © 2011-2022 走看看