0
点赞
收藏
分享

微信扫一扫

Mysql基础操作

霍华德 2022-02-27 阅读 54

# 库的增删改查:
    # 创建数据库并指定编码为:utf8
    CREATE DATABASE first CHARSET utf8;
    # 数据库一旦被创建就无法修改库的名称
    # 修改数据库编码格式为:utf8
    ALTER DATABASE FIRST CHARSET utf8;
    # 使用数据库
    use FIRST
    # 查看所有数据库
    show DATABASES
    # 查看当前数据库
    SELECT DATABASE();
    # 删除数据库
    DROP DATABASE FIRST_db;

# 表的增删改查
# 创建表
    create table first3(
        id INT,
        sname varchar(50),
        age INT(20),
        class_room VARCHAR(50),
        start_date DATE
    )
# 删除表
    DROP TABLE dep;

# 修改表
    # 修改主键属性
    # 修改主键属性时,需要删除原主键后,重新添加
    # drop 删除原主键
    alter table first3 drop id;  
    # 新增主键字段并添加自增属性
    alter table first3 add id_2 int PRIMARY KEY AUTO_INCREMENT    
    
    # 修改数据类型及约束:modify 
    # 修改数据类型为int
    alter table first3 MODIFY start_date INT
    # 修改数据类型为单选
    alter TABLE first3 MODIFY sexe enum('m','n')
    # 修改数据类型为多选
    alter TABLE first3 MODIFY hobbie SET('study','paly','sleep','swiming')
    
    # 增加数据的约束条件not null
    alter table first3 MODIFY start_date INT NOT NULL
    # 删除数据约束条件 not NULL
    alter table first3 MODIFY start_date INT
    
    # 添加默认值:DEFAULT('默认值') 
    ALTER TABLE first3 MODIFY sname VARCHAR(30) DEFAULT('bbb')    
    # 删除默认值
    ALTER TABLE first3 MODIFY sname VARCHAR(30)
    
    # UNIQUE 添加数据唯一性约束
    ALTER TABLE first3 MODIFY age INT UNIQUE    
    # 删除唯一约束: 
    ALTER TABLE first3 MODIFY age INT
    
    # 联合唯一,设置两个字段同时相同
    ALTER TABLE first3 ADD UNIQUE(age,sname)
    # 删除联合唯一
    ALTER TABLE first3 drop INDEX age
    
    # DROP 删除表字段
    ALTER TABLE first3 DROP move_date

    # 新增表字段:add
    # enum() 单选数据类型
    ALTER TABLE first3 add sexe enum('man','wumen')  
    # set() 多选数据类型
    ALTER TABLE first3 add hobbie SET('study','paly','sleep','swiming')    
    
    # AFTER 移动字段位置在某个字段后方                # first 移动字段位置为首位
    ALTER TABLE first3 MODIFY start_date INT AFTER id_2 
    
    # 查看表字段信息
    desc first3

# 主外键关联
    # 创建表并进行主外键关联
    # 创建部门表
    create table dep(
            id int primary key auto_increment,
            dep_name varchar(16),
            dep_desc varchar(255));
            
    # 创建人员表
    create table emp(
            id int,
            name varchar(6),
            age int,
            gender enum('male','female'),
            dep_id int not null,
            # 设置主键id,并添加主键自增属性
            PRIMARY KEY auto_increment(id),
            # 主外键关联,emp_dep为外键约束名称
            CONSTRAINT emp_dep FOREIGN KEY(dep_id) REFERENCES dep(id))
            
        # 在创建好的表中增加主外键关联
        # emp为人员表,是dep部门表的子表
        # emp_dep为主外键约束名称,删除外键约束时需要指定该名称
        # dep_id:emp人员表中的外键
        # dep(id):dep部门表中的主键
        ALTER TABLE emp add CONSTRAINT emp_dep FOREIGN KEY(dep_id) REFERENCES dep(id)
        
        # 添加 ON DELETE  和  ON UPDATE 
        # DELETE UPDATE 同时具有的属性:
        #(1)restrict约束:删除父表数据时,需要检查子表中是否存在关联数据,如过存在,则不允许删除
        #(2)no action约束:同上,如果存在不允许删除
        #(3)cascade级联:删除父表数据,子表中关联的数据一起删除
        #(4)set null:删除父表数据时,子表关联数据字段修改为null
        # 如已进行外键关联想要增添加on delete属性时,需要先删除外键,重新添加外键时增加该属性
        ALTER TABLE emp add CONSTRAINT emp_dep FOREIGN KEY(dep_id) REFERENCES dep(id) ON DELETE RESTRICT ON UPDATE RESTRICT
        
        # 删除外键约束
        ALTER TABLE emp DROP FOREIGN KEY emp_dep
        
        # 查看主外键关联状态
        SELECT @@FOREIGN_key_checks
        # 禁用主外键约束
        set foreign_key_checks=0
        # 启用主外键约束
        set foreign_key_checks=1
        
