MYSQL基础入门一

1.专业词汇

  • DB (database):数据库,像仓库一样,保存一系列分门别类数据
  • DBMS(database management system):数据库管理系统,用于创建,操作,使用DB。 常见的有Mysql,SQL sever,Oracle等
  • SQL(structure query language):结构化查询语言,在DBMS中通用,但是不同的DBMS也有一些自己独有的语句

2.Mysql基础操作

2.1 基础语句

登录数据库: 使用系统命令符操作,之前需要将mysql安装文件路径加入系统环境变量中,具体操作网上有教程

mysql -h localhost -P 3306 -u root -p #按提示输入密码,然后成功登录数据库

show databases; #查看有几个数据库,语句一般以;或者\g结尾

use test; #进入到test数据库中

show tables from mysql; #查看mysql这个库中有哪些表,注意这时候系统还停留在test数据库中

select database(); #查看自己在哪个库中

创建一张表

mysql> create table study(
    -> id int,
    -> name varchar(20));  
#之前停留在test数据库中,所以这就是在test数据库中创建了一张叫study的表,其中有两列数据,id的属性是int, name的属性是字符串(varchar)

show tales; #这样可以看到刚刚创建的study表

desc study; #展示study这张表的结构

2.2 SQL语法规范

  • 不区分大小写,但建议关键字大写,表名、列名小写
  • 每条命令用;或者\g结尾
  • 一条命令如果很长,可以缩减或者换行
  • 注释:#指数内容 或者-- 注释内容
  • 多行注释:/* 注释内容 */
  • Ctrl+Shift+C 注释 SQL 窗口选择内容, Ctrl+Shift+R 从选择内容删除注释

3.DQL(查询语言)

SQL语言可以分为四大类,第一种叫做Database query language ,包含各种查询语言

3.1基础查询

/*
语法:
select 查询列表 from 表名;
*/

USE myemployees; #打开指定的库 

#查询表中的单个字段
SELECT last_name FROM employees;

#查询表中的多个字段
SELECT last_name,salary,email FROM employees;

#查询表中的所有字段, 双击表名可代替手动输入
SELECT * FROM `employees`; #``着重号也可以不加, 主要起到识别库名的作用, 防止sql指令和库名恰好重叠时的失效

#查询常量值
SELECT 100;
SELECT 'john';

#查询表达式
SELECT 100%50;#取模

#查询函数
SELECT	VERSION();


起别名: select 什么, 显示出来的数据的名称就是什么, 但是我们可以给他起别名

如果查询的字段有重复,我们也可以取别名给区分开来

SELECT last_name AS 名字,salary,email FROM employees;
#这样显示出来表格第一行就是名字,而不是last_name

SELECT last_name  名字,salary,email FROM employees;
# AS甚至都可以省,直接加个空格

去除重复值: 比如查询100个员工属于哪些部门, 这样会得到100条数据,但是我只需要每个部门出现一次就好

select distinct department_id from employees 

CONCAT()函数: 把员工姓和名连成一起, 并且显示为姓名 CONCAT()函数

注意: 如果有一行数据为null,那么拼接出来都是null

SELECT CONCAT (salary,email)AS 薪水邮箱 FROM employees;


SELECT 
  IFNULL (`commission_pct`,0) AS 奖金率,
  `commission_pct`  #在旁边显示原本记录来对比下
FROM
  employees ;
#假定有些人的ommission_pct是null, 那么可以通过ifnull函数来判断, 如果是null就显示0,如果不是就不管

显示表的结构

DESC departments;  #DESC是describe的缩写

3.2条件查询

/*
条件查询语法:
	select
		查询列表
	from	
		表名
	where	
		筛选条件;

筛选分类:
	1.按条件表达式筛选,(> < = != >= <=)这些表达式
	2.按逻辑表达式筛选,逻辑运算符:and(&&),or(||),not(!) 
	3.模糊查询:like,between and,in, is null
*/

#1.按条件表达式筛选:查询工资大于12000的员工信息
SELECT 
  `employee_id`,
  `first_name`,
  `salary`
FROM
  `employees` 
WHERE `salary` > 12000; 

#2.按逻辑表达式筛选(其实就是用来链接条件表达式):查询工资在10000到20000之间的员工名,工资,奖金
SELECT 
  `first_name`,
  `salary`,
  `commission_pct` 
FROM
  `employees` 
WHERE `salary` >= 10000 
  AND `salary` <= 20000 ; #之后其实用between and 语句更加简洁
  
  
#3.模糊查询
#3.1 like:查询员工名中包含字符a的员工信息
SELECT 
  * 
FROM
  `employees` 
WHERE `first_name` LIKE '%a%' ;

#通配符:%代表任意字符(包括0字符), _表示任意单个字符

#3.2转义\:查询员工名字第二个字符是下划线
SELECT
`last_name`
FROM
`employees`
WHERE
`last_name` LIKE '_\_%' #注意此处\的用法,加了转义符后,下划线不再是任意字符的意思了
#自定义转义符的方法: `last_name` LIKE '_¥_%' ESCAPE '¥' 

#3.3 between and: 查询员工编号在100到120之间的员工信息(和python不同,这里100和120都包含)
SELECT 
  * 
FROM
  `employees` 
WHERE `employee_id` BETWEEN 100  #也可以写 NOT BETWEEN ,就是不在这个区间的
  AND 120 
  

 #3.4 in: 查询员工类别是IT_PROG,AD_VP,AD_PRES 中的员工信息
 SELECT
 *
 FROM
 `employees`
 WHERE `job_id` IN ('IT_PROG','AD_VP','AD_PRES');
 
 #3.5 is null:查询没有奖金的员工名和奖金率
