zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Linux虚拟机的安装(使用Centos6.3)
    【转载】接口测试用例的设计原则
    Oracle PLSQL游标、游标变量的使用
    利用shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中
    源码安装rlwrap 0.43(为了方便使用linux下的sqlplus)
    Oracle自定义脱敏函数
    Oracle分析函数FIRST_VALUE、LAST_VALUE
    MYSQL性能测试工具SYSBENCH
    OEL7.6源码安装MYSQL5.7
    OEL7.6安装Oracle Database 19C(VERSION 19.3.0.0)
  • 原文地址:https://www.cnblogs.com/JeasonIsCoding/p/13232597.html
Copyright © 2011-2022 走看看