MySQL-基础-数据库和数据表

#一 数据库
#####常用语句

-查看所有库
    SHOW DATABASES;

-使用数据库
    USE 数据库名

-查看当前所在数据库
    SELECT DATABASE();

-查看当前时间、用户名、数据库版本
    SELECT now(), user(), version();

-查看库默认字符集
    SHOW CREATE DATABASE 数据库名

-创建库
    CREATE DATABASE 数据库名

-创建库指定字符集
    CREATE DATABASE 数据库名 DEFAULT CHARSET 字符集名

-修改库的选项信息
    ALTER DATABASE 库名 选项信息

-删除库,同时删除该数据库相关的目录及其目录内容
    DROP DATABASE 数据库名

#二 数据表
#####常用语句

-查看所有表
    SHOW TABLES;

-查看表结构
    DESC 表名;

-查看表的全部内容
    SELECT * FROM 表名;

-查看表里指定字段内容
    SELECT 字段名,字段名 FROM 表名;

-查看创建表的语句
    SHOW CREATE TABLE 表名\G

-人性化输出表里的内容
    SELECT * FROM 表名\G;

-查看表的状态
    SHOW TABLE STATUS LIKE '表名'\G

-修改表名称
    方式一:RENAME TABLE 旧表名 TO 新表名;
    方式二:ALTER TABLE 旧表名 RENAME 新表名;

-使用edit(\e)编辑
    mysql> \e  调用vim模式敲内容,在里面结尾的时候不加分号,保存退出之后在加“;”
    -> ;

-删除表
    DROP TABLE 表名;

-创建表
    语法:create table 表名
    (字段名1 类型(宽度) 约束条件,
    字段名2 类型(宽度) 约束条件,
    字段名3 类型(宽度) 约束条件)
    存储引擎 字符集;

-在同一张表中,字段名是不能相同
-宽度和约束条件可选
-字段名和类型是必须的
-存储引擎和字符集可选

    mysql> CREATE TABLE list
    (name varchar(30),
    age int,
    gender varchar(30)
    );

-表中添加数据
    INSERT INTO list (name,age,gender) VALUES ('xiaoming',18,'nan');
    INSERT INTO list(字段name,字段age,字段gender) VALUES (数据'xiaoming',数据18,数据'nan');

###1. 表的数据类型
#####1. 整型

int(M)[UNSIGNED][ZEROFILL]
             UNSIGNED 表示符号
             ZEROFILL   表示不够的位使用 0 填充
          number  int(2)  UNSIGNED  ZEROFILL 
         number 的值假如你存1,显示的时候不够 2 位,就会使用 0 填充,变成 02
            整数,数据类型用于保存一些范围的整数数值范围:
                有符号:
                    -2147483648 ~ 2147483647
                无符号:
                    0 ~ 4294967295


作用:用于存储用户的年龄、游戏的Level、经验值等。
分类:tinyint smallint mediumint int bigint
常用的是int
显示宽度:类型后面小括号内的数字是显示宽度,不能限制插入数值的大小
比如:int(2)      2是显示宽度
结论:整形的宽度仅为显示宽度,不是限制。因此建议整形无须指定宽度。

#####2. 浮点数类型 FLOAT DOUBLE

FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
            单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
                无符号:
                    -3.402823466E+38 to -1.175494351E-38,
                    0
                    1.175494351E-38 to 3.402823466E+38
                有符号:
                    0
                    1.175494351E-38 to 3.402823466E+38
            **** 数值越大,越不准确 ****


作用:用于存储用户的身高、体重、薪水等
float(5.3) #一共5位,小数占3位.做了限制
mysql> create table test4(float_test float(5,2)); #案例
宽度不算小数点
-*定点数类型 DEC*
定点数在MySQL内部以字符串形式存储,比浮点数更精确,适合用来表示货币等精度高的数据。

#####3. 字符串类型

char(m)        char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
 PS: 即使数据小于m长度,也会占用m长度

varchar(m)     varchars数据类型用于变长的字符串,可以包含最多达255个字符。其中m代表该数据类型所允许保
存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。
 注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至
可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡。


作用:用于存储用户的姓名、爱好、发布的文章等
字符类型 char varchar --存字符串
char(10) 根据10,占10个.
列的长度固定为创建表时声明的长度: 0 ~ 255
varchar(10) 根据实际字符串长度占空间,最多10个
列中的值为可变长字符串,长度: 0 ~ 65535
1.经常变化的字段用varchar
2.知道固定长度的用char
3.尽量用varchar
4.超过255字符的只能用varchar或者text
5.能用varchar的地方不用text


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.

#####4. 枚举类型 enum

mysql> create table t101(name enum('tom','jim'));
只能从tom,jim两个里面2选其1
(enumeration)
有限制的时候用枚举


