MySQL增删改查(基础)

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增删改查(基础))