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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容