当前位置:Gxlcms > 数据库问题 > Mysql

Mysql

时间:2021-07-01 10:21:17 帮助过:7人阅读

1.sql语句规范: 

sql是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。

在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持sql。

<1> 在数据库系统中,SQL语句不区分大小写(建议用大写) 。但字符串常量区分大小写。建议命令大写,表名库名小写;

<2> SQL语句可单行或多行书写,以“;”结尾。关键词不能跨多行或简写。

<3> 用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。

SELECT * FROM tb_table
            WHERE NAME="YUAN";

<4> 注释:单行注释:--

               多行注释:/*......*/

<5>sql语句可以折行操作

2.数据类型

 技术分享

作用:存储年龄,等级,id,手机号,身高,薪水等数字

2.1 无符号类型

=========有符号和无符号tinyint==========
#tinyint默认为有符号
MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号
MariaDB [db1]> desc t1;
MariaDB [db1]> insert into t1 values
    -> (-129),
    -> (-128),
    -> (127),
    -> (128);
MariaDB [db1]> select * from t1;
+------+
| x    |
+------+
| -128 | #-129存成了-128
| -128 | #有符号,最小值为-128
|  127 | #有符号,最大值127
|  127 | #128存成了127
+------+



#设置无符号tinyint
MariaDB [db1]> create table t2(x tinyint unsigned);
MariaDB [db1]> insert into t2 values
    -> (-1),
    -> (0),
    -> (255),
    -> (256);
MariaDB [db1]> select * from t2;
+------+
| x    |
+------+
|    0 | -1存成了0
|    0 | #无符号,最小值为0
|  255 | #无符号,最大值为255
|  255 | #256存成了255
+------+

 

2.1 显示长度和存储字节

  

mysql> create table test(id int);
Query OK, 0 rows affected (0.01 sec)

mysql> desc test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
row in set (0.00 sec)
int(11)是默认的显示宽度,因为int是用4个字节存储,所以能存储的最大数就是4294967295,是一个十位数字,对于无符号类型,所以默认显示宽度就是11;
同理:tinyint的默认显示宽度是4位。


2.3 decimal类型

float:浮点型,含字节数为4,32bit,        数值范围为-3.4E38~3.4E38(7个有效位)

double:双精度实型,含字节数为8,64bit     数值范围-1.7E308~1.7E308(15个有效位)

decimal:数字型,128                    数值范围 ±1.0 × E28 to ±7.9 × E28(28个有效位)

decimal的精度比double大,所能储存的最大数却比double要小 。decimal是存在精度损失的,只不过较小而已!

 

2.4 BIT

BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
  注意:对于位字段需要使用函数读取
      bin()显示为二进制
      hex()显示为十六进制

 

mysql> create table t(id bit);
Query OK, 0 rows affected (0.03 sec)

mysql> desc t;
+-------+--------+------+-----+---------+-------+
| Field | Type   | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| id    | bit(1) | YES  |     | NULL    |       |
+-------+--------+------+-----+---------+-------+
row in set (0.00 sec)