SELECT 
`first_name`,`commission_pct`
FROM 
`employees`
WHERE `commission_pct` IS NULL;  #如果这里写is not null , 那么就是筛选出有奖金的员工


3.3排序查询

/*
条件查询语法:
	select
		查询列表
	from	
		表名
	where	
		筛选条件;
	order by 排序列表 asc|desc(升序降序)

*/



#DESCEND降序:查询员工信息,工资从高到底排序
SELECT 
  * 
FROM
  `employees` 
ORDER BY salary DESC ;

#ASCEND升序
SELECT 
  * 
FROM
  `employees` 
ORDER BY salary ASC ;#如果不写默认是升序



#按表达式的结果排序:按年薪的高低显示员工的信息
SELECT 
  `first_name`,
  (`salary` * 12) AS 年薪 #起别名
FROM
  `employees` 
ORDER BY 年薪 DESC ;



#用函数的输出值排序:例如按姓名长度排序
SELECT 
  `first_name`
FROM
  `employees` 
ORDER BY length(first_name) DESC ;

#多字段排序:例如按工资升序,工资相同的再按员工编号降序
SELECT	*
FROM `employees`
ORDER BY `salary` ASC, `employee_id` DESC;



4.常见函数

4.1字符函数

LENGTH函数

SELECT LENGTH('张三丰')#用于获取字节个数,UTF-8中一个汉字3个字节,GBK中只占2个字节

CONCAT函数

SELECT CONCAT(`first_name`,'_',`last_name`) #把2个值用下划线拼接起来

UPPER LOWER函数

SELECT UPPER('ran') #大小写转换
SELECT LOWER('ran')

#把姓变成大写,名变小写,然后拼接
SELECT 
  CONCAT(
    UPPER(`last_name`),
    LOWER(`first_name`)
  ) 名字 
FROM
  `employees` 

SUBSTR又叫SUBSTRING函数

SELECT SUBSTR('李莫愁爱上了陆展源',7) #取从第7到最后一个字符,	SQL中从1开始
SELECT SUBSTR('李莫愁爱上了陆展源',1,3)#取第1到3个字符

INSTR函数

SELECT INSTR('李莫愁陆展源爱上了陆展源','陆展源') 
#返回第二串字符在第一串中的开始字节数,如果没有就返回0

TRIM函数

SELECT TRIM('        李莫愁     ');
#去掉前后空格
SELECT TRIM('a' FROM 'aaaa李莫愁aaaaaa');
#去掉前后的a

LPAD,RPAD函数

SELECT LPAD('李莫愁',10,'a');
#从左边填充a,充满李莫愁10个字符

SELECT LPAD('李莫愁',10,'a');
#从右边填充a,充满李莫愁10个字符

REPLACE函数

SELECT REPLACE('李莫愁1234565','123','321');
#把第一个字符串中的123替换为321 (所有出现的都会被替换)

4.2数学函数

ROUND四舍五入

SELECT ROUND(4.555)
#返回5
SELECT ROUND(4.555,2) #表示小数点后保留2位,返回4.56

CEIL函数向上取整

SELECT CEIL(4.555)  
#返回大于这个数的最小整数

FLOOR向下取整

SELECT FLOOR(4.555) 
#返回小于等于该参数的最大整数

TRUNCATE截断函数

SELECT TRUNCATE(4.555,3)  
# 小数点后保留3位

MOD取余

SELECT MOD(99.1,3)  
#返回99.1除3的余数  
SELECT 99.1%3  #和MOD作用相同

4.3日期函数

NOW返回日期函数

SELECT NOW()
#返回系统日期 

CURDATE,CURTIME

SELECT CURDATE();
#只返回日期不返回时间
SELECT CURTIME();
#只返回时间不返回日期

YEAR,MONTH,DATE,HOUR,MINUTE,SECOND

SELECT YEAR('1999-1-1');
#返回1999,以此内推
SELECT MONTHNAME('1999-1-1');
#返回January

**STR_TO_DATE,DATE_FORMAT **

SELECT STR_TO_DATE('2003-04-01','%Y-%m-%d');
#字符转日期,DATE_FORMAT是日期格式转字符。 
#大小写和格式需要留意,不然容易报错:
Y:四位年份
y:两位年份
m:两位数月份
c:不补0的月份
d:两位数日期
H:24小时制
h:12小时制
i:两位数分钟
s:两位数秒

4.4其他函数

SELECT VERSION(); #显示当前MYSQL版本
SELECT DATABASE();#显示当前所在数据库
SELECT USER(); #显示:用户名@主机名 (表示XX用户连接XX主机,和email地址类似)

4.5流程控制函数

IF函数:实现if else效果

SELECT IF(10>5,2,3)
#如果10大于5,返回2,否则返回3

CASE函数流程控制

/*使用一:
查询员工的工资,
当部门号为30,显示1.1倍工资
当部门号为40,显示1.2倍工资
当部门号为50,显示1.3倍工资
其他部门显示原工资
*/
SELECT 
`first_name`,`department_id`,
CASE`department_id` 
WHEN 30 THEN `salary` * 1.1 
WHEN 40 THEN `salary` * 1.2 
WHEN 50 THEN `salary` * 1.3 
ELSE salary 
END AS 新工资 
FROM`employees` ;



/* 使用二:
查询工资情况
如果工资>20000,显示A
如果工资>15000,显示B
如果工资>10000,显示C
否则显示D
*/

SELECT	`first_name`,`salary`,
CASE 
WHEN `salary`>20000 THEN 'A'
WHEN `salary`>15000 THEN 'B'
WHEN `salary`>10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM `employees`;


posted @ 2020-04-26 15:28  buono  阅读(158)  评论(0)    收藏  举报