/* 定义数据库列时,可以使用Enum(Enumeration,枚举)和SET(集合)类型:变通的实现CHECK约束

两者的区别是:

  使用Enum,只能选一个值;

  使用SET,可以选多个值;

Enum和SET中的值都必须是字符串类型。

注意:

  在内部存储Enum值时,MYSQL给Enum中的每个值一个顺序号码:第一个值的顺序号码是1,第二个值的顺
序号码是2,以此类推。当排序或比较Enum的时候,使用这些顺序号码进行。
*/

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');

#####5. 日期类型

===时间和日期类型测试:year、date、time、datetime、timestamp
作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等
注意事项:
==插入年份时,尽量使用4位值
==插入两位年份时,<=69,以20开头,比如65, 结果2065
>=70,以19开头,比如82,结果1982


字段类型: DATE
表现形式: YYYY-MM-DD
取值范围: 1000-01-01/9999-12-31
创建方法: 字段名 DATE
添加数据: values("20191010")
查询到的结果: 2019-10-10

DATE:                 YYYY-MM-DD(1000-01-01/9999-12-31)

TIME:                 HH:MM:SS('-838:59:59'/'838:59:59')

YEAR:                 YYYY(1901/2155)

DATETIME:             YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)


TIMESTAMP:            YYYYMMDD HHMMSS(1970-01-01 00:00:00/2038-01-19 11:14:07)

--insert时和update时若不指定updated值,则插入当前时间

###2.约束
#####表完整性约束
作用:用于保证数据的完整性和一致性

约束条件 说明
PRIMARY KEY (PK)         标识该字段为该表的主键,可以唯一的标识记录,不可以为空 UNIQUE +NOT NULL
FOREIGN KEY (FK)         标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联
NULL                     标识是否允许为空,默认为NULL。
NOT NULL                 标识该字段不能为空,可以修改。
UNIQUE KEY (UK)          标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
AUTO_INCREMENT           标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT                  为该字段设置默认值
UNSIGNED                 无符号,正数

1.主键
每张表里只能有一个主键,不能为空,而且唯一。
定义两种方式:
    mysql> create table t7(hostname char(20) primary key,ip char(150));
    mysql> create table t9(hostname char(20),ip char(150),primary key(hostname));
删除主键
    mysql> alter table t7 drop primary key;

索引:当查询速度过慢可以通过建立优化查询速度,可以当作调优
创建索引:两种
mysql> create table t100(hostname char(20) primary key,ip char(150),index (ip));
mysql> create table t101(hostname char(20) primary key,ip char(150),index dizhi(ip));
#给ip做的索引,名字叫dizhi

2.自增
auto_increment,每张表只能有一个字段为自增 ,成了key才可以自动增长
    mysql> CREATE TABLE department3 (
        -> dept_id INT PRIMARY KEY AUTO_INCREMENT,
        -> dept_name VARCHAR(30),
        -> comment VARCHAR(50)
        -> );
3.唯一约束
UNIQUE 标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
    mysql> CREATE TABLE department2 (
        -> dept_id INT,
        -> dept_name VARCHAR(30) UNIQUE,
        -> comment VARCHAR(50)
        -> );
4.字符集
在创建表的最后面指定: default charset=utf8 可以指定中文
——————————————————————————————————————————————————————————————————————————————————————————————————————————
是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值

字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值

sex enum('male','female') not null default 'male' #只能选择maie和female,不允许为空,默认是male

age int unsigned NOT NULL default 20 #必须为正值(无符号) 不允许为空 默认是20

#####表查询

-单表指定字段查询
    select 字段1,字段2 from 表名;

-多表查询
    select t1.name, t2.name                   查询t1的name列和t2的name列
    from t1, t2                               来自表t1和t2
    where t1.id = t2.class_id                 条件t1的id列等于t2的class_id列
    and t1.name='xiaohong';                   只打印t1表name列是xiaohong的信息

-条件查询
    select 字段 from 表名 where 条件;
    =等于 !=不等于

-现在有个表list
    +----------+------+--------+
    | name     | age  | gender |
    +----------+------+--------+
    | xiaoming |   18 | nan    |
    | xiaohong |   18 | nv     |
    | dahong   |   28 | nv     |
    | daming   |   28 | nan    |
    +----------+------+--------+

#####WHERE条件

1 关键字 BETWEEN AND 什么和什么之间   
    mysql> SELECT name,age FROM list WHERE age 
    BETWEEN 18 AND 60;
    mysql> SELECT name,age FROM list WHERE age NOT BETWEEN 18 AND 60;
    mysql> SELECT name,age FROM list WHERE NOT age>18;
    注:not 给条件取反

2 关键字IS NULL 空的
    mysql> SELECT name,age FROM list WHERE gender IS NULL;
    mysql> SELECT name,age FROM list WHERE gender IS NOT NULL;
    mysql> SELECT name,age FROM list WHERE gender=' '; 什么都没有==空

