一、操作数据库

1.1 创建数据库


CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
create_specification:   
[DEFAULT] CHARACTER SET charset_name  | [DEFAULT] COLLATE collation_name
-- 1. ~创建一个名称为mydb1的数据库。
create database mydb1;
-- 2.~创建一个使用gbk字符集的mydb2数据库。
create database mydb2 character set gbk;
-- 3.~创建一个使用utf8字符集,并带校对规则的mydb3数据库。
create database mydb3 character set utf-8 collate utf8_bin;

1.2 查看数据库

-- 显示数据库语句:
SHOW DATABASES
-- 显示数据库创建语句:
SHOW CREATE DATABASE db_name -- 1. ~查看当前数据库服务器中的所有数据库
show databases;
-- 2. ~查看前面创建的mydb2数据库的定义信息
show create database mydb3;

1.3 修改数据库

    ALTER  DATABASE  [IF NOT EXISTS] db_name  [alter_specification [, alter_specification] ...]
alter_specification:   
[DEFAULT] CHARACTER SET charset_name  | [DEFAULT] COLLATE collation_name -- 1. ~查看服务器中的数据库,并把其中mydb2字符集修改为utf8
alter database mydb2 character set utf8;

1.4 删除数据库


DROP DATABASE [IF EXISTS] db_name
-- 1. ~删除前面创建的mydb1数据库
drop database mydb1;

1.5 选择数据库

--  1. 进入数据库:
USE db_name;
--2.查看当前所选的数据库:
SELECT DATABASE();

二、操作表

2.1 创建表

CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype,
)[character set 字符集] [collate 校对规则] -- field:指定列名 datatype:指定列类型
-- ~创建一个员工表employee 

    CREATE TABLE employee(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20) UNIQUE,
gender bit NOT NULL,
birthday date,
entry_date date,
job varchar(40),
salary double,
resume text
);

2.2 查看表

-- 查看表结构:
DESC tab_name
-- 查看当前数据库中所有表:
SHOW TABLES;
-- 查看当前数据库表建表语句
SHOW CREATE TABLE tab_name;

2.3 修改表

ALTER TABLE table_name  ADD/MODIFY/DROP/CHARACTER SET/CHANGE  (column datatype [DEFAULT expr][, column datatype]...);

-- *修改表的名称:
RENAME TABLE 表名 TO 新表名; -- 1. ~在上面员工表的基本上增加一个image列。
alter table employee add image blob; -- 2.~修改job列,使其长度为60。
alter table employee modify job varchar(60); -- 3. ~删除gender列。
alter table employee drop gender; -- 4. ~表名改为user。
rename table employee to user; -- 5. ~修改表的字符集为gbk
alter table user character set gbk; -- 6. ~列名name修改为username
alter table user change name username varchar(20);

2.4 删除表

DROP TABLE tab_name;

-- ~删除user表
drop table user;

三、操作表记录CRUD

3.1 INSERT

INSERT INTO table [(column [, column...])] VALUES (value [, value...]);

-- 插入的数据应与字段的数据类型相同。
-- 数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
-- 在values中列出的数据位置必须与被加入的列的排列位置相对应。
-- 字符和日期型数据应包含在单引号中。
-- 插入空值:不指定或insert into table value(null)
-- 如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表
-- ~使用insert语句向表中插入三个员工的信息
INSERT INTO employee (id,name,gender,birthday,entry_date,job,salary,resume) VALUES (null,'张飞',1,'1999-09-09','1999-10-01','打手',998.0,'老大的三弟,真的很能打');
INSERT INTO employee VALUES (null,'关羽',1,'1998-08-08','1998-10-01','财神爷',9999999.00,'老大的二弟,公司挣钱都指着他了');
-- 插入多条数据
INSERT INTO employee VALUES (null,'刘备',0,'1990-01-01','1991-01-01','ceo',100000.0,'公司的老大'),(null,'赵云',1,'2000-01-01','2001-01-01','保镖',1000.0,'老大贴身人');

