Day01_ DDL,DML,DQL

DB:DataBase 数据库

  • DDL:数据定义语言,用来定义数据库对象:库、表、列等

​ CREATE、ALTER、DROP (create alter)

  • DML:数据操作语言,用来定义数据库记录

​ INSERT、UPDATE、DELETE

  • DQL:数据查询语言,用来查询记录(数据)

数据库所有符号必须在英文状态

一、测试数据库是否安装成功:

win+R: mysql+空格

mysql -uroot -p 回车

只要出现 enter password则安装成功

输入密码后

quit; 退出

如果之前安装过,两种方式都进入不了,那进入服务查看服务是否启动

win+r 输入 services.msc 进入服务

如果没有启动,则启动

如果是启动状态,连接不成功,停止,重启电脑,再启动,再试

如果还不行,一般会有错误码。把错误码复制到百度查找

第二种启动 停止服务方法

进入dos

启动输入:net start mysql

停止输入:net stop mysql

注意

  1. select * from emp; (在dos命令中加分号)

如果报错,可能是没有选择数据库,在命令行前面加一行:USE + 数据库名,或者在快捷键窗口下拉列表选择数据库

  1. MySQL注释符号:

    -- (两个-) + 空格
    #
    
  2. 系统自带的库MySQL库,不能删

二、DDL:数据定义语言,对库、表、列的增、删、改

库、表、列都不能有相同的

创建后必须刷新:在左边窗口空白处右键,点击Refresh Object Browser

1、库:

  • 创建库 (必须刷新) create database 库名;

  • 删除库 drop database 库名;

  • 查看所有库 show databases;

  • 查看数据定义的信息 show create database 库名;

  • 修改库的编码格式 alter database 库名 character set gbk/utf8;

-- 对库、表、列的增(create)、删(drop)、改(alter)
-- 创建库
CREATE DATABASE sbq001;
CREATE DATABASE sbq002;
#删除库
DROP DATABASE sbq002;
#查看所有库 databases
SHOW DATABASES;

#查看数据定义的信息
SHOW CREATE DATABASE sbq001;

#修改库的编码格式
ALTER DATABASE sbq001 CHARACTER SET gbk;
ALTER DATABASE sbq001 CHARACTER SET utf8;

2、表:

  • 创建表

    create table 表名(

    ​ 列1 数据类型,

    ​ 列2 数据类型

    );

  • 删除表,不可能操作

    drop table 表名;

  • 修改表名

    rename table 表名 to 新表名

  • 查看表的细节 show create table 表名;

  • 修改表的字符编码,不会让我们操作

    alter table 表名 character set utf8/gbk;

-- 创建表  
-- create table 表名(列1 数据类型, 列2 数据类型);
CREATE TABLE t1(id INT,);
CREATE TABLE t2(
        id INT,
        NAME VARCHAR(20)
);

#删除表,不可能操作
DROP TABLE t2;
#查看表的细节
SHOW CREATE TABLE t1;
#将运行结果:表,复制到命令行窗口,就能查看表的细节
CREATE TABLE `t1` (
  `id` INT(11) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8

#修改表的字符编码,不会让我们操作
ALTER TABLE t1 CHARACTER SET gbk;

CREATE TABLE `t1` (
  `id` INT(11) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=gbk

ALTER TABLE t1 CHARACTER SET utf8;

3、列

列的增、删、改

create table 表名(列名,数据类型)

  • 添加列

    alter table 表名 add 字段名 字段类型;

  • 修改列(一般只会改大小)

    alter table 表名 modify 字段名 字段类型;

  • 删除列

    alter table 表名 drop 字段名;

#创建表
CREATE TABLE t3(
        id INT
);

#添加列
ALTER TABLE t3 ADD NAME VARCHAR(20);

#修改列  不会操作(使用很少,一般只会改大小)
#alter table 表名 modify 字段名 字段类型;
ALTER TABLE t3 MODIFY NAME VARCHAR(60);
#删除列 (不会操作)
ALTER TABLE t3 DROP NAME;

注意:创建表和列的时候不要用中文,用英文

-- 创建一个员工表:
CREATE TABLE staff(
        id INT,  #存整数,在实际开发过程中id代表唯一
        NAME VARCHAR(20), 
        gender CHAR(2), #固定长度一般用char,性别一般存 男 女 未知
                            #必须放单引号里‘’
        birthday DATE,  #‘2028-2-10’ 必须放‘’
                        #如果使用系统函数
        job VARCHAR(20),#长度不固定,一般用varchar,
                        #必须用‘’,最多传20个文字
        salary DOUBLE(5,2),#包括小数最多只能存5位,小数最多2位
        RESUME TEXT,
        isDelete INT
);

面试题:DML DQL

三、DML:数据操作语言,对表中数据的增、删、改

非常重要,做到不看代码就能写出来。

1、插入:

添加(插入)有三种方式,通常使用第二种

  • 第一种:初始化数据的时候用

    insert into 表名 values(必须把所有列对应上值,目前null也可以)

    INSERT INTO staff VALUES(1,'张三','男','2000-2-11','java工程师',345,NULL,NULL);
    
  • 第二种:必须记住,开发使用最多

    insert into 表名(列名1,列名2) values(列名1的值,列名2的值);# 列名先后顺序随便

  • 第三种:不用(也是在初始化数据的时候用,但是用到比较少)

    insert into emp(id,gender)values(),(),();

-- DML
INSERT INTO staff VALUES(1,'张三','男','2000-2-11','java工程师',5000.00,NULL,NULL);

-- 插入
#now()不能加单引号
#第一种方式:
INSERT INTO staff VALUES(1,'李四','男',NOW(),'java工程师',8888.00,NULL,NULL);
#第二种方式(开发使用最多,必须记住)
INSERT INTO staff(id,gender) VALUES(3,'女');
INSERT INTO staff(birthday,id,gender) VALUES(NOW(),4,'女');
# 第三种方式
INSERT INTO staff(id,gender) VALUES(5,'男'),(6,'女'),(7,'男');
INSERT INTO staff VALUES
(8,'邓一','男',NOW(),'java工程师',66,NULL,NULL),
(9,'张若雪','女',NOW(),'设计师',500,NULL,NULL),
(10,'张猛','男',NOW(),'java工程师',200,NULL,NULL);
#salary,最大只能存999.99,超出的数据存进去均为999.99

SELECT * FROM staff;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tI5ixP90-1639737979530)(C:\Users\86191\AppData\Roaming\Typora\typora-user-images\image-20210721133955768.png)]