# 数据的增删改查
# 插入数据:INSERT
    # 查看表字段
    desc first3
    # 删除主键
    ALTER TABLE first3 DROP PRIMARY KEY 
    # 添加主键
    ALTER TABLE first3 MODIFY id_2 int PRIMARY KEY auto_increment
    # 插入一条数据,start_date=3
    INSERT INTO first3 (start_date) VALUES (3)
    # 插入多条数据,插入几行数据就加几个括号
    INSERT INTO first3 (start_date) VALUES(3),(4),(5),(6)
    
# 修改数据/更新数据:UPDATE
    # 更新一个字段数据
    # 修改id_2=1的那条数据,将start_date的数据修改为9
    UPDATE first3 SET start_date = 9 WHERE id_2 = 1
    # 更新多个字段数据
    UPDATE first3 SET start_date = 10,age = 18 WHERE id_2 = 1
    
# 删除数据:DELETE
    # 删除指定数据 在表中删除id_2=1的字段
    DELETE FROM first3 WHERE id_2 = 1
    # 删除表中所有数据,清空数据表
    DELETE FROM first3 # 不加where条件就是直接删除,后来新增的数据id以删除前最后一条最为开始
    TRUNCATE TABLE first3 # 删除速度快,序号直接从0开始

# 查询数据
    # 创建数据表
    create table emp2 (
    id int PRIMARY KEY auto_increment,
    name char(20) not null,
    gender enum('male','female') default 'male',
    age int not null default 28,
    hire_date date,
    job_title varchar(30),
    salary float(10,2),
    office_num int,
    dep_id int
)
    # 插入数据
    INSERT INTO emp2(name,gender,age,hire_date,job_title,salary,office_num,dep_id)values
    ('weiwei','male',78,'20150302','teacher',1000000.31,401,1),
    ('lala','male',81,'20130305','teacher',8300,401,1),
    ('zhangsan','male',73,'20140701','teacher',3500,401,1),
    ('liulaogen','male',28,'20121101','teacher',2100,401,1),
    ('aal','female',18,'20110211','teacher',9000,401,1),
    ('zhugelang','male',18,'19000301','teacher',30000,401,1),
    ('成龙','male',48,'20101111','teacher',10000,401,1),
    ('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
    ('丫丫','female',38,'20101101','sale',2000.35,402,2),
    ('丁丁','female',18,'20110312','sale',1000.37,402,2),
    ('星星','female',18,'20160513','sale',3000.29,402,2),
    ('格格','female',28,'20170127','sale',4000.33,402,2),
    ('张野','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
    ('程咬金','male',18,'19970312','operation',20000,403,3),
    ('程咬银','female',18,'20130311','operation',19000,403,3),
    ('程咬铜','male',18,'20150411','operation',18000,403,3),
    ('程咬铁','female',18,'20140512','operation',17000,403,3)

    # 查询所有字段信息,*标识所有字段
    SELECT * FROM emp2
    # 查询指定字段信息,在表中查询name和age两个字段的信息
    SELECT name,age FROM emp2
    # 通过4则运算查询,查询员工姓名及年薪。
    SELECT name,salary*12 FROM emp2
    # as 给查询的字段起别名为new_salary
    SELECT name,salary*12 as new_salary FROM emp2
    # as给表起别名
    SELECT * FROM emp2 as e
    
    # 根据where条件查询内容
    # 查询老师的姓名及年龄,WHERE后面跟查询条件
    SELECT name,age FROM emp2 WHERE job_title='teacher'
    # and 多条件查询
    SELECT name,age FROM emp2 WHERE job_title='teacher' and office_num=401
    # or 多条件查询
    SELECT name,age,office_num FROM emp2 WHERE job_title='teacher' or office_num=402
    # BETWEEN……and 查询数值之间的数据 
    SELECT name,age FROM emp2 WHERE age BETWEEN 20 and 80
    # >5000 and <8000 与between^and结论相同
    SELECT name,age FROM emp2 WHERE age>20 and age<80
    # in 在某某某数据里
    SELECT name,age FROM emp2 WHERE age IN(28,38,48,58,68)
    # not in 不在某某某数据里
    SELECT name,age FROM emp2 WHERE age NOT IN(28,38,48,58,68)
    
    # 模糊查询:like
    # 查询name字段中以a开头的数据,%代表通配符,标识多个字符
    SELECT name,age FROM emp2 WHERE name LIKE 'a%'
    # 一个'-'代表一个字符
    SELECT name,age FROM emp2 WHERE name LIKE 'a__' 
    
    # 分组查询:group by
    # 将job_title进行分组,查询字段必须是分组字段
    # 想要查询其他字段,可以借助于聚合函数count,avg,sum
    SELECT job_title FROM emp2 GROUP BY job_title
    # count(id)计算分组后id的数量
    SELECT job_title,COUNT(id)FROM emp2 GROUP BY job_title
    #  avg(age)计算分组后的平均年龄
    SELECT job_title,avg(age)FROM emp2 GROUP BY job_title
    # 查看男女员工最大年龄,最小年龄,和整体年龄
    SELECT gender,MAX(age),MIN(age),SUM(age)FROM emp2 GROUP BY gender
    
    # having语句:将分组后的数据进行筛选查询
    SELECT age FROM emp2 GROUP BY age having age=28
    
    # 升序:ORDER BY 字段名称 asc
    SELECT age FROM emp2 ORDER BY age asc
    # 降序:ORDER BY 字段名称 desc
    SELECT age FROM emp2 ORDER BY age desc
 
 
    # limit 查询显示数据数量
    # 显示前3条
    SELECT name,age FROM emp2 LIMIT 3 
    # 从1条开始往后查5条
    SELECT name,age FROM emp2 LIMIT 0,5
    # 从5条开始往后查7条
    SELECT name,age FROM emp2 LIMIT 4,7
    
    # 正则查询:REGEXP
    # 以指定字符头:‘^’
    SELECT name,age FROM emp2 WHERE name regexp '^w'
    # 以指定字符结尾:’$‘
    SELECT name,age FROM emp2 WHERE name REGEXP 'i$'
    # 匹配指定字符内容:
    SELECT name,age FROM emp2 WHERE age REGEXP '8'
    
    
# 多表联查
        #删除表
        DROP TABLE dep;
        DROP TABLE emp
        # 准备数据
        # 创建部门表
        create table dep(
            id int primary key,
            name char(20));
            
        # 创建员工表
        create table emp(
            id int primary key auto_increment,
            name char(20),
            sex enum("male","female") not null default "male",
            age int,
            dep_id int);
        # 在员工表中增加职位id
        ALTER TABLE emp add posit_id int
        
        # 创建员工岗位表
        CREATE TABLE posit(
            id int PRIMARY KEY auto_increment,
            posit_name VARCHAR(30) NOT NULL,
            posit_detil VARCHAR(50)
        )
        # 员工岗位表中增加部门id字段
        ALTER TABLE posit ADD dep_id INT
        
        # 查看部门数据
        SELECT * FROM dep
        # 修改部门数据
        UPDATE dep SET name='产品' WHERE name='销售'
        UPDATE dep SET name='hr' WHERE name='人力资源'
        # 插入岗位数据
        INSERT INTO posit(dep_id,posit_name,posit_detil) VALUES
        (3,'产品经理','负责产品设计及项目跟进'),
        (3,'产品助理','负责协助产品经理'),
        (2,'前端开发工程师','负责网页界面编写'),
        (2,'后端开发工程师','负责产品服务端逻辑代码编写'),
        (4,'运营经理','负责产品上线运营工作'),
        (5,'人力资源管理师','负责人员招聘及人才储备等工作')
            
         # 部门表插入数据
         insert into dep(id,name) values
            (200,'技术'),
            (201,'人力资源'),
            (202,'销售'),
            (203,'运营');
            
         # 员工表插入数据
        insert into emp(name,sex,age,dep_id) values
        ('ailsa','male',18,200),
        ('lala','female',48,201),
        ('huahua','male',38,201),
        ('zhangsan','female',28,202),
        ('zhaosi','male',18,200),
        ('shenteng','female',18,204)
        
        # 多表拼接
        # 内连接:inner join
        # 内连接需要两个表中关联的字段同时存在两个表中,若某条数据只存在一个表中时,则合并后不显示该条数据
        SELECT * FROM emp INNER JOIN dep ON emp.dep_id = dep.id
        
        # 外连接-左连接
        # 以左边的表为主,到右边的表中匹配内容,若左表中内容右表中没有,则右表数据为null
        SELECT * FROM emp LEFT JOIN dep ON emp.dep_id = dep.id
        
        # 外连接-右连接
        # 以右边的表为主,到左边的表中匹配内容,若右表中内容左表中没有,则左表数据为null
        SELECT * FROM emp RIGHT JOIN dep ON emp.dep_id = dep.id
        
        # 三表连接
        SELECT * FROM(emp LEFT JOIN dep ON emp.dep_id = dep.id) 
        LEFT JOIN posit ON emp.posit_id = posit.id
    
# 练习题
# 以内连接的方式查询emp和dep表,并且emp表中的age字段值必须大于25,即找出年龄大于25岁的员工以及员工所在的部门\
# 以内连接的方式查询emp和dep表,并且emp表中的age字段值必须大于25,并且以age字段的升序方式显示
    SELECT emp.name,dep.name,emp.age FROM emp INNER JOIN dep 
    ON emp.dep_id = dep.id WHERE age > 25 ORDER BY age ASC
    
# 查询平均年龄在25岁以上的部门名
    SELECT dep.name,avg(emp.age) as a FROM emp INNER JOIN dep ON emp.dep_id = dep.id 
    GROUP BY dep.name HAVING a > 25
    
# 查看技术部员工姓名
    # 嵌套查询方法
    SELECT name FROM emp WHERE dep_id = (SELECT id FROM dep WHERE name = '技术')
    # 多表链接查询方法
    SELECT emp.name FROM emp INNER JOIN dep ON emp.dep_id = dep.id WHERE dep.name = '技术'
    
# 查询大于所有人平均年龄的员工名字与年龄
    SELECT name,age FROM emp WHERE age > (SELECT AVG(age) FROM emp)

举报

相关推荐

0 条评论