mysql> insert t values (1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t;
+------+
| id   |
+------+
|      |
+------+
row in set (0.00 sec)

mysql> select bin(id) from t;
+---------+
| bin(id) |
+---------+
| 1       |
+---------+
row in set (0.00 sec)
mysql> alter table t modify id bit(5);
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t values(8);
Query OK, 1 row affected (0.00 sec)

mysql> select bin(id),hex(id) from t;
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 1       | 1       |
| 1000    | 8       |
+---------+---------+
rows in set (0.00 sec)

 

 

 

2.5 字符串类型

  

存储字符串:

CHAR系列 :CHAR VARCHAR
TEXT系列 : TINYTEXT TEXT MEDIUMTEXT LONGTEXT

存储二进制数据:

BINARY系列: BINARY VARBINARY
BLOB 系列 :  TINYBLOB BLOB MEDIUMBLOB LONGBLOB

 技术分享

 

解析:

技术分享
/*
  char (m)
   
      CHAR列的长度固定为创建表时声明的长度: 0 ~ 255。其中m代表字符串的长度。
      PS: 即使数据小于m长度,也会占用m长度
  varchar(m)
      VARCHAR列中的值为可变长字符串,长度: 0 ~ 65535。其中m代表该数据类型所允许保存的字符串
      的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。

      注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度
      更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡

  text
      text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 ? 1)个字符。

  mediumtext
      A TEXT column with a maximum length of 16,777,215 (2**24 ? 1) characters.

  longtext
      A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 ? 1) 
      characters.

*/
View Code

 

 

 注意:

在查询的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格。
mysql> create table t1(x char(5),y varchar(5));
mysql> insert into t1 values(你瞅啥  ,瞅你妹                 );
mysql> select x,length(x),y,length(y) from t1;
+--------+-----------+----------+-----------+
| x      | length(x) | y        | length(y) |
+--------+-----------+----------+-----------+
| 你瞅啥 |         9 | 瞅你妹   |        11 |
+--------+-----------+----------+-----------+

 

 

2.6 日期类型

  

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

 

技术分享

 

作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

 

2.7 year

============year===================

create table t_year(born_year year);
insert into  t_year values (1901),
                           (2155);

select * from t_year;
+-----------+
| born_year |
+-----------+
|      1901 |
|      2155 |
+-----------+
rows in set (0.00 sec)

 

2.8 data and datatime

mysql> select now();
+---------------------+
| now()                                |
+---------------------+
| 2017-08-01 19:38:54          |
+---------------------+
1 row in set (0.00 sec)

 

============date,time,datetime===========

create table t_mul(d date,t time,dt datetime);

insert into t_mul values(now(),now(),now());

select * from t_mul;


mysql> select * from t_mul;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2017-08-01 | 19:42:22 | 2017-08-01 19:42:22 |
+------------+----------+---------------------+
row in set (0.00 sec)

 

2.9 timestamp

create table t_stamp(t TIMESTAMP);

insert into t_stamp values();
insert into t_stamp values(NULL );

select * from t_stamp;

+---------------------+
| t                   |
+---------------------+
| 2017-08-01 19:46:24 |
| 2017-08-01 19:46:24 |
+---------------------+
rows in set (0.00 sec)

 

datatime and timestamp

技术分享
/*  
    在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,
    但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。

1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。

2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。
  在mysql服务器,操作系统以及客户端连接都有时区的设置。

3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的
  空间利用率更高。

4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间
 (CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默
  认更新为当前时间。
  
  */

datetime与timestamp
View Code

 

2.10 枚举类型和集合类型

字段的值只能在给定范围中选择,如单选框,多选框
enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

解析:

技术分享
/*
枚举类型(enum)
An ENUM column can have a maximum of 65,535 distinct elements. 
(The practical limit is less than 3000.)
示例:
    CREATE TABLE shirts (
        name VARCHAR(40),
        size ENUM(‘x-small‘, ‘small‘, ‘medium‘, ‘large‘, ‘x-large‘)
    );
    INSERT INTO shirts (name, size) VALUES (‘dress shirt‘,‘large‘), 
                                            (‘t-shirt‘,‘medium‘),
                                            (‘polo shirt‘,‘small‘);

集合类型(set)
A SET column can have a maximum of 64 distinct members.
示例:
    CREATE TABLE myset (col SET(‘a‘, ‘b‘, ‘c‘, ‘d‘));
    INSERT INTO myset (col) VALUES  (‘a,d‘),
                                    (‘d,a‘), 
                                    (‘a,d,a‘), 
                                    (‘a,d,d‘),
                                    (‘d,a,d‘);
                                    
                                    
*/
View Code

 

 

3 数据库操作

-- 1.创建数据库(在磁盘上创建一个对应的文件夹)
    create database [if not exists] db_name [character set xxx] 
    
-- 2.查看数据库
    show databases;查看所有数据库
    show create database db_name; 查看数据库的创建方式

-- 3.修改数据库
    alter database db_name [character set xxx] 

-- 4.删除数据库
    drop database [if exists] db_name;
    
-- 5.使用数据库
    切换数据库 use db_name; -- 注意:进入到某个数据库后没办法再退回之前状态,但可以通过use进行切换
    查看当前使用的数据库 select database();

 

 

4 数据表操作

  4.1 创建表

    

-- 语法
CREATE TABLE tab_name(
            field1 type[完整性约束条件],
            field2 type,
            ...
            fieldn type
        )[character set xxx];

 

示例:

技术分享
CREATE TABLE employee(
            id int primary key auto_increment ,
            name varchar(20),
            gender bit default 1,
            birthday date,
            department varchar(20),
            salary double(8,2) unsigned,
            resume text
          );
View Code

  4.2 查看表信息

    desc tab_name              查看表结构
    show columns from tab_name      查看表结构
    show tables             查看当前数据库中的所有的表
    show create table tab_name      查看当前数据库表建表语句 

  4.3 修改表结构

-- (1)增加列(字段)
      alter table tab_name add [column] 列名 类型[完整性约束条件][first|after 字段名];
      
      #添加多个字段
      alter table users2 
            add addr varchar(20),
            add age  int first,
            add birth varchar(20) after name;

   -- (2)修改一列类型
      alter table tab_name modify 列名 类型 [完整性约束条件][first|after 字段名];
      -- (3)修改列名
      alter table tab_name change [column] 列名 新列名 类型 [完整性约束条件][first|after 字段名];
     -- (4)删除一列
      alter table tab_name drop [column] 列名;-- (5)修改表名
      rename table 表名 to 新表名;

   -- (6)修该表所用的字符集    
      alter table student character set utf8;

  4.4 删除表

drop table tab_name;

 

 

 

5 表记录操作

  5.1 增加表记录

/* 
<1>插入一条记录:

  insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);
    

<2>插入多条记录:
  insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......),
                                        (value1,value2,.......), 
                             ...                               ;

<3>set插入:
  insert [into] tab_name set 字段名=值 

*/

 

 

 示例:

技术分享
INSERT employee (name,gender,birthday,salary,department) VALUES
                      ("alex",1,"1985-12-12",8000,"保洁部"),
                      ("egon",1,"1987-08-08",5000,"保安部"),
                      ("yuan",1,"1990-06-06",20000,"教学部");


INSERT employee VALUES (8,"女神",0,"1992-02-12","教学部",7000,"");

INSERT employee SET name="wusir",birthday="1990-11-11";
View Code

 

 

  5.2修改表记录

    
update tab_name set field1=value1,field2=value2,......[where 语句]

 

示例:

技术分享
update employee_new set birthday="1989-10-24" WHERE id=1;

--- 将yuan的薪水在原有基础上增加1000元。
update employee_new set salary=salary+4000 where name=yuan;
View Code

  5.3 删除表记录

方式1:
delete from tab_name [where ....]

方式2:
truncate table emp_new;

            /*    
            如果不跟where语句则删除整张表中的数据
            delete只能用来删除一行记录
            delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
            TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在
            事务中恢复。
            */

 

示例:

技术分享
-- 删除表中名称为’alex’的记录。
   delete from employee_new where name=alex;
-- 删除表中所有记录。
   delete from employee_new;

-- 注意auto_increment没有被重置:alter table employee auto_increment=1;
View Code

 

 

 

6 查询表记录

-- 查询语法:

   SELECT *|field1,filed2 ...   FROM tab_name
                  WHERE 条件
                  GROUP BY field
                  HAVING 筛选
                  ORDER BY field
                  LIMIT 限制条数



-- Mysql在执行sql语句时的执行顺序:
                -- from  where  select  group by  having order by

 

6.1 准备表和数据

技术分享
CREATE TABLE emp(
    id       INT PRIMARY KEY AUTO_INCREMENT,
    name     VARCHAR(20),
    gender   ENUM("male","female","other"),
    age      TINYINT,
    dep      VARCHAR(20),
    city     VARCHAR(20),
   salary    DOUBLE(7,2)
);


INSERT INTO emp (name,gender,age,dep,city,salary) VALUES
                ("yuan","male",24,"教学部","河北省",8000),
                ("egon","male",34,"保安部","山东省",8000),
                ("alex","male",28,"保洁部","山东省",10000),
                ("景丽阳","female",22,"教学部","北京",9000),
                ("张三", "male",24,"教学部","河北省",6000),
                ("李四", "male",32,"保安部","北京",12000),
                ("王五", "male",38,"教学部","河北省",7000),
                ("赵六", "male",19,"保安部","河北省",9000),
                ("猪七", "female",24,"保洁部","北京",9000);

SELECT  * FROM emp;
View Code
mysql> SELECT  * FROM emp;
+----+-----------+--------+------+-----------+-----------+----------+
| id | name      | gender | age  | dep       | city      | salary   |
+----+-----------+--------+------+-----------+-----------+----------+
|  1 | yuan      | male   |   24 | 教学部    | 河北省    |  8000.00 |
|  2 | egon      | male   |   34 | 保安部    | 山东省    |  8000.00 |
|  3 | alex      | male   |   28 | 保洁部    | 山东省    | 10000.00 |
|  4 | 景丽阳    | female |   22 | 教学部    | 北京      |  9000.00 |
|  5 | 张三      | male   |   24 | 教学部    | 河北省    |  6000.00 |
|  6 | 李四      | male   |   32 | 保安部    | 北京      | 12000.00 |
|  7 | 王五      | male   |   38 | 教学部    | 河北省    |  7000.00 |
|  8 | 赵六      | male   |   19 | 保安部    | 河北省    |  9000.00 |
|  9 | 猪七      | female |   24 | 保洁部    | 北京      |  9000.00 |
+----+-----------+--------+------+-----------+-----------+----------+
rows in set (0.00 sec)

 

6.2 where字句过滤查询

  

-- where字句中可以使用:

         -- 比较运算符:
                        > < >= <= <> !=
                        between 80 and 100 值在10到20之间
                        in(80,90,100) 值是10或20或30
                        like yuan%
                        /*
                        pattern可以是%或者_,
                        如果是%则表示任意多字符,此例如唐僧,唐国强
                        如果是_则表示一个字符唐_,只有唐僧符合。两个_则表示两个字符:__
                        */

         -- 逻辑运算符
                        在多个条件直接可以使用逻辑运算符 and or not

 

示例:

技术分享
-- 查询年纪大于24的员工
SELECT * FROM emp WHERE age>24;

-- 查询教学部的男老师信息
SELECT * FROM emp WHERE dep="教学部" AND gender="male";
View Code

 

6.3 order排序

按指定的列进行,排序的列即可是表中的列名,也可以是select语句后指定的别名。

-- 语法:

select *|field1,field2... from tab_name order by field [Asc|Desc]

         -- Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。

示例:

技术分享
-- 按年龄从高到低进行排序
SELECT * FROM emp ORDER BY age DESC ;

-- 按工资从低到高进行排序
SELECT * FROM emp ORDER BY salary;
View Code

6.4 group by分组查询

GROUP BY 语句根据某个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG等函数进行相关查询。

-- 语法:
  SELECT column_name, function(column_name)
        FROM table_name
        WHERE column_name operator value
        GROUP BY column_name;
示例:
 1 -- 查询男女员工各有多少人
 2  
 3 SELECT gender 性别,count(*) 人数 FROM emp5 GROUP BY gender;
 4  
 5 -- 查询各个部门的人数
 6  
 7 SELECT dep 部门,count(*) 人数 FROM emp5 GROUP BY dep;
 8  
 9 -- 查询每个部门最大的年龄
10  
11 SELECT dep 部门,max(age) 最大年纪 FROM emp5 GROUP BY dep;
12  
13 -- 查询每个部门年龄最大的员工姓名
14  
15 SELECT * FROM emp5 WHERE age in (SELECT max(age) FROM emp5 GROUP BY dep);
16  
17 -- 查询每个部门的平均工资
18  
19 SELECT dep 部门,avg(salary) 最大年纪 FROM emp GROUP BY dep;
20  
21 --  查询教学部的员工最高工资:
22  
23 SELECT dep,max(salary) FROM emp11 GROUP BY dep HAVING dep="教学部";
24  
25 -- 查询平均薪水超过8000的部门
26  
27 SELECT dep,AVG(salary) FROM  emp GROUP BY dep HAVING avg(salary)>8000;
28  
29 --  查询每个组的员工姓名
30 SELECT dep,group_concat(name) FROM emp GROUP BY dep;
31  
32 -- 查询公司一共有多少员工(可以将所有记录看成一个组)
33  
34 SELECT COUNT(*) 员工总人数 FROM emp;
35  
36                   -- KEY: 查询条件中的每个后的词就是分组的字段

 

6.6 limit记录条数限制

SELECT * from ExamResult limit 1;
SELECT * from ExamResult limit 2,5;        --  跳过前两条显示接下来的五条纪录
SELECT * from ExamResult limit 2,2;

6.7 正则表达式

SELECT * FROM employee WHERE emp_name REGEXP ^yu;

SELECT * FROM employee WHERE emp_name REGEXP yun$;

SELECT * FROM employee WHE                    

人气教程排行