MySQL数据库的单表基本操作(二,附加职工小练习)

数据库的增删查改是基础,所以小编要增加练习,与增加训练来增加自己的基础,确实上百度上有许多的博客,大家可以参考参考多加练习。废话不多说,开干。

表的约束:

NOT NULL非空
UNIQUE Key唯一键
PRIMARY KEY主键
FOREIGN KEY外键
CHECK检查

check检查约束:

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

删除表的约束:

删除NOT NULL约束alter table 表名 modify 列名 类型;
删除UNIQUE约束alter table 表名 drop index 惟一约束名;
删除PRIMARY KEY约束alter table 表名 drop primary key;
删除FOREIGN KEY约束alter table 表名 drop foreign key 外键名;

练习:

#单个约束
CREATE TABLE  t_text2 ( id int primary key auto_increment comment 'primary key auto_increment 设置自增加主键',
		name varchar(20) not null unique comment 'not null unique 设置不能为空', 
		age int NOT NULL ,
		CHECK (age > 0 )   #设置检查约束条件age必须大于0

		);
		#CONSTRAINT t_text2 CHECK (Id>0 AND name='小明')#多个约束

授权(create)、创建用户、删除用户、
撤销权限(revoke)

生产环境授权用户建议: 
1、博客,CMS等产品的数据库授权 select,insert,update,delete,create 库生成后收回create权限 
2、生产环境主库用户授权 select,insert,update,delete 
3、生产环境从库授权 select
创建用户练习:
方式一:
flush privileges;#冲洗特权
CREATE USER lsf666@'localhost'  IDENTIFIED BY '666666'; #必须加第一行,不然返回1290这个错误,所以执行失败


方式二:
INSERT INTO mysql.user(user,host, authentication_string,ssl_cipher, x509_issuer,x509_subject)#具体解释插入mysql。用户(用户,主机,authentication_string,ssl_cipher, x509_issuer,x509_subject)
VALUES('haha','localhost',password('ABCabc123!'),'','',''); #自己添加用户信息
FLUSH PRIVILEGES;#冲洗特权;

方法三:
GRANT SELECT ON *.* TO lalala@'localhost' IDENTIFIED BY '123456'; 
FLUSH PRIVILEGES;


sql语句查看用户命令:
SELECT User FROM mysql.user;

现象:
在这里插入图片描述

聚合函数:(SQL官方提供了一个用来常见运算的一些)

count()统计数据
max()最大值
min()最小值
avg()平均值

练习:
use db-shuihu #登录数据库
SELECT count(id) count from t_shuihuo; #统计表中id的数量
select cond(列名) count from 表名 #其他函数方法使用一样,改 cond(列名) count 相应的值
在这里插入图片描述