3.2 UPDATE


UPDATE tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]   -- UPDATE语法可以用新值更新原有表行中的各列。
-- SET子句指示要修改哪些列和要给予哪些值。
-- WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行 -- 1. ~将所有员工薪水修改为5000元。
update employee set salary = 5000;
-- 2. ~将姓名为’张飞’的员工薪水修改为3000元。
update employee set salary = 3000 where name='张飞';
-- 3. ~将姓名为’关羽’的员工薪水修改为4000元,job改为ccc。
update employee set salary=4000,job='ccc' where name='关羽';
-- 4. ~将刘备的薪水在原有基础上增加1000元。
update employee set salary=salary+1000 where name='刘备';
     

3.3 DELETE

DELETE FROM tbl_name [WHERE where_definition]    

-- 如果不使用where子句,将删除表中所有数据。
-- Delete语句不能删除某一列的值(可使用update)
-- 使用Delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
-- 同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。 外键约束
-- 删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档。
-- 1. ~删除表中名称为’张飞’的记录。
delete from employee where name='张飞';
-- 2. ~删除表中所有记录。
delete from employee;
-- 3. ~使用truncate删除表中记录。
truncate table employee;

3.4 SELECT

~1.基本查询
SELECT [DISTINCT] *|{column1, column2. column3..} FROM table; ~查询表中所有学生的信息。
select * from exam;
~查询表中所有学生的姓名和对应的英语成绩。
select name,english from exam;
~过滤表中重复数据
select distinct english from exam;
~在所有学生分数上加10分特长分显示。
select name , math+10,english+10,chinese+10 from exam;
~统计每个学生的总分。
select name ,english+math+chinese from exam;
使用别名表示学生总分。
select name as 姓名 ,english+math+chinese as 总成绩 from exam;
select name 姓名 ,english+math+chinese 总成绩 from exam;
select name english from exam; ~2.使用where子句进行过滤查询
~查询姓名为张飞的学生成绩
select * from exam where name='张飞';
~查询英语成绩大于90分的同学
select * from exam where english > 90;
~查询总分大于230分的所有同学
select name 姓名,math+english+chinese 总分 from exam where math+english+chinese>230;
~查询英语分数在 80-100之间的同学。
select * from exam where english between 80 and 100;
~查询数学分数为75,76,77的同学。
select * from exam where math in(75,76,77);
~查询所有姓张的学生成绩。
select * from exam where name like '张%';
select * from exam where name like '张__';
~查询数学分>70,语文分>80的同学。
select * from exam where math>70 and chinese>80; ~3.使用order by关键字对查询结果进行排序操作
SELECT column1, column2. column3.. FROM table where... order by column asc|desc;
asc 升序 -- 默认就是升序
desc 降序 ~对语文成绩排序后输出。
select name,chinese from exam order by chinese desc;
~对总分排序按从高到低的顺序输出
select name 姓名,chinese+math+english 总成绩 from exam order by 总成绩 desc;
~对姓张的学生成绩排序输出
select name 姓名,chinese+math+english 总成绩 from exam where name like '张%' order by 总成绩 desc;
~4.聚合函数
(1)Count -- 用来统计符合条件的行的个数
~统计一个班级共有多少学生?
select count(*) from exam;
~统计数学成绩大于90的学生有多少个?
select count(*) from exam where math>70;
~统计总分大于230的人数有多少?
select count(*)from exam where math+english+chinese > 230;
(2)SUM -- 用来将符合条件的记录的指定列进行求和操作
~统计一个班级数学总成绩?
select sum(math) from exam;
~统计一个班级语文、英语、数学各科的总成绩
select sum(math),sum(english),sum(chinese) from exam;
~统计一个班级语文、英语、数学的成绩总和
select sum(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
在执行计算时,只要有null参与计算,整个计算的结构都是null
此时可以用ifnull函数进行处理
~统计一个班级语文成绩平均分
select sum(chinese)/count(*) 语文平均分 from exam;
(3)AVG -- 用来计算符合条件的记录的指定列的值的平均值
~求一个班级数学平均分?
select avg(math) from exam;
~求一个班级总分平均分?
select avg(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam; (4)MAX/MIN -- 用来获取符合条件的所有记录指定列的最大值和最小值
~求班级最高分和最低分
select max(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
select min(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
~5.分组查询
~对订单表中商品归类后,显示每一类商品的总价
select product,sum(price) from orders group by product;
~询购买了几类商品,并且每类总价大于100的商品
select product 商品名,sum(price)商品总价 from orders group by product having sum(price)>100; where子句和having子句的区别:
where子句在分组之前进行过滤having子句在分组之后进行过滤
having子句中可以使用聚合函数,where子句中不能使用
很多情况下使用where子句的地方可以使用having子句进行替代 ~查询单价小于100而总价大于150的商品的名称
select product from orders where price<100 group by product having sum(price)>150; ~~sql语句书写顺序:
select from where groupby having orderby
~~sql语句执行顺序:
from where select group by having order by

四、备份恢复数据库

方式1:
备份: 在cmd窗口下 mysqldump -u root -p dbName > c:/1.sql
恢复: 方式1:在cmd窗口下 mysql -u root -p dbName < c:/1.sql
方式2:
在mysql命令下, source c:/1.sql
要注意恢复数据只能恢复数据本身,数据库没法恢复,需要先自己创建出数据后才能进行恢复.

五、多表设计多表查询

5.1 外键约束

表是用来保存显示生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,向这种约束就叫做外键约束

CREATE TABLE dept(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20)
); INSERT INTO dept values(null,'财务部'),(null,'人事部'),(null,'销售部'),(null,'行政部'); create table emp(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20),
dept_id int,
FOREIGN KEY (dept_id) REFERENCES dept(id)
); INSERT INTO emp values(null,'小明',1),(null,'哈利波特',2),(null,'李四',3),(null,'张三',3);

5.2 多表设计

  • 一对多:在多的一方保存一的一方的主键做为外键
  • 一对一:在任意一方保存另一方的主键作为外键
  • 多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系

5.3 多表查询

  • 笛卡尔积查询:
    将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用
select * from dept,emp;
  • 内连接查询:查询的是左边表和右边表都能找到对应记录的记录
select * from dept,emp where dept.id = emp.dept_id;
select * from dept inner join emp on dept.id=emp.dept_id;
  • 外连接查询:

    • 左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录
    select * from dept left join emp on dept.id=emp.dept_id;
    • 右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录
    select * from dept right join emp on dept.id=emp.dept_id;
    • 全外连接查询:在内连接的基础上增加左边表有而右边表没有的记录和右边表有而左表表没有的记录
    select * from dept full join emp on dept.id=emp.dept_id;
    -- mysql不支持全外连接
    -- 可以使用union关键字模拟全外连接:
    select * from dept left join emp on dept.id = emp.dept_id
    union
    select * from dept right join emp on dept.id = emp.dept_id;

六、其他

  • MySQL中修改提示符

    • 第一种方式:登录之后修改
MySQL 默认提示符为 >
prompt [MySQL提示符]


MySQL提示符
  • 第二种方式在登录的时候就修改
mysql -uroot -proot -prompt [MySQL提示符]
  • MySQL修改分隔符,默认分隔符为; 修改为\
DELIMITER \\
  • SQL语言分类
  • SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。

【MySQL】SQL语句基础的更多相关文章

  1. MYSQL SQL语句技巧初探(一)

    MYSQL SQL语句技巧初探(一) 本文是我最近了解到的sql某些方法()组合实现一些功能的总结以后还会更新: rand与rand(n)实现提取随机行及order by原理的探讨. Bit_and, ...

  2. mysql sql语句大全(转载)

      1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 ...

  3. MySQL客户端工具的使用与MySQL SQL语句

    MySQL客户端工具的使用 1.MySQL程序的组成 客户端 mysql:CLI交互式客户端程序 mycli:CLI交互式客户端程序;使用sql语句时会有提示信息 mysql_secure_insta ...

  4. MySQL数据库:SQL语句基础、库操作、表操作、数据类型、约束条件、表之间的关系

    数据库相关概念: 1. 数据库服务器:运行数据库管理软件的计算机 2. 数据库管理软件:MySQL.Oracle.db2.slqserver 3. 库:文件夹,用来组织文件/表 4. 表:文件(类似于 ...

  5. 使用Mysql执行SQL语句基础操作

    SQL:  又叫结构化语言,是一种用来操作RDBMS的数据库语言,在关系型数据库中都支持使用SQL语句,如oracle.mysql等等. 注意: 在关系型数据库中sql语句是通用的,而在非关系型数据库 ...

  6. mysql分析sql语句基础工具 -- explain

    分析sql语句 explain explain (sql语句) G; 分析结果: id sql语句编号如果是连接查询,表之间是平等关系,编号相同:如果有子查询,编号递增. select——type 查 ...

  7. SQL语句基础之 单表查找

    Sql语句之 单表查询 一.一般查询 1.查看表中的所有记录 以及 所有字段(属性) 语句 : select * from student; 2.只查看某些字段 语句:select sname,sex ...

  8. SQL语句基础之 管理数据库,表 和 数据

    MySQL中的基本sql语句 MySQL中主要有三个大的对象,第一个是数据库,有了数据库后,我们才能在数据库里面建表,因为Mysql是关系数据库,它的数据都会以记录的形式存到表里,所以第二个是表,然后 ...

  9. 精妙SQL语句 基础

    精妙SQL语句SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我留一些更好的佳句, ...

随机推荐

  1. XCode教程之 如何在苹果开发者平台添加设备UDID

    XCode教程之 如何在苹果开发者平台添加设备UDID.在Xcode开发中,如何在苹果开发者平台添加新的手机设备UDID,进行测试,具体如下 工具/原料 Apple Developer 方法/步骤 1 ...

  2. [IR] Inverted Index & Boolean retrieval

    教材:<信息检索导论> 倒排索引 How to build Inverted Index? 1. Token sequence. 2. Sort by terms. 3. Dictiona ...

  3. AC与AP的安装使用(未经实战,仅供参考,未完待续)

    AC:无线控制器(Wireless Access Point Controller) AP:无线访问接入点(WirelessAccessPoint) 以信锐AC为例 AC设备的管理口为MANAGE(E ...

  4. [LeetCode] 624. Maximum Distance in Arrays 数组中的最大距离

    Given m arrays, and each array is sorted in ascending order. Now you can pick up two integers from t ...

  5. 面试必备:Java 原子操作的实现原理[精品长文]

    本文整理自<Java并发编程的艺术>第二章 作者:方腾飞 魏鹏 程晓明 原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被 ...

  6. 解决在manjaro下,vscode无法将chrome作为默认浏览器打开

    Same issue. The solution is simple. Find the name of the exec command, for google chrome in arch lin ...

  7. laravel Carbon函数

    原文地址:https://blog.csdn.net/lbwo001/article/details/53063867 carbon官方网站:https://carbon.nesbot.com/doc ...

  8. 最新 途牛java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.途牛等10家互联网公司的校招Offer,因为某些自身原因最终选择了途牛.6.7月主要是做系统复习.项目复盘.LeetCode ...

  9. 第07组 Beta冲刺(1/4)

    队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:学习了很多东西 Github签入记录 接下来的计划:继续学习 还剩下哪些任务:后端部分 燃尽图 遇到的困难:自己太菜了 收获和疑问: ...

  10. Java开发笔记(一百三十八)JavaFX的箱子

    前面介绍了JavaFX标签控件的用法,其中提到Label文本支持中文字体,那么它到底支持哪些中文字体呢?自然要看当前的操作系统都安装了哪些字体才行,对于中文的Windows系统,默认安装了黑体“Sim ...