2、修改:

update 表名 set 列名1=列名1的值 where 列名=值;

UPDATE staff SET gender='不知' WHERE id=8;#后面一定要加where,定位到某行,不然会把所有数据都修改

*update 表名 set 列名1=列名1的值

修改多列:

update 表名 set 列名1=列名1的值,列名2=列名2的值, where 列名=值;

UPDATE staff SET birthday=NOW(),job='DB2',gender='女' WHERE id=2;

3、删除:

delete from 表名 where 列名 = 值

DELETE FROM staff WHERE id=3;

注意:在实际开发过程中,很多公司都不会使用delete ,使用逻辑删除,假删除

其实就是修改值,通常表中会多列,isDelete 1代表正在使用数据,0代码删除数据

每次查询时,加一个条件即可,只查询正在使用数据

#逻辑删除数据:假删除 isDelete
UPDATE staff SET isDelete=1;
UPDATE staff SET isDelete=0 WHERE id=3;#这是逻辑删除数据
SELECT * FROM staff WHERE isDelete=1;

四、DQL

比DML更重要,写得更多

select
selection_list #要查询的列名称
    from table_list #要查询的表名称
    where condition #行条件
    group by grouping_columns #对结果分组
    having condition #分组后的行条件
    order by sorting_columns #对结果排序
    limit offset_start,row_count #结果限定
