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()