JAVA基础-数据库的DML和DQL

查询数据

# 查询所有数据
SELECT * FROM students
# 只查询某几个列(并且附加条件)
SELECT NAME,age FROM students WHERE age>20

在MySQL中null值需要使用IS NULL 和 IS NOT NULL

SELECT * FROM students WHERE address IS NULL;

而空字符串需要直接=‘’;

SELECT * FROM students WHERE address='';

常用字符串函数

常用字符串函数 常用函数只是在查询出的结果中显示函数中描述 但是不能改变数据本身

  • 字符串
#返回字符串长度
SELECT CHAR_LENGTH(NAME) FROM teacher
#字符串截取 参数1 列名 参数2 下标整数从1开始  从整数开始截取 
SELECT SUBSTRING(NAME,1) FROM teacher
#字符串颠倒顺序
SELECT REVERSE(NAME) FROM teacher
#字符转换大写 小写lower
SELECT UPPER(NAME) FROM teacher
#返回最左边的下标个的字符  参数1 列名 参数 字符个数 同理right()
SELECT LEFT(NAME,2) FROM teacher
#函数正常放置在select 关键字后面 

数学函数

#绝对值
SELECT ABS(-11) FROM teacher
#圆周率
SELECT PI() FROM teacher
#平方根 如果为负数 返回null
SELECT SQRT(-1) FROM teacher
#余数	
SELECT MOD(10,3) FROM teacher
#次方结果
SELECT POW(2,2) FROM teacher
#不大于返回整数
SELECT FLOOR(32.9) 
#不小于返回整数
SELECT CEIL(44.1)
#返回随机值小数
SELECT RAND()

日期函数

#获取当前系统时间
SELECT NOW()
#获取当前时间里的月份
SELECT MONTH(NOW())
#获取当前时间里的年份
SELECT YEAR(NOW())
#获取当前时间
SELECT TIME(NOW())
#获取日期
SELECT DATE(NOW())
#案例:

#那么如果要查询名字是3个字的老师的信息呢?
SELECT * FROM teacher WHERE CHAR_LENGTH(NAME)=3
#查询本月要过生日的学生的信息呢?
SELECT * FROM student WHERE MONTH(birthdate)=MONTH(NOW())

控制函数

#if 第一个参数为true (不能为0 不能为null) 输出就是第二个参数  否则 第三个参数
#第一个参数为数字时 输出第二个参数
SELECT IF(33.45,'哈哈','呵呵')
#第一个参数如果为字符串  输出第三个参数
SELECT IF('hh','哈哈','呵呵')
#第一个参数为true的话 输出第二个参数 否则第三个
SELECT IF(3>2,'哈哈','呵呵')
SELECT IF('h'='h','哈哈','呵呵')

#ifnull 第一个参数不为null 返回自身 否select则返回第二个参数
SELECT IFNULL('zhangsan','lisi')
SELECT IFNULL(NULL,'ddd')
#条件为true返回1 否则0
SELECT IFNULL(3>5,'dddd')
SELECT IFNULL(0,'dddd')

模糊查询

#查询张姓老师的详细信息 %0或多个
SELECT * FROM teacher WHERE NAME LIKE '张%'

#查询李姓老师的详细信息
SELECT * FROM teacher WHERE NAME LIKE '李%'

#查询张姓 名字中带有一个 广字的老师的信息
SELECT * FROM teacher WHERE NAME LIKE '张%广%'

#查询名字中既有 奇 又有 洋字的老师的信息 
#注意多条件模糊书写格式
SELECT * FROM teacher WHERE NAME LIKE '%奇%' AND NAME LIKE '%洋%'
#_ 任意单个字符
#查询姓名两个字的老师
SELECT * FROM teacher WHERE NAME LIKE '__'

#查询姓名三个字的老师
SELECT * FROM teacher WHERE NAME LIKE '___'

#查询张姓 两个字的老师信息
SELECT * FROM teacher WHERE NAME LIKE '张_'

#查询张姓 两个以及两个字以上的老师信息
SELECT * FROM teacher WHERE NAME LIKE '张_%'

#in关键字简化sql or拼接条件
#查询老师地址在济南或泰安  
#注意null值判断问题
SELECT * FROM teacher WHERE address IN('济南','泰安')
#如果我们要查询地址不在 在泰安 并且不在 济南的老师信息
SELECT * FROM teacher WHERE address NOT IN('济南','泰安')

去重

#去重老师中的姓名 #去重基本操作单一去重
SELECT DISTINCT NAME,age FROM teacher

#特定范围  BETWEEN 10 AND 15
SELECT * FROM teacher WHERE tid BETWEEN 10 AND 15
#5.聚合函数 对结果进行运算 返回单一结果
#5.1查询总记录数
#count
#老师表的总条数
SELECT COUNT(1) FROM teacher
#查询姓张的老师总条数
SELECT COUNT(1) FROM teacher WHERE NAME LIKE '张%'
#count(1) count(*)
#*通配符代指所有列 统计结果 不会忽略值为null
#列名 代 值包括第一列 会忽略列值为空 
#1  包括了忽略所有列  1 代指第一行   总计不会忽略null值
#结果去看 1和* 结果一样的 1执行效率高一样

其他常用函数

#最大值
SELECT MAX(money) FROM teacher
#最小值
SELECT MIN(money) FROM teacher
#平均值
SELECT AVG(money) FROM teacher
#总和
SELECT SUM(money) FROM teacher
#查询工资等于3000的老师总数
SELECT COUNT(1) FROM teacher WHERE money=3000