NULL说明:
-等价于没有任何值、是未知数。
-NULL与0、空字符串、空格都不同,NULL没有分配存储空间。
-对空值做加、减、乘、除等运算操作,结果仍为空。
-比较时使用关键字用“is null”和“is not null”。
-排序时比其他数据都小(索引默认是降序排列,小→大),所以NULL值总是排在最前。

3 关键字IN集合查询
    一般查询:
    mysql> SELECT name,age FROM list WHERE age=18 or age=28 or age=38;
    IN集合查询:
    mysql> SELECT name,age FROM list WHERE age IN (18,28,38);
    mysql> SELECT name,age FROM list WHERE age NOT IN (18,28,38);

4 排序查询 order by :命令指令,在mysql是排序的意思。
    mysql> SELECT name,age FROM list ORDER BY age; 默认从小到大排序
    mysql> SELECT name,age FROM list ORDER BY age DESC; 降序,从大到小

5 limit 限制
    mysql> SELECT * list limit 5; 只显示前5行
    mysql> SELECT name,age FROM list ORDER BY age limit 0,1; 从第几行开始,打印几行
注意:
0------默认第一行
1------第二行 依次类推...
    mysql> SELECT name,age FROM list ORDER BY age DESC LIMIT 0,5; 降序,打印前5行
    mysql> SELECT name,age FROM list ORDER BY age DESC LIMIT 4,5; 从第5行开始,共打印5行
    mysql> SELECT name,age FROM list ORDER BY age DESC LIMIT 4,3; 从第5行开始,共打印3行

6 分组查询 :group by
    mysql> SELECT count(name),gender from list group by gender;
+-------------+--------+
| count(name) | gender |
+-------------+--------+
|           2 | nan    |
|           2 | nv     |
+-------------+--------+

count可以计算字段里面有多少条记录,如果分组会分组做计算
    mysql> SELECT COUNT(name),GROUP_CONCAT(name) FROM list WHERE age>18;
    查找 统计(条件:age大于18)的有几个人(count(name)),分别是谁(group_concat(name))
+-------------+--------------------+
| COUNT(name) | GROUP_CONCAT(name) |
+-------------+--------------------+
|           2 | dahong,daming      |
+-------------+--------------------+

7 GROUP BY和GROUP_CONCAT()函数一起使用
  GROUP_CONCAT()-------组连接
    mysql> SELECT gender,GROUP_CONCAT(name) FROM list GROUP BY gender;
    以gender分的组,gender这个组里面都有谁
+--------+--------------------+
| gender | GROUP_CONCAT(name) |
+--------+--------------------+
| nan    | xiaoming,daming    |
| nv     | xiaohong,dahong    |
+--------+--------------------+
    mysql> SELECT gender,GROUP_CONCAT(name) AS name FROM list GROUP BY gender;
    给组连接设置了一个别名name
+--------+-----------------+
| gender | name            |
+--------+-----------------+
| nan    | xiaoming,daming |
| nv     | xiaohong,dahong |
+--------+-----------------+

8 函数
-查看age最大
    mysql> SELECT MAX(age) FROM list;
+----------+
| MAX(age) |
+----------+
|       28 |
+----------+
-查询age最大的人的详细信息:
    mysql> SELECT * FROM list where age=(SELECT MAX(age) FROM list);
+--------+------+--------+
| name   | age  | gender |
+--------+------+--------+
| dahong |   28 | nv     |
| daming |   28 | nan    |
+--------+------+--------+
-min()最小值:
    mysql> SELECT MIN(age) FROM list;
-avg()平均值:
    mysql> SELECT AVG(age) FROM list;
-sum() 计算和:
    mysql> SELECT SUM(age) FROM list;
-now() 现在的时间:
    SELECT NOW();

9 多条件查询: and ----和
语法: select 字段 from 表名 where 条件 and where 条件;
-查看gender是nan和age大于18的详细信息
    mysql> SELECT * FROM list WHERE gender='nan' AND age>18;
+--------+------+--------+
| name   | age  | gender |
+--------+------+--------+
| daming |   28 | nan    |
+--------+------+--------+
-查看gender是nan和age大于18的name字段和age字段
    mysql> SELECT name,age FROM list WHERE gender='nan' AND age>18;

10 多条件查询: or ----或者
语法:select 字段 from 表名 where 条件 or 条件;
-查看age大于18和gender=nan的name字段
    mysql> SELECT name FROM list WHERE age>18 OR gender='nan';
+----------+
| name     |
+----------+
| xiaoming |
| dahong   |
| daming   |
+----------+
发布了92 篇原创文章 · 获赞 0 · 访问量 1438

猜你喜欢

转载自blog.csdn.net/Forgetfanhua/article/details/105249286