-- 学生表
CREATE TABLE stu (
	sid	CHAR(6),
	sname		VARCHAR(50),
	age		INT,
	gender	VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

-- 员工表
CREATE TABLE emp(
	empno		INT,
	ename		VARCHAR(50),
	job		VARCHAR(50),
	mgr		INT,
	hiredate	DATE,
	sal		DECIMAL(7,2),
	comm		DECIMAL(7,2),
	deptno		INT
) ;
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

# 部门表
CREATE TABLE dept(
	deptno		INT,
	dname		VARCHAR(14),
	loc		VARCHAR(13)
);
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES(30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES(40, 'OPERATIONS', 'BOSTON');

1、查询

  • 查询所有的列
SELECT * FROM stu;
SELECT * FROM emp;
SELECT * FROM dept;
  • 查询指定的列
SELECT empno,ename FROM emp; # 查询empno,ename两列
  • 条件查询
#查询性别为女(female)
SELECT * FROM stu WHERE gender='female';

​ and(且)

#查询性别为女,并且年龄小于50的记录
SELECT * FROM stu WHERE gender='female' AND age<50;

​ or(或)

#查询学号为s_1001,或者姓名为liSi的记录
SELECT * FROM stu WHERE sid='S_1001' OR sname='liSi';

​ in

#查询学号为S_1001,S_1002,S_1003的记录
#方式一:or   太麻烦,开发不用
SELECT * FROM stu WHERE sid='S_1001' OR sid='S_1002' OR sid='S_1003';
#方式二:开发使用in
SELECT * FROM stu WHERE sid IN('S_1001','S_1002','S_1003');

​ not in

#查询学号不为S_1001,S_1002,S_1003的记录
#方式一:!=  and   太麻烦,开发不用
SELECT * FROM stu WHERE sid!='S_1001' AND sid!='S_1002' AND sid!='S_1003';
#方式二:开发使用  not in
SELECT * FROM stu WHERE sid NOT IN('S_1001','S_1002','S_1003');

​ is

#查询性别为null的记录
SELECT * FROM stu WHERE gender='null';#错误表达方式
SELECT * FROM stu WHERE gender IS NULL;
#查询性别不为null的记录
SELECT * FROM stu WHERE gender IS NOT NULL;
#查询性别非男的学生记录<>
#方式一(一般使用第一种)
SELECT * FROM stu WHERE gender != 'male';
#方式二
SELECT * FROM stu WHERE gender <>'male';
#方式三
SELECT * FROM stu WHERE NOT gender = 'male';

​ 范围

#查询年龄在15到55之间的学生记(包括15和55)
#第一种方式
SELECT * FROM stu WHERE age >=15 AND age <=55;
#第二种方式
SELECT * FROM stu WHERE age BETWEEN 15 AND 55;

模糊查询

  • 模糊查询:将’=‘改为’like’

    当想查询姓名中包含a字母的学生时就需要使用模糊查询
    模糊查询需要使用关键字like。

  • 通配符:
    ‘_’ 任意一个字符
    %:任意0~n个字符

#查询姓名由5个字母构成的学生记录:5个'_'
SELECT * FROM stu WHERE sname LIKE '_____';
#查询姓名由5个字母构成的学生记录,并且第一个字符为w
SELECT * FROM stu WHERE sname LIKE 'w____';
#查询姓名由5个字母构成的学生记录,并且第三个字符为n
SELECT * FROM stu WHERE sname LIKE '__n__';

#查询姓名w开头
SELECT * FROM stu WHERE sname LIKE 'w%';
#查询姓名包括n的记录
SELECT * FROM stu WHERE sname LIKE '%n%';

字段控制查询

  • 去重查询

    (1)第一种方式 distinct

    SELECT DISTINCT deptno FROM emp;  #去掉了重复的数据
    SELECT DISTINCT deptno,job FROM emp;   #两列看成一个整体,去掉重复的数据
    

    (2)第二种方式 可以叫分组 group

    SELECT deptno FROM emp GROUP BY deptno;
    SELECT deptno,job FROM emp GROUP BY deptno,job;
    
  • 别名

    非常重要,特别是多表连接

    ```mysql
    # 还未用到别名
    SELECT emp.* FROM emp;  # 与下一行作用一样
    SELECT * FROM emp; 
    SELECT emp.comm,emp.deptno,emp.empno,emp.ename FROM emp;
    ```
    
    # 别名   emp as sbq;  别名为sbq
    SELECT emp.* FROM emp AS sbq;  # 报错,取过别名之后,之前的名字不能再用
    SELECT sbq.* FROM emp AS sbq;
    SELECT * FROM emp AS sbq;
    SELECT e.* FROM emp AS e;
    
    # 名为e   AS 省略
    SELECT e.* FROM emp e;
    SELECT e.comm,e.deptno,e.ename FROM emp e;
    
    # e. 省略  as 省略
    SELECT comm,deptno,ename FROM emp e;
    SELECT comm,deptno,e.ename FROM emp e;
    
    # 列加别名
    SELECT comm AS comm_a,deptno AS deptno_a,ename AS ename_a FROM emp e;
    SELECT comm comm_a,deptno deptno_a,ename ename_a FROM emp e;
    SELECT e.comm AS a,e.deptno AS b,e.ename AS c FROM emp AS e;
    
    
  • ifnull( )

查询雇员的月薪与佣金之和

# 查询雇员的月薪与佣金之和
SELECT ename,sal+comm FROM emp;  #这样会有问题:null+0=null

# ifnull(comm,0)
SELECT IFNULL (comm,0) FROM emp;
SELECT ename,sal+IFNULL (comm,0) FROM emp;
SELECT ename,sal+IFNULL (comm,0) AS sal FROM emp;
  • order by 排序 开发只对数字:升序、降序
SELECT * FROM emp;
#升序  asc
SELECT * FROM emp ORDER BY sal ASC;  #asc 默认
SELECT * FROM emp ORDER BY sal;
# 降序 desc
SELECT * FROM emp ORDER BY sal DESC;
# 多个字段排序
SELECT * FROM emp ORDER BY sal DESC , empno DESC;

SELECT * FROM emp ORDER BY sal , empno DESC;
SELECT ename,sal+IFNULL (comm,0) FROM emp ORDER BY ename,sal+IFNULL (comm,0);
SELECT ename,sal+IFNULL (comm,0) AS sal FROM emp ORDER BY sal;
  • 聚合函数 sum avg max min count

    聚合函数是用来做纵向运算的函数

    • count( ) :统计指定列不为null的记录行数

      # count() 统计指定列不为null的记录行数
      SELECT COUNT(*) FROM emp;  # 总共有多少条数据
      SELECT COUNT(comm) FROM emp;
      
    • max ( ) :计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算

      min ( ) :计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算

      SELECT MAX(sal) FROM emp;
      SELECT MIN(sal) FROM emp;
      
    • sum ( ) :计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0

      # 求和
      SELECT SUM(sal) FROM emp;
      
    • avg ( ) :计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0

      SELECT AVG(sal) FROM emp;
      
上一篇:第三周总结


下一篇:【java spring】bean的定义