#查询在地址在济南的老师的平均工资、最高工资、最低工资
SELECT AVG(money) AS '平均工资',MAX(money) AS '最高工资',MIN(money) AS '最低工资' FROM teacher WHERE address='济南'

子查询

#子查询 
#一行一列
#查询最高工资的老师信息

SELECT * FROM teacher WHERE money=(SELECT MAX(money) FROM teacher)

#多行多列
SELECT  address   FROM teacher   WHERE NAME = '张明'
#查询跟张明老师在同一个地址的老师信息(不包括张明)
#子查询 多行多列看成临时表 使用临时表去替换咱之前teacher做查询操作
#查询老师表中地址当条件  条件就是跟张明用一地址
SELECT * FROM (SELECT * FROM teacher WHERE address 
IN(SELECT address FROM teacher WHERE NAME='张明')) t1 WHERE t1.name<>'张明'

#查询工资大于平均工资的老师信息
SELECT * FROM teacher WHERE money>(SELECT AVG(money) FROM teacher)

#查询工资和张明老师一样的老师的信息,不包括张明
SELECT * FROM (SELECT * FROM teacher WHERE money =(SELECT money FROM teacher WHERE NAME='张明'))
 t1 WHERE t1.name<>'张明'

分组 group by

#统计老师各部门的平均工资
SELECT dep_id,AVG(money) '平均工资' FROM teacher GROUP BY dep_id
#先根据部门分组,再根据地址分组,求平均工资
SELECT address,AVG(money) FROM teacher GROUP BY dep_id,address
#分组中加条件 使用having 

#怎样统计部门教师数据大于2位的部门号
SELECT dep_id,COUNT(1) FROM teacher GROUP BY dep_id HAVING COUNT(1)>2

#查询平均工资大于2000的部门号,并按升序排序
SELECT dep_id FROM teacher GROUP BY dep_id HAVING AVG(money)=3000 ORDER BY dep_id
#查询各部门济南人平均工资,并按降序排序
SELECT dep_id,AVG(money),address FROM teacher GROUP BY dep_id,address 
HAVING address='济南' ORDER BY dep_id DESC

连接

#一对一关系 一个学生对应 一个班级  一个老师对应一个部门
#一对多关系 一个班级有多个学生
#多对多   商品对应多个订单  
#连表查询 内连接 展示数据只显示有关系的数据内容
#一条sql查询各老师的名称和部门名称呢
#隐式内连接
SELECT t1.name,d1.name '部门' FROM teacher t1,department d1 WHERE t1.dep_id=d1.did
#显式内连接
SELECT * FROM teacher t1 INNER JOIN department d1 ON t1.dep_id=d1.did
#查询工资等于3000的老师信息和部门名称
SELECT * FROM teacher t1 INNER JOIN department d1 ON t1.dep_id=d1.did WHERE t1.money=3000
#查询2号部门的老师信息和部门名称
SELECT * FROM teacher t1 INNER JOIN department d1 ON t1.dep_id=d1.did WHERE t1.dep_id=2

#右连接`department` 保证右边连接的表数据显示完整
SELECT * FROM teacher t1 RIGHT JOIN department d1 ON t1.dep_id=d1.did 

#左连接  保证左边表的数据显示完整
SELECT * FROM teacher t1 LEFT JOIN department d1 ON t1.dep_id=d1.did 

事务和权限

START TRANSACTION;#开启事务
INSERT INTO teacher (tid,NAME) VALUES(28,'王阳');
ROLLBACK;#回滚事务可以把数据回滚到执行操作之前的状态
COMMIT;#提交事务 把执行操作永久性的存入到咱数据库中



#创建用户
CREATE USER 'xiaohua'@'localhost' IDENTIFIED BY '1234';
#添加权限
GRANT CREATE, ALTER, INSERT, UPDATE, SELECT ON hello.* TO 'xiaohua'@'localhost';

视图

#可以把视图看成是一个展示部分表数据的容器
#创建视图
CREATE VIEW t1 AS SELECT NAME,age,address FROM teacher WHERE NAME='王老师'
#查看视图内容
SELECT * FROM t2
#修改视图
CREATE OR REPLACE VIEW t1(t1_name,t1_age,t1_address) AS SELECT NAME,age,address FROM teacher;
SELECT * FROM t1;
#删除视图
DROP VIEW t2;
#限定条件 的视图只能在当前条件下的数据进行dml操作
CREATE OR REPLACE VIEW t3 AS  SELECT tid,NAME,age,address FROM teacher WHERE tid=9 WITH CHECK OPTION
SELECT * FROM t3;
#DML 插入语句 删除语句 修改语句
INSERT INTO t1 VALUES('王天琪',55,'北京');
INSERT INTO t3 VALUES(30,'李天琪',33,'天津');
UPDATE t3 SET NAME='王天琪' WHERE tid=9
#注意事项  视图名不要跟表名重名
#视图进行dml操作随之有关系的表里面的数据也会进行dml操作  (加限定条件)

索引

#普通索引 index 后面书写指定一个列名这种情况下单列索引
CREATE TABLE index1 (
id INT(6),NAME VARCHAR(20),INDEX(id)
)
#多列索引
CREATE TABLE index2(
id INT(6),NAME VARCHAR(20),INDEX index_id_name(id,NAME)
)

#表已经创建成功了 添加索引
ALTER TABLE USER ADD INDEX index_address(address)

#删除索引
DROP INDEX index_address ON USER
#查看索引
SHOW INDEX FROM index2
posted @ 2020-07-03 20:48  不愿透漏姓名的王建森  阅读(233)  评论(0编辑  收藏  举报