别名(alias)的使用:(需要查询的字段 as 新的名称,注意:AS可以省略不写
练习:

SELECT min(id) AS 'haha' from t_sanguo;
SELECT min(id)  haha from t_sanguo;

在这里插入图片描述

模糊查询:(模糊查询是放弃使用索引,全表扫描的操作,因此效率非常低)

	
--  查询以拼开头的用户
SELECT u.name, id  from t_shuihuo u where name like "拼%";
  
# 包含时字的名称
SELECT u.name, id  from t_shuihuo u where name like "%时%";

# 第二个字是者字的 _ 表示一个位
SELECT u.name, id  from t_shuihuo u where name like "_者%";

在这里插入图片描述

排序 :

SELECT * FROM t_sanguo ORDER BY id ;			# 默认升序排序
SELECT * FROM t_sanguo ORDER BY id asc;  # 升序排序
SELECT * FROM t_sanguo ORDER BY id DESC;	# 降序排序
SELECT * FROM 表名称 ORDER BY 排序的根据 ;  #必须类型是int

在这里插入图片描述

分组:(将内容相同的归纳为一组,使用group by 字段)

#查询每个位置的个数
SELECT COUNT(*),id FROM  t_sanguo
GROUP BY id;
SELECT 分组条件 FROM  表名
GROUP BY ;

在这里插入图片描述

筛选:(having ,分组后的结果进行筛选,分组函数做筛选不能放在where后面

SELECT 分组条件 , count(分组条件) from 表名 where age > 5 GROUP BY gender HAVING COUNT(gender) > 2; #age > 5 GROUP BY gender HAVING COUNT(gender) > 2 ;是筛选条件

分页:

SELECT * from t_sanguo LIMIT 0, 3;#按3个分一页
SELECT * from t_sanguo LIMIT 3, 3;
select * from t_user limit num;				# 限制显示num条 
select * from t_user limit 起始位, 每页显示的条数;	# 限制显示num条 

在这里插入图片描述

程序员要在界面上实现分页,需要四个变量:

当前页:	pageNow			# 用户决定
	每页数量:	pageSize		# 程序员决定
	数据总量:	pageAll			# 查询
	总页数:	pageCount		# 计算 pageCount = pageAll % pageCount== 0 ? pageAll / pageCount : pageAll / pageCount + 1


  当前页=select * from 表名称 where 条件 xxxx limit (pageNow - 1)*pageSize, pageSize;

一个完整的复杂查询的顺序问题:

select 字段1, ...
from 表名称1, ...
[where 条件(最先执行)]
[group by 分组字段 ]
[having 分组后的筛选]
[order by 排序]
[limit 分页]

小练习:

一、单表查询
	素材: 
	表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等
	CREATE TABLE `worker` (
	 `部门号` int(11) NOT NULL,
	 `职工号` int(11) NOT NULL,
	 `工作时间` date NOT NULL,
	 `工资` float(8,2) NOT NULL,
	 `政治面貌` varchar(10) NOT NULL DEFAULT '群众',
	 `姓名` varchar(20) NOT NULL,
	 `出生日期` date NOT NULL,
	 PRIMARY KEY (`职工号`)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

	INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (101, 1001, '2015-5-4', 3500.00, '群众', '张三', '1990-7-1');
	INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (101, 1002, '2017-2-6', 3200.00, '团员', '李四', '1997-2-8');
	INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (102, 1003, '2011-1-4', 8500.00, '党员', '王亮', '1983-6-8');
	INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (102, 1004, '2016-10-10', 5500.00, '群众', '赵六', '1994-9-5');
	INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (102, 1005, '2014-4-1', 4800.00, '党员', '钱七', '1992-12-30');
	INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (102, 1006, '2017-5-5', 4500.00, '党员', '孙八', '1996-9-2');

	1、显示所有职工的基本信息。
	   select * from worker; 
	2、查询所有职工所属部门的部门号,不显示重复的部门号。
	  select DISTINCT `部门号` from worker ;
	3、求出所有职工的人数。
	  select COUNT(*)  '人数' from worker ;
	4、列出最高工和最低工资。
	   select MAX(工资),min(工资)   from worker ;
	5、列出职工的平均工资和总工资。
	   select avg(工资)  平均工资,count(工资) as 总工资   from worker ;
	6、创建一个只有职工号、姓名和参加工作的新表,名为工作日期表。
	 CREATE TABLE `工作日期表`(	 
		`职工号` int(11) NOT NULL ,
		`姓名` varchar(20) NOT NULL ,
		`参加工作` varchar(20) ,
		PRIMARY KEY (`职工号`)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
	7、显示所有女职工的年龄。
	 #没有给男生女生,决定全部说女生。所以说68、列出所有姓刘的职工的职工号、姓名和出生日期。
	SELECT 职工号 , 姓名 ,出生日期 FROM worker WHERE 姓名 LIKE "刘%" ;
	9、列出1960年以前出生的职工的姓名、参加工作日期。
	SELECT 姓名 , 工作时间  FROM worker WHERE 出生日期 < 1960 ;
	10、列出工资在10002000之间的所有职工姓名。 
	SELECT 姓名 FROM worker WHERE 2000>工资>1000;
	11、列出所有陈姓和李姓的职工姓名。
	SELECT `姓名` FROM worker WHERE `姓名` like  "李%";
	SELECT `姓名` FROM worker WHERE `姓名` like  "陈%"; 
	或者
	SELECT `姓名` FROM worker WHERE     ( 姓名 LIKE "陈%" ) or (  姓名 LIKE "李%") ;
	12、列出所有部门号为23的职工号、姓名、党员否。
	  SELECT 职工号 , 姓名 , 政治面貌 FROM worker WHERE 部门号 LIKE "%2";
SELECT 职工号 , 姓名 , 政治面貌 FROM worker WHERE 部门号 LIKE "%3"  ;

	13、将职工表worker中的职工按出生的先后顺序排序。
	SELECT * FROM worker ORDER by 出生日期 ;
	14、显示工资最高的前3名职工的职工号和姓名。 
	SELECT * FROM  worker  ORDER BY 工资 ASC LIMIT 3;
	15、求出各部门党员的人数。
	 SELECT count(*) FROM  worker  WHERE 政治面貌 = '党员' ;
	
	16、统计各部门的工资和平均工资
	SELECT avg(工资),sum(工资) FROM  worker WHERE 部门号 = 101 ;
	SELECT avg(工资),sum(工资) FROM  worker WHERE 部门号 = 102 ;
	17、列出总人数大于4的部门号和总人数。
	SELECT count(*) as 总人数,部门号 FROM  worker GROUP BY 部门号 HAVING COUNT(*)> 4 ;

现象:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韶光不负

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值