美文网首页
MySQL增删改查(基础)

MySQL增删改查(基础)

作者: 肉包君 | 来源:发表于2021-06-29 10:35 被阅读0次

    2020-09-14

    MySQL增删改查操作

    DQL:数据查询语言
    DML:数据操作语言
    DCL:数据控制语言
    DDL:数据定义语言

    MySQL数据库安装,参考https://www.jianshu.com/p/e4f15004e9f7
    系统数据库
    information_schema:虚拟库,主要存储系统中一些数据库对象信息,例用户表信息、列信息、权限信息、字符信息等
    performance_schema:主要存储数据库服务器的性能参数
    mysql:授权库,主要存储系统用户的权限信息
    sys:主要存储数据库服务器的性能参数

    数据库的使用

    mysql -uroot -p"11" #登录数据库

    # 库操作
    #1 查库
    mysql> show databases;
    mysql> show create database company;    #查库的详细信息
    mysql > select database();      #显示当前所在的库
    #2 创库
    mysqladmin create db1 -uroot -p11     #无需登录数据库直接创建
    mysql> create database company character set 'utf8';          #创库并制定字符集
    mysql > grant all on company.* to 'perin'@'192.168.191.%' identified by '11';      #授权
    mysql > flush privileges;      #刷新授权
    # 用库
    mysql> use company;
    # 删库
    mysql > drop database company;
    
    # 表操作
    表是数据库存储数据的基本单位,由若干个字段组成,主要用来存储数据记录
    #1 查表
    mysql > show tables;        #显示所有表名称
    mysql > desc t1;               #显示表所有字段
    mysql > show create table t1;      #显示表的创建过程
    mysql> show table status like 't2';   #显示表状态
    #2 创表
    mysql > create table t1(id int auto_increment primary key, name char(20), age int);
    mysql > edit
    create table student1(
    id int,
    name varchar(50),                        
    sex enum('m','f'),
    age int);
    #3 改表
    mysql > rename table t1 to t2;       #修改表名
    mysql > alter table t1 add addr char(50);      #在表t1中添加字段(带修饰符)
    mysql > alter table t1 add addr char(50) after age;
    mysql > alter table t1 add addr char(50) first;
    mysql > alter table t1 change addr address varchar(50) not null;       #change可修改字段名、修饰符
    mysql > alter table t1 modify addr varchar(50) not null;        #modify只能修改表字段的修饰符,不能改字段名
    #4 删表
    mysql > alter table t1 drop address;       #删除字段
    mysql > drop table t1;     #删除表
    #5 复制表(主键、外键、索引不会被复制)
    mysql > create table t4(select * from t1);       #t1表和它的数据一起复制到t4中
    mysql > create table t3(select * from t1 where 1=2);       #复制表结构,不包含数据
    
    #数据操作
    编辑器:edit    (SQL语句的脚本编辑器)
    #1 查数据
    #单表查询
    mysql > SELECT id,age FROM t1;DISTINCT
    mysql> SELECT * FROM mysql.user\G;       #\G标准化输出
    mysql > SELECT DISTINCT hire_date FROM t5;     #hire_date这个字段的数据去重
    mysql > SELECT CONCAT(name, ' annual salary: ', salary*14)  AS Annual_salary FROM employee;     #查到结果格式为(名字   annual salary:   总薪水),concat(),字符串连接函数
    mysql > SELECT math FROM db1.t1 WHERE math>50 and math<600;  
    mysql > SELECT math FROM db1.t1 WHERE not math>50;
    mysql > SELECT name,sex FROM stu WHERE age BETWEEN 10 and 13;        #包含10和13
    mysql > SELECT name,job_description FROM employee WHERE job_description IS NULL;      #is null  和 is not null
    mysql > SELECT name,job_description FROM employee WHERE job_description='';     #条件为空(啥也没有,连null也不显示)
    mysql > SELECT name, salary FROM employee WHERE salary IN (4000,5000,6000,9000);     #只要salary是括号中的任意一个都符合条件
    mysql> SELECT name,age FROM stu ORDER BY age;      #order by 排序(默认asc 升序,即小-->大)
    mysql> SELECT name,age FROM stu ORDER BY age desc;     #desc降序(大-->小)
    mysql> SELECT * FROM stu ORDER BY age limit 1,3;    #limit x,y   从x+1个开始取y条记录
    mysql > SELECT * FROM employee ORDER BY hire_date DESC,salary ASC;       #先按入职时间排再按薪水排
    mysql > SELECT dep_id,GROUP_CONCAT(name) as emp_members FROM employee5 GROUP BY dep_id;     #分组查询,group by 后面只能跟主键
    mysql > select dep_id,AVG(salary) FROM emp GROUP BY dep_id;   #avg()平均值     sum()总和
    mysql> select * from stu where name like "q%";     #模糊查询   _表示单个任意字符  , %表示任意字符
    mysql> select * from stu where name regexp 'q+';    #正则查询, +表示任意一个字符,^以什么开头,$以什么结尾
    mysql> select name from t2 where math=(select max(math) from t2);    #子查询
    
    #多表查询
    1.内连接(inner join...on):只连接匹配到的行
    (例:找出由部门的员工信息和所在部门)
    mysql > select a.emp_id,a.emp_name,a.age,b.dep_name from emp as a inner join dep as b on a.dep_id = b.dep_id;
    2.外连接
    ①left join...on:只显示左表内匹配的值,无论右边的表是否匹配(所以左表对应字段的数据是完整的,右表对应字段的数据可能会出现空值或者null)
    (例:找出所有员工和部门名称,包括没有部门的)
    mysql > select emp_id,emp_name,dep_name from emp left join dep on emp.dep_id = dep.ddep_id;
    +--------+----------+-----------------------+
    | emp_id | emp_name | dep_name |
    +--------+----------+-----------------------+
    |      1 | tian        | hr                         |
    |      5 | robin      | hr                         |
    |      2 | tom        | it                          |
    |      3 | jack        | it                          |
    |      4 | alice       | sale                     |
    |      6 | natasha  | NULL                  |
    +--------+----------+-----------------------+
    6 rows in set (0.00 sec)
    ②right join...on:只显示右表内匹配的值,无论左表是否匹配
    (例:找出所有部门对应的员工,包括没有员工的部门)
    mysql > select emp_id,emp_name,dep_name from emp right join dep on emp.dep_id = dep.ddep_id;
    +--------+----------+-----------------------+
    | emp_id | emp_name | dep_name |
    +--------+----------+-----------------------+
    |      1 | tian       | hr                          |
    |      2 | tom       | it                           |
    |      3 | jack       | it                           |
    |      4 | alice      | sale                      |
    |      5 | robin      | hr                         |
    |NULL| NULL     | fd                         |
    +--------+----------+-----------------------+
    6 rows in set (0.01 sec)
    3.全外链接:包含做有两个表的全部行(一般不用)
    
    #复合条件连接查询
    (例:找出所有部门中年龄大于25的员工,按年龄降序,一般用于查询公司老龄化员工)
    mysql> select emp_id,emp_name,age,dep_name from emp,dep where emp.dep_id=dep.dep_id and emp.age > 25 order by age desc;
    
    #子查询:查询语句中嵌套查询语句,内层查询的结果作为外层查询的条件
    子查询语句中可包含关键字:in,not in,any,all,exists,not exists 和运算符:=,!=,>,<
    ①关键字IN
    (例:查询非空部门的员工信息)
    mysql > select * from emp where emp.dep_id in (select dep.dep_id from dep);
    (例:查询老龄化部门)
    mysql > select * from dep where dep_id in (select emp.dep_id from emp where age > 25);
    ②关键字exists
    若内层查询能查出结果,只返回True,不返回查询结果,此时外层可继续执行查询操作,反之内层查询返回False,外层不执行查询,最终结果为Empty
    (例:dep表中存在203,故返回True)
    mysql> select * from emp where exists (select * from dep where dep_id=203);
    
    #2 加数据
    mysql  > INSERT INTO t1 VALUES('1','kk','20','gx'),('2','qq','18','gz');
    mysql> INSERT  INTO t1 set id=6,age=25;
    mysql> INSERT  INTO t1(id,name) VALUES(10,"ww");
    mysql> INSERT  INTO t1  select * FROM t2 where id=5;
    #3 改数据
    mysql > UPDATE t1 SET age='18' WHERE id='5';
    mysql > UPDATE user SET authentication_string=password('new_passwd') WHERE user='root';
    mysql > flush privileges;
    #4 删数据
    mysql > delete from t1 WHERE id='3';
    #5 复制数据
    mysql > insert into t5 select * from t1;
    

    linux命令行操作数据库

    mysql -uroot -p11 -e "use db1;create table t1(id int,name char(20);insert into t1(id) values(20))"
    

    在数据库中执行linux命令

    mysql > system pwd
    

    NULL说明:
    1、等价于没有任何值、是未知数。
    2、NULL与0、空字符串、空格都不同,NULL没有分配存储空间。
    3、对空值做加、减、乘、除等运算操作,结果仍为空。
    4、比较时使用关键字用“is null”和“is not null”。
    5、排序时比其他数据都小(索引默认是降序排列,小→大),所以NULL值总是排在最前。

    查询常用函数
    count() #统计函数
    max()
    min()
    avg()
    sum()
    database()
    user()
    password()
    now() #当前时间
    md5()
    sha1()

    相关文章

      网友评论

          本文标题:MySQL增删改查(基础)

          本文链接:https://www.haomeiwen.com/subject/kqdzektx.html